Fix incorrect mount table entry parsing in __getmntent_r

When mount entry contains only four fields and have more then one space or
tab at the and, mp.mnt_freq and mp.mnt_passno will be set to some specific
values as side effect from parsing of previus mount entry. It is because
sscanf(""," %d %d ", &a, &b) returns -1, but this case is unprocessed.
Values of mp.mnt_freq and  mp.mnt_passno stays unchanged. This patch is
attempt to fix described issue by removing trailing tabs and spaces.
This commit is contained in:
Vladimir A. Nazarenko 2015-01-06 19:19:44 -08:00 committed by H.J. Lu
parent 01238691bb
commit fb87ee96d7
4 changed files with 41 additions and 9 deletions

View File

@ -1,3 +1,11 @@
2015-01-06 Vladimir A. Nazarenko <naszar@ya.ru>
. [BZ #17273]
* misc/mntent_r.c (__getmntent_r): Cut off trailing spaces
and tabs from buffer before parsing fstab entry.
* misc/tst-mntent.c (main): Add test for mount entry with
trailing spaces and tabs.
2015-01-06 Joseph Myers <joseph@codesourcery.com>
[BZ #17748]

14
NEWS
View File

@ -11,13 +11,13 @@ Version 2.21
6652, 10672, 12847, 12926, 13862, 14132, 14138, 14171, 14498, 15215,
15884, 16191, 16469, 16617, 16619, 16657, 16740, 16857, 17192, 17266,
17344, 17363, 17370, 17371, 17411, 17460, 17475, 17485, 17501, 17506,
17508, 17522, 17555, 17570, 17571, 17572, 17573, 17574, 17581, 17582,
17583, 17584, 17585, 17589, 17594, 17601, 17608, 17616, 17625, 17630,
17633, 17634, 17635, 17647, 17653, 17657, 17664, 17665, 17668, 17682,
17717, 17719, 17722, 17723, 17724, 17725, 17732, 17733, 17744, 17745,
17746, 17747, 17775, 17777, 17780, 17781, 17782, 17793, 17796, 17797,
17806
17273, 17344, 17363, 17370, 17371, 17411, 17460, 17475, 17485, 17501,
17506, 17508, 17522, 17555, 17570, 17571, 17572, 17573, 17574, 17581,
17582, 17583, 17584, 17585, 17589, 17594, 17601, 17608, 17616, 17625,
17630, 17633, 17634, 17635, 17647, 17653, 17657, 17664, 17665, 17668,
17682, 17717, 17719, 17722, 17723, 17724, 17725, 17732, 17733, 17744,
17745, 17746, 17747, 17775, 17777, 17780, 17781, 17782, 17793, 17796,
17797, 17806
* i386 memcpy functions optimized with SSE2 unaligned load/store.

View File

@ -135,7 +135,11 @@ __getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
end_ptr = strchr (buffer, '\n');
if (end_ptr != NULL) /* chop newline */
*end_ptr = '\0';
{
while (end_ptr[-1] == ' ' || end_ptr[-1] == '\t')
end_ptr--;
*end_ptr = '\0';
}
else
{
/* Not the whole line was read. Do it now but forget it. */

View File

@ -73,7 +73,27 @@ main (int argc, char *argv[])
puts ("Error while reading written entry back in");
result = 1;
}
}
/* Part III: Entry with whitespaces at the end of a line. */
rewind (fp);
fputs ("/foo\\040dir /bar\\040dir auto bind \t \n", fp);
rewind (fp);
mnt = getmntent (fp);
if (strcmp (mnt->mnt_fsname, "/foo dir") != 0
|| strcmp (mnt->mnt_dir, "/bar dir") != 0
|| strcmp (mnt->mnt_type, "auto") != 0
|| strcmp (mnt->mnt_opts, "bind") != 0
|| mnt->mnt_freq != 0
|| mnt->mnt_passno != 0)
{
puts ("Error while reading entry with trailing whitespaces");
result = 1;
}
}
return result;
}