diff options
author | Nikola Pajkovsky <npajkovs@redhat.com> | 2010-09-10 11:07:33 +0200 |
---|---|---|
committer | Nikola Pajkovsky <npajkovs@redhat.com> | 2010-09-10 11:39:27 +0200 |
commit | c7129a09a31048dcca6b5913ac22c77ca3dc16ac (patch) | |
tree | 654b8480506d6e24c5fd82cfaee7ee2133cdf1cc | |
parent | a73e1e09227d2d51fe48172ef2d25719fcf4b697 (diff) | |
download | abrt-c7129a09a31048dcca6b5913ac22c77ca3dc16ac.tar.gz abrt-c7129a09a31048dcca6b5913ac22c77ca3dc16ac.tar.xz abrt-c7129a09a31048dcca6b5913ac22c77ca3dc16ac.zip |
fix sigsegv
copy struct with char* lead to sigsegv. each
char* needs to be duplicate.
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
-rw-r--r-- | inc/database.h | 2 | ||||
-rw-r--r-- | lib/plugins/SQLite3.cpp | 14 | ||||
-rw-r--r-- | lib/utils/database.c | 21 |
3 files changed, 34 insertions, 3 deletions
diff --git a/inc/database.h b/inc/database.h index 5d5bcf04..679e009a 100644 --- a/inc/database.h +++ b/inc/database.h @@ -54,6 +54,8 @@ void db_row_free(struct db_row *row); void db_list_free(GList *list); +struct db_row *db_rowcpy_from_list(GList* list); + #ifdef __cplusplus } #endif diff --git a/lib/plugins/SQLite3.cpp b/lib/plugins/SQLite3.cpp index 040314fe..4af24c31 100644 --- a/lib/plugins/SQLite3.cpp +++ b/lib/plugins/SQLite3.cpp @@ -123,7 +123,7 @@ static GList *vget_table(sqlite3 *db, const char *fmt, va_list p) VERB2 log("%s: %d rows returned by SQL:%s", __func__, nrow, sql); free(sql); - if (ncol < NUM_COL) + if (nrow > 0 && ncol < NUM_COL) error_msg_and_die("Unexpected number of columns: %d", ncol); GList *rows = NULL; @@ -147,6 +147,15 @@ static GList *vget_table(sqlite3 *db, const char *fmt, va_list p) case 7: row->db_message = xstrdup(val); break; } } + + VERB3 log("%s: row->db_uuid = '%s'", __func__, row->db_uuid); + VERB3 log("%s: row->db_uid = '%s'", __func__, row->db_uid); + VERB3 log("%s: row->db_inform_all = '%s'", __func__, row->db_inform_all); + VERB3 log("%s: row->db_dump_dir = '%s'", __func__, row->db_dump_dir); + VERB3 log("%s: row->db_count = '%s'", __func__, row->db_count); + VERB3 log("%s: row->db_reported = '%s'", __func__, row->db_reported); + VERB3 log("%s: row->db_time = '%s'", __func__, row->db_time); + VERB3 log("%s: row->db_message = '%s'", __func__, row->db_message); rows = g_list_append(rows, row); } @@ -665,8 +674,7 @@ struct db_row *CSQLite3::GetRow(const char *crash_id) } GList *first = g_list_first(table); - struct db_row *row = (struct db_row*)xzalloc(sizeof(struct db_row)); - memcpy(row, first->data, sizeof(struct db_row)); + struct db_row *row = db_rowcpy_from_list(first); db_list_free(table); diff --git a/lib/utils/database.c b/lib/utils/database.c index f572a5ba..2b742ebf 100644 --- a/lib/utils/database.c +++ b/lib/utils/database.c @@ -20,6 +20,27 @@ #include "abrtlib.h" #include "database.h" +struct db_row *db_rowcpy_from_list(GList* list) +{ + GList *first = g_list_first(list); + struct db_row *row = (struct db_row*)xzalloc(sizeof(struct db_row)); + struct db_row *src_row = (struct db_row*)first->data; + /* All fields are initialized below, copying is not needed + * memcpy(row, (struct db_row*)first->data, sizeof(struct db_row)); + */ + + row->db_uuid = xstrdup(src_row->db_uuid); + row->db_uid = xstrdup(src_row->db_uid); + row->db_inform_all = xstrdup(src_row->db_inform_all); + row->db_dump_dir = xstrdup(src_row->db_dump_dir); + row->db_count = xstrdup(src_row->db_count); + row->db_reported = xstrdup(src_row->db_reported); + row->db_message = xstrdup(src_row->db_message); + row->db_time = xstrdup(src_row->db_time); + + return row; +} + void db_row_free(struct db_row *row) { if (!row) |