fd-util: be more careful with fclose() errnos
authorLennart Poettering <lennart@poettering.net>
Tue, 2 Jun 2020 08:39:25 +0000 (10:39 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 27 Jul 2020 08:26:32 +0000 (10:26 +0200)
This might fix #15859, a bug which I find very puzzling.

(cherry picked from commit 75f6d5d87e950f62baced48fe9b58828969e3811)

src/basic/fd-util.c

index 4be876e24c8bd7452bba4cdacc1161d15ff26dca..de3f238d33556948dbf3bd4f6bb94c136e12a2d7 100644 (file)
@@ -102,13 +102,16 @@ int fclose_nointr(FILE *f) {
 
         /* Same as close_nointr(), but for fclose() */
 
+        errno = 0; /* Extra safety: if the FILE* object is not encapsulating an fd, it might not set errno
+                    * correctly. Let's hence initialize it to zero first, so that we aren't confused by any
+                    * prior errno here */
         if (fclose(f) == 0)
                 return 0;
 
         if (errno == EINTR)
                 return 0;
 
-        return -errno;
+        return errno_or_else(EIO);
 }
 
 FILE* safe_fclose(FILE *f) {