fgetln(3) -> getline(3); from Lauri Tirkkonen; ok millert@
authorcheloha <cheloha@openbsd.org>
Fri, 7 Sep 2018 14:54:49 +0000 (14:54 +0000)
committercheloha <cheloha@openbsd.org>
Fri, 7 Sep 2018 14:54:49 +0000 (14:54 +0000)
bin/md5/md5.c

index 84adbcf..ff1c05d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: md5.c,v 1.92 2017/09/11 16:35:38 millert Exp $        */
+/*     $OpenBSD: md5.c,v 1.93 2018/09/07 14:54:49 cheloha Exp $        */
 
 /*
  * Copyright (c) 2001,2003,2005-2007,2010,2013,2014
@@ -549,11 +549,11 @@ digest_filelist(const char *file, struct hash_function *defhash, int selcount,
        int found, base64, error, cmp, i;
        size_t algorithm_max, algorithm_min;
        const char *algorithm;
-       char *filename, *checksum, *buf, *p;
+       char *filename, *checksum, *line, *p, *tmpline;
        char digest[MAX_DIGEST_LEN + 1];
-       char *lbuf = NULL;
+       ssize_t linelen;
        FILE *listfp, *fp;
-       size_t len, nread;
+       size_t len, linesize, nread;
        int *sel_found = NULL;
        u_char data[32 * 1024];
        union ANY_CTX context;
@@ -580,20 +580,15 @@ digest_filelist(const char *file, struct hash_function *defhash, int selcount,
        }
 
        error = found = 0;
-       while ((buf = fgetln(listfp, &len))) {
+       line = NULL;
+       linesize = 0;
+       while ((linelen = getline(&line, &linesize, listfp)) != -1) {
+               tmpline = line;
                base64 = 0;
-               if (buf[len - 1] == '\n')
-                       buf[len - 1] = '\0';
-               else {
-                       if ((lbuf = malloc(len + 1)) == NULL)
-                               err(1, NULL);
-
-                       (void)memcpy(lbuf, buf, len);
-                       lbuf[len] = '\0';
-                       buf = lbuf;
-               }
-               while (isspace((unsigned char)*buf))
-                       buf++;
+               if (line[linelen - 1] == '\n')
+                       line[linelen - 1] = '\0';
+               while (isspace((unsigned char)*tmpline))
+                       tmpline++;
 
                /*
                 * Crack the line into an algorithm, filename, and checksum.
@@ -603,11 +598,11 @@ digest_filelist(const char *file, struct hash_function *defhash, int selcount,
                 * Fallback on GNU form:
                 *  CHECKSUM  FILENAME
                 */
-               p = strchr(buf, ' ');
+               p = strchr(tmpline, ' ');
                if (p != NULL && *(p + 1) == '(') {
                        /* BSD form */
                        *p = '\0';
-                       algorithm = buf;
+                       algorithm = tmpline;
                        len = strlen(algorithm);
                        if (len > algorithm_max || len < algorithm_min)
                                continue;
@@ -658,7 +653,7 @@ digest_filelist(const char *file, struct hash_function *defhash, int selcount,
                        if ((hf = defhash) == NULL)
                                continue;
                        algorithm = hf->name;
-                       checksum = buf;
+                       checksum = tmpline;
                        if ((p = strchr(checksum, ' ')) == NULL)
                                continue;
                        if (hf->style == STYLE_CKSUM) {
@@ -725,11 +720,15 @@ digest_filelist(const char *file, struct hash_function *defhash, int selcount,
                        error = 1;
                }
        }
+       free(line);
+       if (ferror(listfp)) {
+               warn("%s: getline", file);
+               error = 1;
+       }
        if (listfp != stdin)
                fclose(listfp);
        if (!found)
                warnx("%s: no properly formatted checksum lines found", file);
-       free(lbuf);
        if (sel_found != NULL) {
                /*
                 * Mark found files by setting them to NULL so that we can