diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-01-30 17:20:29 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-01-30 17:20:29 +0000 |
commit | 69032e82e9c0c26b104ee4a03a83afb3380aace8 (patch) | |
tree | 65b6f4a180522258e599ccb199bb787a27c9dffa /nis | |
parent | 6ecb7620e5eaffeac8b8ccd3617b0eba28b408cf (diff) |
Correctly handle buffer overflow while reading line with fgets.
Diffstat (limited to 'nis')
-rw-r--r-- | nis/nss_compat/compat-grp.c | 50 | ||||
-rw-r--r-- | nis/nss_compat/compat-pwd.c | 50 | ||||
-rw-r--r-- | nis/nss_compat/compat-spwd.c | 20 |
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'; |