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

fopen crashing in response to unrelated char buffer

本文关键字:缓冲区 崩溃 char 响应 不相关 fopen      更新时间:2023-10-16

所以我有一个C++函数,它接收一个字符串和一个标志,并根据标志将它们写入日志。在适当地填充将被写入文件的字符缓冲区之后,我调用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  */);
        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_STARTn");
        break;
    case BACKUP:
        sprintf(buffer, "BACKUP %s", source);
        break;
}
printf("fopen attemptn");
// Print buffer info for stackoverflow
printf("%sn", buffer);
print_mem(buffer, strlen(buffer));
if( (fhandle = fopen(log_file_name, "a") ) == NULL ){ // Randomly crashes
    rc = FILE_OPEN_ERROR;
}
else{
    printf("fopen successn");
    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有4176,或者大多数其他数字而不是120时,它就可以正常工作。

您没有为buffer分配足够的字符。因此,你最终会在内存上写下不应该写的内容,这会导致未定义的行为。

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

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

该格式说明符的需求是:

  1. st.wYear4字符
  2. st.wMonth2字符
  3. st.wDay2字符
  4. st.wMonth2字符
  5. st.wMinute2字符
  6. st.wSecond2字符
  7. 空间字符的1字符
  8. "1字符
  9. sourcestrlen(source)字符
  10. "1字符
  11. n1字符
  12. 1字符表示终止的空字符

您至少需要strlen(source) + 19个字符。

更改

buffer = (char*)calloc(1, strlen(source)+ 18);

buffer = (char*)calloc(strlen(source) + 19, 1);  // Make it 19 or higher.