Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Apr 2010 03:52:41 +0000 (UTC)
From:      Hajimu UMEMOTO <ume@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r206783 - stable/8/lib/libc/net
Message-ID:  <201004180352.o3I3qf1q061982@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ume
Date: Sun Apr 18 03:52:41 2010
New Revision: 206783
URL: http://svn.freebsd.org/changeset/base/206783

Log:
  MFC ir206152, r206153, r206154:
  - Stop adding trailing '\n'.  The servent_unpack() doesn't expect
    lines terminated with '\n'.
  - Treat '+' as special only when in compat mode, and simplify
    the logic bit.
  - Reduce duplicate code.

Modified:
  stable/8/lib/libc/net/getservent.c
Directory Properties:
  stable/8/lib/libc/   (props changed)
  stable/8/lib/libc/stdtime/   (props changed)

Modified: stable/8/lib/libc/net/getservent.c
==============================================================================
--- stable/8/lib/libc/net/getservent.c	Sun Apr 18 01:15:47 2010	(r206782)
+++ stable/8/lib/libc/net/getservent.c	Sun Apr 18 03:52:41 2010	(r206783)
@@ -207,6 +207,32 @@ servent_unpack(char *p, struct servent *
 	return 0;
 }
 
+static int
+parse_result(struct servent *serv, char *buffer, size_t bufsize,
+    char *resultbuf, size_t resultbuflen, int *errnop)
+{
+	char **aliases;
+	int aliases_size;
+
+	if (bufsize <= resultbuflen + _ALIGNBYTES + sizeof(char *)) {
+		*errnop = ERANGE;
+		return (NS_RETURN);
+	}
+	aliases = (char **)_ALIGN(&buffer[resultbuflen + 1]);
+	aliases_size = (buffer + bufsize - (char *)aliases) / sizeof(char *);
+	if (aliases_size < 1) {
+		*errnop = ERANGE;
+		return (NS_RETURN);
+	}
+
+	memcpy(buffer, resultbuf, resultbuflen);
+	buffer[resultbuflen] = '\0';
+
+	if (servent_unpack(buffer, serv, aliases, aliases_size, errnop) != 0)
+		return ((*errnop == 0) ? NS_NOTFOUND : NS_RETURN);
+	return (NS_SUCCESS);
+}
+
 /* files backend implementation */
 static	void
 files_endstate(void *p)
@@ -258,8 +284,6 @@ files_servent(void *retval, void *mdata,
 	size_t bufsize;
 	int *errnop;
 
-	char **aliases;
-	int aliases_size;
 	size_t linesize;
 	char *line;
 	char **cp;
@@ -315,28 +339,8 @@ files_servent(void *retval, void *mdata,
 				break;
 			}
 
-			if (*line=='+') {
-				if (serv_mdata->compat_mode != 0)
-					st->compat_mode_active = 1;
-			} else {
-				if (bufsize <= linesize + _ALIGNBYTES +
-				    sizeof(char *)) {
-					*errnop = ERANGE;
-					rv = NS_RETURN;
-					break;
-				}
-				aliases = (char **)_ALIGN(&buffer[linesize+1]);
-				aliases_size = (buffer + bufsize -
-				    (char *)aliases) / sizeof(char *);
-				if (aliases_size < 1) {
-					*errnop = ERANGE;
-					rv = NS_RETURN;
-					break;
-				}
-
-				memcpy(buffer, line, linesize);
-				buffer[linesize] = '\0';
-			}
+			if (*line=='+' && serv_mdata->compat_mode != 0)
+				st->compat_mode_active = 1;
 		}
 
 		if (st->compat_mode_active != 0) {
@@ -367,18 +371,12 @@ files_servent(void *retval, void *mdata,
 			continue;
 		}
 
-		rv = servent_unpack(buffer, serv, aliases, aliases_size,
+		rv = parse_result(serv, buffer, bufsize, line, linesize,
 		    errnop);
-		if (rv !=0 ) {
-			if (*errnop == 0) {
-				rv = NS_NOTFOUND;
-				continue;
-			}
-			else {
-				rv = NS_RETURN;
-				break;
-			}
-		}
+		if (rv == NS_NOTFOUND)
+			continue;
+		if (rv == NS_RETURN)
+			break;
 
 		rv = NS_NOTFOUND;
 		switch (serv_mdata->how) {
@@ -486,9 +484,6 @@ nis_servent(void *retval, void *mdata, v
 	size_t bufsize;
 	int *errnop;
 
-	char **aliases;
-	int aliases_size;
-
 	name = NULL;
 	proto = NULL;
 	how = (enum nss_lookup_type)mdata;
@@ -594,39 +589,8 @@ nis_servent(void *retval, void *mdata, v
 			break;
 		};
 
-		/* we need a room for additional \n symbol */
-		if (bufsize <=
-		    resultbuflen + 1 + _ALIGNBYTES + sizeof(char *)) {
-			*errnop = ERANGE;
-			rv = NS_RETURN;
-			break;
-		}
-
-		aliases = (char **)_ALIGN(&buffer[resultbuflen + 2]);
-		aliases_size =
-		    (buffer + bufsize - (char *)aliases) / sizeof(char *);
-		if (aliases_size < 1) {
-			*errnop = ERANGE;
-			rv = NS_RETURN;
-			break;
-		}
-
-		/*
-		 * servent_unpack expects lines terminated with \n --
-		 * make it happy
-		 */
-		memcpy(buffer, resultbuf, resultbuflen);
-		buffer[resultbuflen] = '\n';
-		buffer[resultbuflen + 1] = '\0';
-
-		if (servent_unpack(buffer, serv, aliases, aliases_size,
-		    errnop) != 0) {
-			if (*errnop == 0)
-				rv = NS_NOTFOUND;
-			else
-				rv = NS_RETURN;
-		} else
-			rv = NS_SUCCESS;
+		rv = parse_result(serv, buffer, bufsize, resultbuf,
+		    resultbuflen, errnop);
 		free(resultbuf);
 
 	} while (!(rv & NS_TERMINATE) && how == nss_lt_all);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004180352.o3I3qf1q061982>