usign-exec: improve usign -F output handling
[oweals/ucert.git] / usign-exec.c
index c9aecf99f9c05965157b92732bdd865391c01ab4..482e51057124a883805c02aa72799233464acad2 100644 (file)
@@ -79,7 +79,7 @@ int usign_s(const char *msgfile, const char *seckeyfile, const char *sigfile, bo
        }
 
        waitpid(pid, &status, 0);
-       return WEXITSTATUS(status);
+       return WIFEXITED(status) ? WEXITSTATUS(status) : -1;
 }
 #else
 int usign_s(const char *msgfile, const char *seckeyfile, const char *sigfile, bool quiet) {
@@ -93,6 +93,7 @@ int usign_s(const char *msgfile, const char *seckeyfile, const char *sigfile, bo
  */
 static int usign_f(char fingerprint[17], const char *pubkeyfile, const char *seckeyfile, const char *sigfile, bool quiet) {
        int fds[2];
+       FILE *f;
        pid_t pid;
        int status;
        const char *usign_argv[16] = {0};
@@ -136,20 +137,27 @@ static int usign_f(char fingerprint[17], const char *pubkeyfile, const char *sec
                _exit(1);
        }
 
-       waitpid(pid, &status, 0);
-       status = WEXITSTATUS(status);
-       if (fingerprint && !WEXITSTATUS(status)) {
-               ssize_t r;
-               memset(fingerprint, 0, 17);
-               r = read(fds[0], fingerprint, 17);
-               if (r < 16)
-                       status = -1;
+       close(fds[1]);
 
-               fingerprint[16] = '\0';
+       waitpid(pid, &status, 0);
+       status = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
 
+       if (!fingerprint || status) {
+               close(fds[0]);
+               return status;
        }
-       close(fds[0]);
-       close(fds[1]);
+
+       f = fdopen(fds[0], "r");
+       if (fread(fingerprint, 1, 16, f) != 16)
+               status = -1;
+       fclose(f);
+       if (status)
+               return status;
+
+       fingerprint[16] = '\0';
+       if (strspn(fingerprint, "0123456789abcdefABCDEF") != 16)
+               status = -1;
+
        return status;
 }
 
@@ -234,5 +242,5 @@ int usign_v(const char *msgfile, const char *pubkeyfile,
        }
 
        waitpid(pid, &status, 0);
-       return WEXITSTATUS(status);
+       return WIFEXITED(status) ? WEXITSTATUS(status) : -1;
 }