我有一个通用的文件获取器C程序,在shell上运行时可以完美运行,但在转换为CGI脚本并运行相同的程序后,崩溃了
curl = curl_easy_init();
我再说一遍,这在shell模式下工作得很好,我得到了我想要的文件,但是在CGI中它只是崩溃了脚本。
编辑:这是脚本中断后的Apache日志。
malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
好的,所以这些是我从表单中读取POST数据的初始化。
len = atoi((char *) getenv("CONTENT_LENGTH"));
posted = malloc(len + 1);
decoded = malloc(len + 100); // Currently for pics only 10 * 10 pics
//fgets(data, length, stdin);
fread(posted, len, 1, stdin); // rawdata contains standard input coming from HTTP POST
printf("POST: %s\n", posted);
decode_post_keys_(posted, decoded, len+100); // Decode POST values
printf("DECODED: %s\n", decoded);
decode_value("id=", value, MAX_LEN);
当我正在阅读某个选项时程序退出,这是一个YouTube网址,我通过该网址运行一个获取mp4文件的程序。
printf("Video url: %s\n", row[0]);
/** Get the video ID from the string "v=" */
decode_value_post("v=", value, "http://www.youtube.com/watch?v=acq8BvIhUTg", /*row[0],*/ MAX_URL);
//strcpy(value, "acq8BvIhUTg");
printf("YouTube video id: %s\n", value);
muxer.youtube_url[0] = '\0';
strcpy(muxer.youtube_url, "http://www.youtube.com/get_video_info?video_id =");
strcat(muxer.youtube_url, value);
muxer.youtube_url[strlen(muxer.youtube_url)+1] = '\0';
muxer.vid_filesize = get_youtube_file(muxer.youtube_url, &muxer); // This is where it fails
printf("FILE-SIZE: %d\n", muxer.vid_filesize);
因此,函数get_youtube_file的curl_easy_init()失败。
答案 0 :(得分:0)
好的找到了解决方案。我还没有发布另一个实际解码发布数据的函数。显然,变量没有足够的空间来容纳解码数据。我把它改进了5000以上,并且它有效。
size_t len = atol((char *) getenv("CONTENT_LENGTH"); // post data length
char *decoded = malloc(len + EXTRA);
decode_post_keys_(posted, decoded, len+EXTRA);
这很有用。 : - )