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:
parent
5929e8a15a
commit
3e4e9a26a5
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user