我在嵌入式设备上运行了一些C代码,它在启动时初始化。该代码使用简单的名称/值表查询小型数据库。我注意到,在20年左右,代码无法运行,在添加一些日志记录后,我发现了以下消息:
user.info kernel: [ 47.983041] my_code[2237]: segfault at bf87601f ip b78b7115 sp bf8758f0 error 4 in libsqlite3.so.0.8.6[b7872000+51000]
处理数据库查询的函数是:
void my_db_query(char* my_setting, char* my_result)
{
sqlite3 *db;
if(sqlite3_open("/tmp/system.db", &db) != 0){
printf("Failed to Open DB\n");
}
char query_string[100];
memset(query_string, 0, 100);
char* query_one = "select value from setting where name=\"";
char* query_two = "\";";
char db_result[256];
int ret;
strcat(query_string, query_one);
strcat(query_string, my_setting);
strcat(query_string, query_two);
sqlite3_stmt* stmt;
ret = sqlite3_prepare_v2(db, query_string, 1000, &stmt, 0);
if (ret != SQLITE_OK ){
printf("Error preparing\n");
}
while (sqlite3_step(stmt) == SQLITE_ROW) {
strcpy(db_result,(char*)sqlite3_column_text(stmt, 0));
strncpy(my_result,db_result, strnlen(db_result, 256));
}
sqlite3_close(db);
}
我正在使用sqlite3版本3.6.11,我无法更改该版本,因为我没有权限。我们将非常感激地收到任何建议。
答案 0 :(得分:1)
所以看起来用strncpy(my_result,db_result, strnlen(db_result, 256));
替换行strcpy(my_result,db_result);
已经成功了,因为db_result
在复制之前没有归零。