This patch is ok cheloha@ and I can commit if someone else
is ok, too.

On Tue, Aug 14, 2018 at 10:47:07PM +0300, Lauri Tirkkonen wrote:
> [...]
> 
> diff --git a/bin/md5/md5.c b/bin/md5/md5.c
> index 84adbcf0989..1abf28cfa16 100644
> --- a/bin/md5/md5.c
> +++ b/bin/md5/md5.c
> @@ -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
> 
> -- 
> Lauri Tirkkonen | lotheac @ IRCnet

Reply via email to