summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikola Pajkovsky <npajkovs@redhat.com>2010-09-10 11:07:33 +0200
committerNikola Pajkovsky <npajkovs@redhat.com>2010-09-10 11:39:27 +0200
commitc7129a09a31048dcca6b5913ac22c77ca3dc16ac (patch)
tree654b8480506d6e24c5fd82cfaee7ee2133cdf1cc
parenta73e1e09227d2d51fe48172ef2d25719fcf4b697 (diff)
downloadabrt-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.h2
-rw-r--r--lib/plugins/SQLite3.cpp14
-rw-r--r--lib/utils/database.c21
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)