about summary refs log tree commit diff
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.gz
glibc-26761c287fdf4a9997b7c62b5c64cec84ce2c329.tar.xz
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);						      \
 									      \