aboutsummaryrefslogtreecommitdiff
path: root/nss/nss_files/files-XXX.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1996-11-14 02:04:07 +0000
committerUlrich Drepper <drepper@redhat.com>1996-11-14 02:04:07 +0000
commit26761c287fdf4a9997b7c62b5c64cec84ce2c329 (patch)
tree2f7ac77185952d09a03a988f3176e18e476fe7ee /nss/nss_files/files-XXX.c
parentb8591d1bdf48f5560a3a8e1326758a5aa5e529cf (diff)
downloadglibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.tar
glibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.tar.gz
glibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.tar.bz2
glibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.zip
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.c120
1 files changed, 68 insertions, 52 deletions
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
index b6702b0366..c741ab6f48 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); \
\