diff options
author | Ulrich Drepper <drepper@redhat.com> | 1996-11-14 02:04:07 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1996-11-14 02:04:07 +0000 |
commit | 26761c287fdf4a9997b7c62b5c64cec84ce2c329 (patch) | |
tree | 2f7ac77185952d09a03a988f3176e18e476fe7ee /nss/nss_files/files-XXX.c | |
parent | b8591d1bdf48f5560a3a8e1326758a5aa5e529cf (diff) | |
download | glibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.zip glibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.tar.gz glibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.tar.bz2 |
update from main archive 961113
Thu Nov 14 02:00:33 1996 Ulrich Drepper <drepper@cygnus.com>
* inet/Makefile (headers): Add aliases.h.
(routines): Add getaliasent_r, getaliasent, getaliasname, and
getaliasname_r.
* aliases.h: New file.
* inet/aliases.h: New file.
* inet/getaliasent.c: New file.
* inet/getaliasent_r.c: New file.
* inet/getaliasname.c: New file.
* inet/getaliasname_r.c: New file.
* nss/Makefile (databases): Add alias.
* nss/alias-lookup.c: New file.
* nss/databases.def: Add aliases and publickey.
* nss/nss_db/db-alias.c: New file.
* nss/nss_files/files-alias.c: New file.
* inet/getnetgrent_r.c (__internal_getnetgrent): Buffer length
argument to lookup function is of type size_t.
(innetgr): Likewise.
* nss/getXXbyYY_r.c: Likewise.
* nss/getXXent_r.c: Likewise.
* nss/nss_db/db-XXX.c: Likewise.
* nss/getXXbyYY.c: Don't provide static buffer. Resize if call
failed because buffer was too small.
* nss/getXXent.c: Likewise.
* nss/nss_files/files-XXX.c: Correct handling of shared file. The
getXXent_r function now uses f[gs]etpos to get to the correct
position.
* nss/nss_files/files-parse.c: Indent lines for better readability.
* malloc/obstack.c: Add new variable obstack_alloc_failed_handler
and new function print_and_abort. Remove all references to
alloc_failed field.
Add new function _obstack_memory_used.
* malloc/obstack.h (struct obstack): Remove field alloc_field.
Remove all references to alloc_failed field.
Add prototype for _obstack_memory_used.
* posix/unistd.h: Correct typo.
Wed Nov 13 03:09:16 1996 Ulrich Drepper <drepper@cygnus.com>
* configure.in: Require at least autoconf-2.10.2.
Tue Nov 12 03:35:01 1996 Christian von Roques <roques@pond.sub.org>
* malloc/obstack.h: Add new macro `obstack_make_room'.
* malloc/obstack.c: Add function implementation for
`obstack_make_room'.
Mon Nov 11 13:54:04 1996 Ulrich Drepper <drepper@cygnus.com>
Update to BIND-4.9.5-REL.
* resolv/Banner: Set to 4.9.5-REL.
* resolv/inet_net_pton.c: Was doing bad things to subnets and b'casts.
* resolv/res_debug.c (__fp_nquery): Could read past end of buffer.
(fix from BIND 8.1)
* config.make.in: Add definition for top_absdir.
* Makerules (make-link): Fix path to rellns-sh script.
Sat Nov 9 02:15:24 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* posix/unistd.h: Fix comment.
* manual/arith.texi: Fix misspellings. Use `zero', not `null',
when talking about numbers.
* manual/users.texi: Likewise.
* manual/creature.texi: Likewise. Use @defvarx for a secondary
description header.
Sat Nov 9 19:25:11 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/posix/Makefile ($(common-objpfx)mk-stdiolim): Depend on
the real posix1_lim.h file so that it works in all subdirs, not
only in posix.
Sat Nov 9 02:08:34 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makefile ($(includedir)/gnu/lib-names.h): Quote arguments of tr.
Sat Nov 9 02:06:17 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/Makefile ($(common-objpfx)s-proto.d): Don't depend
on $(before-compile) which hasn't been properly setup yet at this
point.
Sat Nov 9 02:02:48 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/generic/sigset.h: Don't use implicit int which will
probably require a diagnostic in the next revision of the C
standard.
* sysdeps/stub/lockfile.c: Likewise.
Sat Nov 9 01:57:17 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/m68k/syscall.S: Correct last change.
* sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise.
Mon Nov 11 02:53:14 1996 Ulrich Drepper <drepper@cygnus.com>
* time/strftime.c: Update copyright. Small cosmetic changes.
char *' and `int'.
PROJ_ID are used.
Diffstat (limited to 'nss/nss_files/files-XXX.c')
-rw-r--r-- | nss/nss_files/files-XXX.c | 120 |
1 files changed, 68 insertions, 52 deletions
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c index b6702b0..c741ab6 100644 --- a/nss/nss_files/files-XXX.c +++ b/nss/nss_files/files-XXX.c @@ -20,6 +20,7 @@ #include <stdio.h> #include <ctype.h> #include <assert.h> +#include <errno.h> #include <libc-lock.h> #include "nsswitch.h" @@ -39,13 +40,13 @@ #define DATAFILE "/etc/" DATABASE #ifdef NEED_H_ERRNO -#define H_ERRNO_PROTO , int *herrnop -#define H_ERRNO_ARG , herrnop -#define H_ERRNO_SET(val) (*herrnop = (val)) +# define H_ERRNO_PROTO , int *herrnop +# define H_ERRNO_ARG , herrnop +# define H_ERRNO_SET(val) (*herrnop = (val)) #else -#define H_ERRNO_PROTO -#define H_ERRNO_ARG -#define H_ERRNO_SET(val) ((void) 0) +# define H_ERRNO_PROTO +# define H_ERRNO_ARG +# define H_ERRNO_SET(val) ((void) 0) #endif /* Locks the static variables in this file. */ @@ -59,10 +60,10 @@ static enum { none, getent, getby } last_use; static int keep_stream; /* Open database file if not already opened. */ -static int +static enum nss_status internal_setent (int stayopen) { - int status = NSS_STATUS_SUCCESS; + enum nss_status status = NSS_STATUS_SUCCESS; if (stream == NULL) { @@ -83,10 +84,10 @@ internal_setent (int stayopen) /* Thread-safe, exported version of that. */ -int +enum nss_status CONCAT(_nss_files_set,ENTNAME) (int stayopen) { - int status; + enum nss_status status; __libc_lock_lock (lock); @@ -120,7 +121,7 @@ internal_endent (void) /* Thread-safe, exported version of that. */ -int +enum nss_status CONCAT(_nss_files_end,ENTNAME) (void) { __libc_lock_lock (lock); @@ -145,16 +146,6 @@ internal_getent (struct STRUCTURE *result, struct parser_data *data = (void *) buffer; int linebuflen = buffer + buflen - data->linebuffer; - /* Be prepared that the set*ent function was not called before. */ - if (stream == NULL) - { - enum nss_status status; - - status = internal_setent (0); - if (status != NSS_STATUS_SUCCESS) - return status; - } - if (buflen < (int) sizeof *data + 1) { __set_errno (ERANGE); @@ -163,6 +154,9 @@ internal_getent (struct STRUCTURE *result, do { + /* Terminate the line so that we can test for overflow. */ + data->linebuffer[linebuflen - 1] = '\0'; + p = fgets (data->linebuffer, linebuflen, stream); if (p == NULL) { @@ -170,17 +164,23 @@ internal_getent (struct STRUCTURE *result, H_ERRNO_SET (HOST_NOT_FOUND); return NSS_STATUS_NOTFOUND; } - - /* Terminate the line for any case. */ - data->linebuffer[linebuflen - 1] = '\0'; + else if (data->linebuffer[linebuflen - 1] != '\0') + { + /* The line is too long. Give the user the opportunity to + enlarge the buffer. */ + __set_errno (ERANGE); + H_ERRNO_SET (NETDB_INTERNAL); + return NSS_STATUS_TRYAGAIN; + } /* Skip leading blanks. */ while (isspace (*p)) ++p; - } while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ - /* Parse the line. If it is invalid, loop to - get the next line of the file to parse. */ - ! parse_line (p, result, data, buflen)); + } + while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ + /* Parse the line. If it is invalid, loop to get the next + line of the file to parse. */ + || ! parse_line (p, result, data, buflen)); /* Filled in RESULT with the next entry from the database file. */ return NSS_STATUS_SUCCESS; @@ -188,29 +188,42 @@ internal_getent (struct STRUCTURE *result, /* Return the next entry from the database file, doing locking. */ -int +enum nss_status CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, - char *buffer, int buflen H_ERRNO_PROTO) + char *buffer, size_t buflen H_ERRNO_PROTO) { /* Return next entry in host file. */ - int status = NSS_STATUS_SUCCESS; + enum nss_status status = NSS_STATUS_SUCCESS; __libc_lock_lock (lock); - /* If the last use was not by the getent function we need the - position the stream. */ - if (last_use != getent) - if (fsetpos (stream, &position) < 0) - status = NSS_STATUS_UNAVAIL; - else - last_use = getent; + /* Be prepared that the set*ent function was not called before. */ + if (stream == NULL) + status = internal_setent (0); - if (status == NSS_STATUS_SUCCESS) + if (status != NSS_STATUS_SUCCESS) { - status = internal_getent (result, buffer, buflen H_ERRNO_ARG); - - /* Remember this position. */ - fgetpos (stream, &position); + /* If the last use was not by the getent function we need the + position the stream. */ + if (last_use != getent) + if (fsetpos (stream, &position) < 0) + status = NSS_STATUS_UNAVAIL; + else + last_use = getent; + + if (status == NSS_STATUS_SUCCESS) + { + status = internal_getent (result, buffer, buflen H_ERRNO_ARG); + + /* Remember this position if we were successful. If the + operation failed we give the user a chance to repeat the + operation (perhaps the buffer was too small). */ + if (status == NSS_STATUS_SUCCESS) + fgetpos (stream, &position); + else + /* We must make sure we reposition the stream the next call. */ + last_use = none; + } } __libc_lock_unlock (lock); @@ -234,24 +247,27 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, enum nss_status \ _nss_files_get##name##_r (proto, \ struct STRUCTURE *result, \ - char *buffer, int buflen H_ERRNO_PROTO) \ + char *buffer, size_t buflen H_ERRNO_PROTO) \ { \ enum nss_status status; \ \ __libc_lock_lock (lock); \ \ /* Reset file pointer to beginning or open file. */ \ - internal_setent (keep_stream); \ + status = internal_setent (keep_stream); \ \ - /* Tell getent function that we have repositioned the file pointer. */ \ - last_use = getby; \ + if (status == NSS_STATUS_SUCCESS) \ + { \ + /* Tell getent function that we have repositioned the file pointer. */ \ + last_use = getby; \ \ - while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG)) \ - == NSS_STATUS_SUCCESS) \ - { break_if_match } \ + while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG)) \ + == NSS_STATUS_SUCCESS) \ + { break_if_match } \ \ - if (! keep_stream) \ - internal_endent (); \ + if (! keep_stream) \ + internal_endent (); \ + } \ \ __libc_lock_unlock (lock); \ \ |