svn commit: r206783 - stable/8/lib/libc/net
Hajimu UMEMOTO
ume at FreeBSD.org
Sun Apr 18 03:52:41 UTC 2010
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);
More information about the svn-src-all
mailing list