fopen崩溃以响应不相关的char缓冲区

时间:2016-05-13 05:14:36

标签: c++ fopen

所以我有一个C ++函数,它接受一个字符串和一个标志,并根据该标志将它们写入日志。在适当填充将写入文件的char缓冲区后,我调用fopen。这个fopen基于某些随机输入一致地(大部分)崩溃。这是代码:

int log_command(char* source, int flag)
{

char *log_file_name = "db.log";
char *buffer = NULL;

int rc = 0;
SYSTEMTIME st;
FILE *fhandle = NULL;

switch(flag){
    case 0:
        buffer = (char*)calloc(1, strlen(source)+ 18/* 18: size for timestamp, quotes and \0 */);
        GetSystemTime(&st);
        sprintf(buffer, "%04d%02d%02d%02d%02d%02d \"%s\"\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, source);
        break;
    case ROLLFORWARD:
        sprintf(buffer, "RF_START\n");
        break;
    case BACKUP:
        sprintf(buffer, "BACKUP %s", source);
        break;
}

printf("fopen attempt\n");
// Print buffer info for stackoverflow
printf("%s\n", buffer);
print_mem(buffer, strlen(buffer));

if( (fhandle = fopen(log_file_name, "a") ) == NULL ){ // Randomly crashes
    rc = FILE_OPEN_ERROR;
}
else{
    printf("fopen success\n");
    if(info) printf("Logging to %s: \"%s\" \n", log_file_name, buffer);
    fwrite(buffer, strlen(buffer), 1, fhandle);
    fclose(fhandle);
}

return rc;
}

当缓冲区中包含以下文本时:

20160513050408 "insert into other values(120)"

和原始字节数据如:

32 30 31 36 30 35 31 33  30 35 30 34 30 38 20 22  20160513050408 "
69 6e 73 65 72 74 20 69  6e 74 6f 20 6f 74 68 65  insert into othe
72 20 76 61 6c 75 65 73  28 31 32 30 29 22 0a     r values(120)".

它会持续一段时间崩溃......然后只是在没有的地方工作。当* source有4,176或大多数任何其他数字而不是120时它可以正常工作。

1 个答案:

答案 0 :(得分:1)

您没有为buffer分配足够的字符。因此,你最终会写出你不应该写的内存,这会导致不确定的行为。

您在sprintf的调用中使用以下格式。

"%04d%02d%02d%02d%02d%02d \"%s\"\n"

该格式说明符的需求是:

    {li> 4 <{1}} 的字符 {li> st.wYear <{1}} 的字符 {li> 2 <{1}} 的字符 {li> st.wMonth <{1}} 的字符 {li> 2 <{1}} 的字符 {li> st.wDay <{1}} 的字符 空格字符的
  1. 2字符
  2. {li> st.wMonth 2 的字符 {li> st.wMinute <{1}} 的字符 {li> 2 st.wSecond 的字符 {li> 1 1 的字符 终止空字符的
  3. "字符。
  4. 您至少需要strlen(source)个字符。

    更改

    source

    1