]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
liblastlog2: Improved sqlite3 error handling
authorStefan Schubert <schubi@suse.de>
Wed, 21 Feb 2024 12:09:52 +0000 (13:09 +0100)
committerStefan Schubert <schubi@suse.de>
Wed, 21 Feb 2024 12:09:52 +0000 (13:09 +0100)
liblastlog2/src/lastlog2.c

index 744d41f1aaae43bb160b8c3115d4db36a51e5845..cafcb017ee46d255e0a84f033f203e04e650dcbc 100644 (file)
@@ -185,10 +185,17 @@ read_entry(sqlite3 *db, const char *user,
                                        goto out_read_entry;
                                }
                }
-       } else {
+       } else if (step == SQLITE_DONE) {
+               retval = -ENOENT;
+       } else if (step == SQLITE_BUSY) {
                retval = -1;
                if (error)
-                       if (asprintf(error, "User '%s' not found (%d)", user, step) < 0)
+                       if ((*error = strdup ("Database busy")) == NULL)
+                               retval = -ENOMEM;
+       } else if (step == SQLITE_ERROR) {
+               retval = -1;
+               if (error)
+                       if (asprintf (error, "Error stepping through database: %s", sqlite3_errmsg (db)) < 0)
                                retval = -ENOMEM;
        }
 
@@ -298,11 +305,17 @@ write_entry(sqlite3 *db, const char *user,
 
        if (step != SQLITE_DONE) {
                retval = -1;
-               if (error)
-                       if (asprintf(error, "Delete statement did not return SQLITE_DONE: %d",
-                                    step) < 0)
-                               retval = -ENOMEM;
-               goto out_ll2_read_entry;
+               if (error) {
+                       if (step == SQLITE_ERROR) {
+                               if (asprintf (error, "Delete statement failed: %s",
+                                             sqlite3_errmsg (db)) < 0)
+                                       retval = -ENOMEM;
+                       } else {
+                               if (asprintf (error, "Delete statement did not return SQLITE_DONE: %d",
+                                             step) < 0)
+                                       retval = -ENOMEM;
+                       }
+               }
        }
 out_ll2_read_entry:
        if (res)
@@ -448,10 +461,17 @@ remove_entry(sqlite3 *db, const char *user, char **error)
 
        if (step != SQLITE_DONE) {
                retval = -1;
-               if (error)
-                       if (asprintf(error, "Delete statement did not return SQLITE_DONE: %d",
-                                    step) < 0)
-                               retval = -ENOMEM;
+               if (error) {
+                       if (step == SQLITE_ERROR) {
+                               if (asprintf (error, "Delete statement failed: %s",
+                                             sqlite3_errmsg (db)) < 0)
+                                       retval = -ENOMEM;
+                       } else {
+                               if (asprintf (error, "Delete statement did not return SQLITE_DONE: %d",
+                                             step) < 0)
+                                       retval = -ENOMEM;
+                       }
+               }
        }
 out_remove_entry:
        if (res)