* mount.cc (mount_info::from_fstab): Read sizeof (buf) - 2 bytes.

Add code to handle overly long lines.
This commit is contained in:
Corinna Vinschen 2008-06-10 17:17:44 +00:00
parent 93e9098f7c
commit 58014a9b46
2 changed files with 34 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2008-06-10 Corinna Vinschen <corinna@vinschen.de>
* mount.cc (mount_info::from_fstab): Read sizeof (buf) - 2 bytes.
Add code to handle overly long lines.
2008-06-10 Corinna Vinschen <corinna@vinschen.de> 2008-06-10 Corinna Vinschen <corinna@vinschen.de>
* sec_auth.cc (lsaauth): Make returned token inheritable. * sec_auth.cc (lsaauth): Make returned token inheritable.

View File

@ -935,8 +935,9 @@ mount_info::from_fstab (bool user, WCHAR fstab[], PWCHAR fstab_end)
char buf[NT_MAX_PATH]; char buf[NT_MAX_PATH];
char *got = buf; char *got = buf;
DWORD len = 0; DWORD len = 0;
/* Using buffer size - 1 leaves space to append two \0. */ unsigned line = 1;
while (ReadFile (h, got, (sizeof (buf) - 1) - (got - buf), &len, NULL)) /* Using buffer size - 2 leaves space to append two \0. */
while (ReadFile (h, got, (sizeof (buf) - 2) - (got - buf), &len, NULL))
{ {
char *end; char *end;
@ -946,15 +947,39 @@ mount_info::from_fstab (bool user, WCHAR fstab[], PWCHAR fstab_end)
len += got - buf; len += got - buf;
/* Reset got to start reading at the start of the buffer again. */ /* Reset got to start reading at the start of the buffer again. */
got = buf; got = buf;
retry:
bool got_nl = false;
while (got < buf + len && (end = strchr (got, '\n'))) while (got < buf + len && (end = strchr (got, '\n')))
{ {
got_nl = true;
end[end[-1] == '\r' ? -1 : 0] = '\0'; end[end[-1] == '\r' ? -1 : 0] = '\0';
if (!from_fstab_line (got, user)) if (!from_fstab_line (got, user))
goto done; goto done;
got = end + 1; got = end + 1;
++line;
} }
if (len < (sizeof (buf) - 1)) if (len < (sizeof (buf) - 2))
break; break;
/* Check if the buffer contained at least one \n. If not, the
line length is > 32K. We don't take such long lines. Print
a debug message and skip this line entirely. */
if (!got_nl)
{
system_printf ("%W: Line %d too long, skipping...", fstab, line);
while (ReadFile (h, buf, (sizeof (buf) - 2), &len, NULL))
{
buf[len] = buf[len + 1] = '\0';
got = strchr (buf, '\n');
if (got)
{
++got;
++line;
goto retry;
}
}
got = buf;
break;
}
/* We have to read once more. Move remaining bytes to the start of /* We have to read once more. Move remaining bytes to the start of
the buffer and reposition got so that it points to the end of the buffer and reposition got so that it points to the end of
the remaining bytes. */ the remaining bytes. */
@ -963,6 +988,7 @@ mount_info::from_fstab (bool user, WCHAR fstab[], PWCHAR fstab_end)
got = buf + len; got = buf + len;
buf[len] = buf[len + 1] = '\0'; buf[len] = buf[len + 1] = '\0';
} }
/* Catch a last line without trailing \n. */
if (got > buf) if (got > buf)
from_fstab_line (got, user); from_fstab_line (got, user);
done: done: