mntent: unescape octal sequences

As entries in mtab are delimited by spaces, whitespace characters
are escaped as octal sequences. When reading them out, we have to
unescape these sequences to get the proper string.
This commit is contained in:
q66 2023-11-09 20:48:44 +01:00 committed by Rich Felker
parent e17b9d7474
commit ee1d39bc15
1 changed files with 40 additions and 4 deletions

View File

@ -20,6 +20,42 @@ int endmntent(FILE *f)
return 1;
}
static char *unescape_ent(char *beg)
{
char *dest = beg;
const char *src = beg;
while (*src) {
const char *val;
unsigned char cval = 0;
if (*src != '\\') {
*dest++ = *src++;
continue;
}
if (src[1] == '\\') {
++src;
*dest++ = *src++;
continue;
}
val = src + 1;
for (int i = 0; i < 3; ++i) {
if (*val >= '0' && *val <= '7') {
cval <<= 3;
cval += *val++ - '0';
} else {
break;
}
}
if (cval) {
*dest++ = cval;
src = val;
} else {
*dest++ = *src++;
}
}
*dest = 0;
return beg;
}
struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int buflen)
{
int n[8], use_internal = (linebuf == SENTINEL);
@ -55,10 +91,10 @@ struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int bufle
linebuf[n[5]] = 0;
linebuf[n[7]] = 0;
mnt->mnt_fsname = linebuf+n[0];
mnt->mnt_dir = linebuf+n[2];
mnt->mnt_type = linebuf+n[4];
mnt->mnt_opts = linebuf+n[6];
mnt->mnt_fsname = unescape_ent(linebuf+n[0]);
mnt->mnt_dir = unescape_ent(linebuf+n[2]);
mnt->mnt_type = unescape_ent(linebuf+n[4]);
mnt->mnt_opts = unescape_ent(linebuf+n[6]);
return mnt;
}