summary refs log tree commit diff
path: root/nss/nss_files
diff options
context:
space:
mode:
Diffstat (limited to 'nss/nss_files')
-rw-r--r--nss/nss_files/files-XXX.c23
-rw-r--r--nss/nss_files/files-alias.c13
-rw-r--r--nss/nss_files/files-netgrp.c10
-rw-r--r--nss/nss_files/files-parse.c10
4 files changed, 31 insertions, 25 deletions
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
index eb0f6fec8f..e3261ed454 100644
--- a/nss/nss_files/files-XXX.c
+++ b/nss/nss_files/files-XXX.c
@@ -162,7 +162,7 @@ CONCAT(_nss_files_end,ENTNAME) (void)
 
 static enum nss_status
 internal_getent (struct STRUCTURE *result,
-		 char *buffer, int buflen H_ERRNO_PROTO)
+		 char *buffer, int buflen, int *errnop H_ERRNO_PROTO)
 {
   char *p;
   struct parser_data *data = (void *) buffer;
@@ -171,7 +171,7 @@ internal_getent (struct STRUCTURE *result,
 
   if (buflen < (int) sizeof *data + 1)
     {
-      __set_errno (ERANGE);
+      *errnop = ERANGE;
       H_ERRNO_SET (NETDB_INTERNAL);
       return NSS_STATUS_TRYAGAIN;
     }
@@ -185,6 +185,7 @@ internal_getent (struct STRUCTURE *result,
       if (p == NULL)
 	{
 	  /* End of file or read error.  */
+	  *errnop = errno;
 	  H_ERRNO_SET (HOST_NOT_FOUND);
 	  return NSS_STATUS_NOTFOUND;
 	}
@@ -192,7 +193,7 @@ internal_getent (struct STRUCTURE *result,
 	{
 	  /* The line is too long.  Give the user the opportunity to
 	     enlarge the buffer.  */
-	  __set_errno (ERANGE);
+	  *errnop = ERANGE;
 	  H_ERRNO_SET (NETDB_INTERNAL);
 	  return NSS_STATUS_TRYAGAIN;
 	}
@@ -204,7 +205,7 @@ internal_getent (struct STRUCTURE *result,
   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_result = parse_line (p, result, data, buflen)));
+	 || ! (parse_result = parse_line (p, result, data, buflen, errnop)));
 
   /* Filled in RESULT with the next entry from the database file.  */
   return parse_result == -1 ? NSS_STATUS_TRYAGAIN : NSS_STATUS_SUCCESS;
@@ -213,8 +214,8 @@ internal_getent (struct STRUCTURE *result,
 
 /* Return the next entry from the database file, doing locking.  */
 enum nss_status
-CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
-				  char *buffer, size_t buflen H_ERRNO_PROTO)
+CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer,
+				  size_t buflen, int *errnop H_ERRNO_PROTO)
 {
   /* Return next entry in host file.  */
   enum nss_status status = NSS_STATUS_SUCCESS;
@@ -237,7 +238,8 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
 
       if (status == NSS_STATUS_SUCCESS)
 	{
-	  status = internal_getent (result, buffer, buflen H_ERRNO_ARG);
+	  status = internal_getent (result, buffer, buflen, errnop
+				    H_ERRNO_ARG);
 
 	  /* Remember this position if we were successful.  If the
 	     operation failed we give the user a chance to repeat the
@@ -270,8 +272,8 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
 #define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...)	      \
 enum nss_status								      \
 _nss_files_get##name##_r (proto,					      \
-			  struct STRUCTURE *result,			      \
-			  char *buffer, size_t buflen H_ERRNO_PROTO)	      \
+			  struct STRUCTURE *result, char *buffer,	      \
+			  size_t buflen, int *errnop H_ERRNO_PROTO)	      \
 {									      \
   enum nss_status status;						      \
 									      \
@@ -285,7 +287,8 @@ _nss_files_get##name##_r (proto,					      \
       /* Tell getent function that we have repositioned the file pointer.  */ \
       last_use = getby;							      \
 									      \
-      while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG))  \
+      while ((status = internal_getent (result, buffer, buflen, errnop	      \
+					H_ERRNO_ARG))			      \
 	     == NSS_STATUS_SUCCESS)					      \
 	{ break_if_match }						      \
 									      \
diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
index bf4fa8a2f0..7eb22bb187 100644
--- a/nss/nss_files/files-alias.c
+++ b/nss/nss_files/files-alias.c
@@ -131,7 +131,7 @@ _nss_files_endaliasent (void)
 /* Parsing the database file into `struct aliasent' data structures.  */
 static enum nss_status
 get_next_alias (const char *match, struct aliasent *result,
-		char *buffer, size_t buflen)
+		char *buffer, int *errnop, size_t buflen)
 {
   enum nss_status status = NSS_STATUS_NOTFOUND;
   int ignore = 0;
@@ -159,7 +159,7 @@ get_next_alias (const char *match, struct aliasent *result,
 	{
 	  /* The line is too long for our buffer.  */
 	no_more_room:
-	  __set_errno (ERANGE);
+	  *errnop = ERANGE;
 	  status = NSS_STATUS_TRYAGAIN;
 	  break;
 	}
@@ -364,7 +364,8 @@ get_next_alias (const char *match, struct aliasent *result,
 
 
 enum nss_status
-_nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen)
+_nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen,
+			  int *errnop)
 {
   /* Return next entry in host file.  */
   enum nss_status status = NSS_STATUS_SUCCESS;
@@ -391,7 +392,7 @@ _nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen)
 
 	  /* Read lines until we get a definite result.  */
 	  do
-	    status = get_next_alias (NULL, result, buffer, buflen);
+	    status = get_next_alias (NULL, result, buffer, buflen, errnop);
 	  while (status == NSS_STATUS_RETURN);
 
 	  /* If we successfully read an entry remember this position.  */
@@ -410,7 +411,7 @@ _nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen)
 
 enum nss_status
 _nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
