PR libc/1827
Mark Kettenis
kettenis@wins.uva.nl
Tue Jul 25 14:36:00 GMT 2000
This report was very unclear. I asked for clarification, and got back
some more junk, but got enough information out of it to find out what
the problem is.
Our netgroup parser doesn't strip off any whitespace from the
netgroup parts, and therefore matching done against them might fail.
Thus right now the netgroup
( foo , bar,foobar.net )
gives host = " foo ", user = "bar " and domain = "foobar.net ".
Attached is an *untested* patch to correct this. It would be great if
anyone actually using netgroups could test this patch
2000-07-25 Mark Kettenis <kettenis@gnu.org>
* nss/nss_files/files-netgrp.c (strip_whitespace): New function.
(_nss_netgroup_parseline): Use strip_whitespace to strip off any
leading and trailing spaces from host, user and domain name.
Index: nss/nss_files/files-netgrp.c
===================================================================
RCS file: /cvs/glibc/libc/nss/nss_files/files-netgrp.c,v
retrieving revision 1.9
diff -u -p -r1.9 files-netgrp.c
--- nss/nss_files/files-netgrp.c 1997/12/08 02:42:38 1.9
+++ nss/nss_files/files-netgrp.c 2000/07/25 21:22:21
@@ -1,5 +1,5 @@
/* Netgroup file parser in nss_files modules.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -159,6 +159,24 @@ _nss_files_endnetgrent (struct __netgren
return NSS_STATUS_SUCCESS;
}
+static char *
+strip_whitespace (char *str)
+{
+ char *cp = str;
+
+ /* Skip leading spaces. */
+ while (isspace (*cp))
+ cp++;
+
+ str = cp;
+ while (*cp != '\0' && ! isspace(*cp))
+ cp++;
+
+ /* Null-terminate, stripping off any trailing spaces. */
+ *cp = '\0';
+
+ return *str == '\0' ? NULL : str;
+}
enum nss_status
_nss_netgroup_parseline (char **cursor, struct __netgrent *result,
@@ -235,15 +253,14 @@ _nss_netgroup_parseline (char **cursor,
memcpy (buffer, host, cp - host);
result->type = triple_val;
- buffer[(user - host) - 1] = '\0';
- result->val.triple.host = *host == ',' ? NULL : buffer;
+ buffer[(user - host) - 1] = '\0'; /* Replace ',' with '\0'. */
+ result->val.triple.host = strip_whitespace (buffer);
- buffer[(domain - host) - 1] = '\0';
- result->val.triple.user = *user == ',' ? NULL : buffer + (user - host);
+ buffer[(domain - host) - 1] = '\0'; /* Replace ',' with '\0'. */
+ result->val.triple.user = strip_whitespace (buffer + (user - host));
- buffer[(cp - host) - 1] = '\0';
- result->val.triple.domain =
- *domain == ')' ? NULL : buffer + (domain - host);
+ buffer[(cp - host) - 1] = '\0'; /* Replace ')' with '\0'. */
+ result->val.triple.domain = strip_whitespace (buffer + (domain - host));
status = NSS_STATUS_SUCCESS;
More information about the Libc-hacker
mailing list