Various fixes to the load() function.

- Use getline() instead of fgetln().  This ensures the returned string
  is always null-terminated without losing the last character if the
  last line in a file doesn't have a newline.  Also, while fgetln says
  the returned buffer can be modified, that doesn't actually seem safe
  as the current implementation means you are modifying stdio's
  internal buffer.

- Remove a spurious if before an ATF_REQUIRE that was clearly supposed
  to be non-optional.

- Remove a pointless compare of 'ptr' against '\0' (really NULL) that
  duplicated the middle condition in the for().

- Once a comment is found, skip the rest of the line, not just the
  current word.

Reviewed by:	kevans
Obtained from:	CheriBSD
Sponsored by:	DARPA
Differential Revision:	https://reviews.freebsd.org/D26278
This commit is contained in:
jhb 2020-09-03 14:50:15 +00:00
parent 5929e8a15a
commit 3e4e9a26a5

View File

@ -70,22 +70,23 @@ static void
load(const char *fname)
{
FILE *fp;
size_t len;
size_t linecap;
char *line;
if ((fp = fopen(fname, "r")) == NULL)
fp = fopen(fname, "r");
ATF_REQUIRE(fp != NULL);
while ((line = fgetln(fp, &len)) != NULL) {
char c = line[len - 1];
line = NULL;
linecap = 0;
while (getline(&line, &linecap, fp) >= 0) {
char *ptr;
line[len - 1] = '\0';
for (ptr = strtok(line, WS); ptr; ptr = strtok(NULL, WS)) {
if (ptr == '\0' || ptr[0] == '#')
continue;
if (ptr[0] == '#')
break;
sl_add(hosts, strdup(ptr));
}
line[len - 1] = c;
}
free(line);
(void)fclose(fp);
}