summaryrefslogtreecommitdiff
path: root/nis
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-01-30 17:20:29 +0000
committerUlrich Drepper <drepper@redhat.com>1998-01-30 17:20:29 +0000
commit69032e82e9c0c26b104ee4a03a83afb3380aace8 (patch)
tree65b6f4a180522258e599ccb199bb787a27c9dffa /nis
parent6ecb7620e5eaffeac8b8ccd3617b0eba28b408cf (diff)
Correctly handle buffer overflow while reading line with fgets.
Diffstat (limited to 'nis')
-rw-r--r--nis/nss_compat/compat-grp.c50
-rw-r--r--nis/nss_compat/compat-pwd.c50
-rw-r--r--nis/nss_compat/compat-spwd.c20
3 files changed, 61 insertions, 59 deletions
diff --git a/nis/nss_compat/compat-grp.c b/nis/nss_compat/compat-grp.c
index 91a19c0b77..693ade575e 100644
--- a/nis/nss_compat/compat-grp.c
+++ b/nis/nss_compat/compat-grp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
@@ -315,17 +315,15 @@ getgrent_next_file (struct group *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
+ return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
{
- if (feof (ent->stream))
- return NSS_STATUS_NOTFOUND;
- else
- {
- fsetpos (ent->stream, &pos);
- __set_errno (ERANGE);
- return NSS_STATUS_TRYAGAIN;
- }
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
}
/* Terminate the line for any case. */
@@ -446,17 +444,15 @@ internal_getgrnam_r (const char *name, struct group *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
+ return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
{
- if (feof (ent->stream))
- return NSS_STATUS_NOTFOUND;
- else
- {
- fsetpos (ent->stream, &pos);
- __set_errno (ERANGE);
- return NSS_STATUS_TRYAGAIN;
- }
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
}
/* Terminate the line for any case. */
@@ -607,17 +603,15 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
+ return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
{
- if (feof (ent->stream))
- return NSS_STATUS_NOTFOUND;
- else
- {
- fsetpos (ent->stream, &pos);
- __set_errno (ERANGE);
- return NSS_STATUS_TRYAGAIN;
- }
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
}
/* Terminate the line for any case. */
diff --git a/nis/nss_compat/compat-pwd.c b/nis/nss_compat/compat-pwd.c
index afc35e2cfd..6b1712e5b7 100644
--- a/nis/nss_compat/compat-pwd.c
+++ b/nis/nss_compat/compat-pwd.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
@@ -565,17 +565,15 @@ getpwent_next_file (struct passwd *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
+ return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
{
- if (feof (ent->stream))
- return NSS_STATUS_NOTFOUND;
- else
- {
- fsetpos (ent->stream, &pos);
- __set_errno (ERANGE);
- return NSS_STATUS_TRYAGAIN;
- }
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
}
/* Terminate the line for any case. */
@@ -745,17 +743,15 @@ internal_getpwnam_r (const char *name, struct passwd *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
+ return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
{
- if (feof (ent->stream))
- return NSS_STATUS_NOTFOUND;
- else
- {
- fsetpos (ent->stream, &pos);
- __set_errno (ERANGE);
- return NSS_STATUS_TRYAGAIN;
- }
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
}
/* Terminate the line for any case. */
@@ -982,17 +978,15 @@ internal_getpwuid_r (uid_t uid, struct passwd *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
+ return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
{
- if (feof (ent->stream))
- return NSS_STATUS_NOTFOUND;
- else
- {
- fsetpos (ent->stream, &pos);
- __set_errno (ERANGE);
- return NSS_STATUS_TRYAGAIN;
- }
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
}
/* Terminate the line for any case. */
diff --git a/nis/nss_compat/compat-spwd.c b/nis/nss_compat/compat-spwd.c
index 76ce8831e7..007305c424 100644
--- a/nis/nss_compat/compat-spwd.c
+++ b/nis/nss_compat/compat-spwd.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
@@ -515,9 +515,16 @@ getspent_next_file (struct spwd *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
+ {
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
+ }
/* Terminate the line for any case. */
buffer[buflen - 1] = '\0';
@@ -690,9 +697,16 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
do
{
fgetpos (ent->stream, &pos);
+ buffer[buflen - 1] = '\xff';
p = fgets (buffer, buflen, ent->stream);
- if (p == NULL)
+ if (p == NULL && feof (ent->stream))
return NSS_STATUS_NOTFOUND;
+ if (p == NULL || buffer[buflen - 1] != '\xff')
+ {
+ fsetpos (ent->stream, &pos);
+ __set_errno (ERANGE);
+ return NSS_STATUS_TRYAGAIN;
+ }
/* Terminate the line for any case. */
buffer[buflen - 1] = '\0';