If futimens(2) fails here then close(2) is not called and we leak the
descriptor.

I think futimens(2) and close(2) failures are exotic enough to warrant
printing the system call name.

ok?

Index: touch.c
===================================================================
RCS file: /cvs/src/usr.bin/touch/touch.c,v
retrieving revision 1.26
diff -u -p -r1.26 touch.c
--- touch.c     10 Mar 2019 15:11:52 -0000      1.26
+++ touch.c     27 Jan 2022 23:55:50 -0000
@@ -137,9 +137,18 @@ main(int argc, char *argv[])
 
                /* Create the file. */
                fd = open(*argv, O_WRONLY | O_CREAT, DEFFILEMODE);
-               if (fd == -1 || futimens(fd, ts) || close(fd)) {
+               if (fd == -1) {
                        rval = 1;
                        warn("%s", *argv);
+                       continue;
+               }
+               if (futimens(fd, ts) == -1) {
+                       warn("futimens %s", *argv);
+                       rval = 1;
+               }
+               if (close(fd) == -1) {
+                       warn("close %s", *argv);
+                       rval = 1;
                }
        }
        return rval;

Reply via email to