mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
mntent: fix parsing lines with optional fields
According to fstab(5), the last two fields are optional, but this wasn't accepted. After this change, only the first field is required, which matches glibc's behaviour. Using sscanf as before, it would have been impossible to differentiate between 0 fields and 4 fields, because sscanf would have returned 0 in both cases due to the use of assignment suppression and %n for the string fields (which is important to avoid copying any strings). So instead, before calling sscanf, initialize every string to the empty string, and then we can check which strings are empty afterwards to know how many fields were matched.
This commit is contained in:
parent
dcb31f6b45
commit
751bee0ee7
1 changed files with 7 additions and 3 deletions
|
@ -21,7 +21,8 @@ int endmntent(FILE *f)
|
|||
|
||||
struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int buflen)
|
||||
{
|
||||
int cnt, n[8], use_internal = (linebuf == SENTINEL);
|
||||
int n[8], use_internal = (linebuf == SENTINEL);
|
||||
size_t len, i;
|
||||
|
||||
mnt->mnt_freq = 0;
|
||||
mnt->mnt_passno = 0;
|
||||
|
@ -39,10 +40,13 @@ struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int bufle
|
|||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
cnt = sscanf(linebuf, " %n%*s%n %n%*s%n %n%*s%n %n%*s%n %d %d",
|
||||
|
||||
len = strlen(linebuf);
|
||||
for (i = 0; i < sizeof n / sizeof *n; i++) n[i] = len;
|
||||
sscanf(linebuf, " %n%*s%n %n%*s%n %n%*s%n %n%*s%n %d %d",
|
||||
n, n+1, n+2, n+3, n+4, n+5, n+6, n+7,
|
||||
&mnt->mnt_freq, &mnt->mnt_passno);
|
||||
} while (cnt < 2 || linebuf[n[0]] == '#');
|
||||
} while (linebuf[n[0]] == '#' || n[1]==len);
|
||||
|
||||
linebuf[n[1]] = 0;
|
||||
linebuf[n[3]] = 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue