[hackers] [sbase] touch: Use special UTIME_NOW and UTIME_OMIT values || Michael Forney

From: <git_AT_suckless.org>
Date: Sat, 9 Jul 2016 11:17:21 +0200 (CEST)

commit 2e5f1281ed4c5f16b9510263ecd05a3755de052f
Author: Michael Forney <mforney_AT_mforney.org>
AuthorDate: Fri Jul 8 10:24:13 2016 -0700
Commit: sin <sin_AT_2f30.org>
CommitDate: Sat Jul 9 10:17:16 2016 +0100

    touch: Use special UTIME_NOW and UTIME_OMIT values
    
    This allows users to touch files they have write access to, but aren't the
    owner.
    
    Also, remove utime.h include (not necessary since
    4132561c1729df9440a6ae2566a0cccadcccf860), and make sure to check the return
    value of localtime (potentially preventing a NULL pointer derefence).

diff --git a/touch.c b/touch.c
index 0e8c413..a187241 100644
--- a/touch.c
+++ b/touch.c
_AT_@ -7,14 +7,13 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
-#include <utime.h>
 
 #include "util.h"
 
 static int aflag;
 static int cflag;
 static int mflag;
-static struct timespec times[2];
+static struct timespec times[2] = {{.tv_nsec = UTIME_NOW}};
 
 static void
 touch(const char *file)
_AT_@ -28,10 +27,6 @@ touch(const char *file)
                 if (cflag)
                         return;
         } else {
- if (!aflag)
- times[0] = st.st_atim;
- if (!mflag)
- times[1] = st.st_mtim;
                 if (utimensat(AT_FDCWD, file, times, 0) < 0)
                         eprintf("utimensat %s:", file);
                 return;
_AT_@ -45,14 +40,18 @@ touch(const char *file)
 }
 
 static time_t
-parsetime(char *str, time_t current)
+parsetime(char *str)
 {
+ time_t now;
         struct tm *cur, t = { 0 };
         int zulu = 0;
         char *format;
         size_t len = strlen(str);
 
- cur = localtime(&current);
+ if ((now = time(NULL)) == -1)
+ eprintf("time:");
+ if (!(cur = localtime(&now)))
+ eprintf("localtime:");
         t.tm_isdst = -1;
 
         switch (len) {
_AT_@ -116,7 +115,6 @@ main(int argc, char *argv[])
 {
         struct stat st;
         char *ref = NULL;
- clock_gettime(CLOCK_REALTIME, &times[0]);
 
         ARGBEGIN {
         case 'a':
_AT_@ -127,7 +125,8 @@ main(int argc, char *argv[])
                 break;
         case 'd':
         case 't':
- times[0].tv_sec = parsetime(EARGF(usage()), times[0].tv_sec);
+ times[0].tv_sec = parsetime(EARGF(usage()));
+ times[0].tv_nsec = 0;
                 break;
         case 'm':
                 mflag = 1;
_AT_@ -141,6 +140,7 @@ main(int argc, char *argv[])
                 break;
         case 'T':
                 times[0].tv_sec = estrtonum(EARGF(usage()), 0, LLONG_MAX);
+ times[0].tv_nsec = 0;
                 break;
         default:
                 usage();
_AT_@ -152,6 +152,10 @@ main(int argc, char *argv[])
                 aflag = mflag = 1;
         if (!ref)
                 times[1] = times[0];
+ if (!aflag)
+ times[0].tv_nsec = UTIME_OMIT;
+ if (!mflag)
+ times[1].tv_nsec = UTIME_OMIT;
 
         for (; *argv; argc--, argv++)
                 touch(*argv);
Received on Sat Jul 09 2016 - 11:17:21 CEST

This archive was generated by hypermail 2.3.0 : Sat Jul 09 2016 - 11:24:37 CEST