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