-			     char *buffer, size_t buflen)
+			     char *buffer, size_t buflen, int *errnop)
 {
   /* Return next entry in host file.  */
   enum nss_status status = NSS_STATUS_SUCCESS;
@@ -433,7 +434,7 @@ _nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
 
       /* Read lines until we get a definite result.  */
       do
-	status = get_next_alias (name, result, buffer, buflen);
+	status = get_next_alias (name, result, buffer, buflen, errnop);
       while (status == NSS_STATUS_RETURN);
     }
 
diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c
index 7552d4c3b1..eb6e673ad0 100644
--- a/nss/nss_files/files-netgrp.c
+++ b/nss/nss_files/files-netgrp.c
@@ -162,7 +162,7 @@ _nss_files_endnetgrent (struct __netgrent *result)
 
 enum nss_status
 _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
-			 char *buffer, int buflen)
+			 char *buffer, size_t buflen, int *errnop)
 {
   enum nss_status status;
   const char *host, *user, *domain;
@@ -227,7 +227,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
      to the private buffer we have to make sure it is big enough.  */
   if (cp - host > buflen)
     {
-      __set_errno (ERANGE);
+      *errnop = ERANGE;
       status = NSS_STATUS_UNAVAIL;
     }
   else
@@ -258,11 +258,13 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
 
 
 enum nss_status
-_nss_files_getnetgrent_r (struct __netgrent *result, char *buffer, int buflen)
+_nss_files_getnetgrent_r (struct __netgrent *result, char *buffer,
+			  size_t buflen, int *errnop)
 {
   enum nss_status status;
 
-  status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen);
+  status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen,
+				    errnop);
 
   return status;
 }
diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
index acf673da90..76df1c6ff0 100644
--- a/nss/nss_files/files-parse.c
+++ b/nss/nss_files/files-parse.c
@@ -69,7 +69,7 @@ struct parser_data
 
 /* The parser is defined in a different module.  */
 extern int parse_line (char *line, struct STRUCTURE *result,
-		       struct parser_data *data, size_t datalen);
+		       struct parser_data *data, size_t datalen, int *errnop);
 
 # define LINE_PARSER(EOLSET, BODY) /* Do nothing */
 
@@ -80,7 +80,7 @@ extern int parse_line (char *line, struct STRUCTURE *result,
 # define LINE_PARSER(EOLSET, BODY)					      \
 parser_stclass int							      \
 parse_line (char *line, struct STRUCTURE *result,			      \
-	    struct parser_data *data, size_t datalen)			      \
+	    struct parser_data *data, size_t datalen, int *errnop)	      \
 {									      \
   ENTDATA_DECL (data)							      \
   char *p = strpbrk (line, EOLSET "\n");				      \
@@ -148,7 +148,7 @@ parse_line (char *line, struct STRUCTURE *result,			      \
 
 #  define TRAILING_LIST_PARSER						      \
 {									      \
-  char **list = parse_list (line, data, datalen);			      \
+  char **list = parse_list (line, data, datalen, errnop);		      \
   if (list)								      \
     result->TRAILING_LIST_MEMBER = list;				      \
   else 									      \
@@ -156,7 +156,7 @@ parse_line (char *line, struct STRUCTURE *result,			      \
 }
 
 static inline char **
-parse_list (char *line, struct parser_data *data, size_t datalen)
+parse_list (char *line, struct parser_data *data, size_t datalen, int *errnop)
 {
   char *eol, **list, **p;
 
@@ -183,7 +183,7 @@ parse_list (char *line, struct parser_data *data, size_t datalen)
       if ((size_t) ((char *) &p[1] - (char *) data) > datalen)
 	{
 	  /* We cannot fit another pointer in the buffer.  */
-	  __set_errno (ERANGE);
+	  *errnop = ERANGE;
 	  return NULL;
 	}
       if (*line == '\0')