Fix segfault caused by ejdbopen 91/159191/3
authorKonrad Kuchciak <k.kuchciak@samsung.com>
Tue, 7 Nov 2017 09:58:13 +0000 (10:58 +0100)
committerKonrad Kuchciak <k.kuchciak@samsung.com>
Thu, 9 Nov 2017 14:54:53 +0000 (15:54 +0100)
When power cut occurs or faultd is killed with -9 signal, database
doesn't close properly. In this situation faultd crashes during next
launch. This problem can be solved by removing
/var/db/faultd/faultdb_log.wal file before trying to open database
again.

Change-Id: Ibbc1ac1a618e8df19cf0e63667fe82207fdbb7b5
Signed-off-by: Konrad Kuchciak <k.kuchciak@samsung.com>
src/database/ejdb.c

index 577da6b29463fd8741d972aff9dcd0af567c8880..a8db8702298af08bb519d86e462c18ce449f6324 100644 (file)
@@ -72,6 +72,19 @@ static int init_ejdb_adapter(struct faultd_module *module,
                goto error;
        }
 
+       /* when faultdb_log.wal file exists, ejdbopen() will cause segfault */
+       ret = access(DBDIR "/faultdb_log.wal", F_OK);
+       if (ret == 0) {
+               log_error("Database was not closed properly. "
+                                 "Removing faultdb_log.wal before opening database again");
+
+               ret = unlink(DBDIR "/faultdb_log.wal");
+               if (ret != 0) {
+                       log_error_errno(errno, "Unable to remove faultdb_log.wal");
+                       goto error;
+               }
+       }
+
        if (!ejdbopen(da->db, DBDIR "/faultdb", JBOWRITER | JBOCREAT | JBOTSYNC)) {
                log_error("ejdbopen has failed: %s", ejdberrmsg(ejdbecode(da->db)));
                goto error;