]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
lib/commonio: make lock failures more detailed
authorLuca BRUNO <luca.bruno@coreos.com>
Mon, 29 Aug 2022 12:35:07 +0000 (12:35 +0000)
committerSerge Hallyn <serge@hallyn.com>
Thu, 15 Sep 2022 15:31:13 +0000 (10:31 -0500)
This tweaks the database locking logic so that failures in the
link-checking paths are more detailed.
The rationale for this is that I've experienced a non-deterministic
bug which seems to be coming from this logic, and I'd like to get
more details about the actual failing condition.

lib/commonio.c

index 80288d64498c2ff4e030aae5207167191851809e..f7fb1597181772cc56532ac2e4483622eacd435c 100644 (file)
@@ -32,7 +32,7 @@
 
 /* local function prototypes */
 static int lrename (const char *, const char *);
-static int check_link_count (const char *file);
+static int check_link_count (const char *file, bool log);
 static int do_lock_file (const char *file, const char *lock, bool log);
 static /*@null@*/ /*@dependent@*/FILE *fopen_set_perms (
        const char *name,
@@ -93,15 +93,25 @@ int lrename (const char *old, const char *new)
        return res;
 }
 
-static int check_link_count (const char *file)
+static int check_link_count (const char *file, bool log)
 {
        struct stat sb;
 
        if (stat (file, &sb) != 0) {
+               if (log) {
+                       (void) fprintf (shadow_logfd,
+                                       "%s: %s file stat error: %s\n",
+                                       shadow_progname, file, strerror (errno));
+               }
                return 0;
        }
 
        if (sb.st_nlink != 2) {
+               if (log) {
+                       (void) fprintf (shadow_logfd,
+                                       "%s: %s: lock file already used (nlink: %u)\n",
+                                       shadow_progname, file, sb.st_nlink);
+               }
                return 0;
        }
 
@@ -153,12 +163,7 @@ static int do_lock_file (const char *file, const char *lock, bool log)
        close (fd);
 
        if (link (file, lock) == 0) {
-               retval = check_link_count (file);
-               if ((0==retval) && log) {
-                       (void) fprintf (shadow_logfd,
-                                       "%s: %s: lock file already used\n",
-                                       shadow_progname, file);
-               }
+               retval = check_link_count (file, log);
                unlink (file);
                return retval;
        }
@@ -219,12 +224,7 @@ static int do_lock_file (const char *file, const char *lock, bool log)
 
        retval = 0;
        if (link (file, lock) == 0) {
-               retval = check_link_count (file);
-               if ((0==retval) && log) {
-                       (void) fprintf (shadow_logfd,
-                                       "%s: %s: lock file already used\n",
-                                       shadow_progname, file);
-               }
+               retval = check_link_count (file, log);
        } else {
                if (log) {
                        (void) fprintf (shadow_logfd,