]> www.infradead.org Git - users/mchehab/rasdaemon.git/commitdiff
rasdaemon: fix error handling in ras_mc_event_opendb()
authorAristeu Rozanski <aris@redhat.com>
Tue, 7 Jan 2020 19:49:19 +0000 (14:49 -0500)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 5 Feb 2020 05:56:41 +0000 (06:56 +0100)
Found with covscan that the return value from ras_mc_prepare_stmt() and from
ras_mc_event_opendb() itself aren't checked.

Signed-off-by: Aristeu Rozanski <aris@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
ras-events.c
ras-record.c

index 511c93d656cfe4594fd46fa240dcd20bceb0ead4..5635278fe46a0756b1d61d36a5ff0a6f14cff3e4 100644 (file)
@@ -409,8 +409,10 @@ static int read_ras_event_all_cpus(struct pthread_data *pdata,
        }
 
        log(TERM, LOG_INFO, "Listening to events for cpus 0 to %d\n", n_cpus - 1);
-       if (pdata[0].ras->record_events)
-               ras_mc_event_opendb(pdata[0].cpu, pdata[0].ras);
+       if (pdata[0].ras->record_events) {
+               if (ras_mc_event_opendb(pdata[0].cpu, pdata[0].ras))
+                       goto error;
+       }
 
        do {
                ready = poll(fds, (n_cpus + 1), -1);
@@ -584,8 +586,15 @@ static void *handle_ras_events_cpu(void *priv)
        }
 
        log(TERM, LOG_INFO, "Listening to events on cpu %d\n", pdata->cpu);
-       if (pdata->ras->record_events)
-               ras_mc_event_opendb(pdata->cpu, pdata->ras);
+       if (pdata->ras->record_events) {
+               if (ras_mc_event_opendb(pdata->cpu, pdata->ras)) {
+                       log(TERM, LOG_ERR, "Can't open database\n");
+                       close(fd);
+                       kbuffer_free(kbuf);
+                       free(page);
+                       return 0;
+               }
+       }
 
        read_ras_event(fd, pdata, kbuf, page);
 
index 318baceeb2315903f4dec2fe1ccb5a74b057e831..549c494f01af7d7519aeb7d76eabe128a25373c8 100644 (file)
@@ -713,8 +713,7 @@ int ras_mc_event_opendb(unsigned cpu, struct ras_events *ras)
                log(TERM, LOG_ERR,
                    "cpu %u: Failed to initialize sqlite: error = %d\n",
                    cpu, rc);
-               free(priv);
-               return -1;
+               goto error;
        }
 
        do {
@@ -730,66 +729,93 @@ int ras_mc_event_opendb(unsigned cpu, struct ras_events *ras)
                log(TERM, LOG_ERR,
                    "cpu %u: Failed to connect to %s: error = %d\n",
                    cpu, SQLITE_RAS_DB, rc);
-               free(priv);
-               return -1;
+               goto error;
        }
        priv->db = db;
 
        rc = ras_mc_create_table(priv, &mc_event_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_mc_event,
                                         &mc_event_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 
 #ifdef HAVE_AER
        rc = ras_mc_create_table(priv, &aer_event_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_aer_event,
                                         &aer_event_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 #endif
 
 #ifdef HAVE_EXTLOG
        rc = ras_mc_create_table(priv, &extlog_event_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_extlog_record,
                                         &extlog_event_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 #endif
 
 #ifdef HAVE_MCE
        rc = ras_mc_create_table(priv, &mce_record_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_mce_record,
                                         &mce_record_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 #endif
 
 #ifdef HAVE_NON_STANDARD
        rc = ras_mc_create_table(priv, &non_standard_event_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_non_standard_record,
                                        &non_standard_event_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 #endif
 
 #ifdef HAVE_ARM
        rc = ras_mc_create_table(priv, &arm_event_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_arm_record,
                                        &arm_event_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 #endif
 #ifdef HAVE_DEVLINK
        rc = ras_mc_create_table(priv, &devlink_event_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_devlink_event,
                                        &devlink_event_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 #endif
 
 #ifdef HAVE_DISKERROR
        rc = ras_mc_create_table(priv, &diskerror_event_tab);
-       if (rc == SQLITE_OK)
+       if (rc == SQLITE_OK) {
                rc = ras_mc_prepare_stmt(priv, &priv->stmt_diskerror_event,
                                        &diskerror_event_tab);
+               if (rc != SQLITE_OK)
+                       goto error;
+       }
 #endif
 
-               ras->db_priv = priv;
+       ras->db_priv = priv;
        return 0;
+
+error:
+       free(priv);
+       return -1;
 }
 
 int ras_mc_event_closedb(unsigned int cpu, struct ras_events *ras)