Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libc/gen/getcap.c,v rcsdiff: /ftp/cvs/cvsroot/src/lib/libc/gen/getcap.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.40 retrieving revision 1.47 diff -u -p -r1.40 -r1.47 --- src/lib/libc/gen/getcap.c 2004/04/23 14:47:52 1.40 +++ src/lib/libc/gen/getcap.c 2006/07/04 03:53:54 1.47 @@ -1,4 +1,4 @@ -/* $NetBSD: getcap.c,v 1.40 2004/04/23 14:47:52 christos Exp $ */ +/* $NetBSD: getcap.c,v 1.47 2006/07/04 03:53:54 jnemeth Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -41,17 +41,21 @@ #if 0 static char sccsid[] = "@(#)getcap.c 8.3 (Berkeley) 3/25/94"; #else -__RCSID("$NetBSD: getcap.c,v 1.40 2004/04/23 14:47:52 christos Exp $"); +__RCSID("$NetBSD: getcap.c,v 1.47 2006/07/04 03:53:54 jnemeth Exp $"); #endif #endif /* LIBC_SCCS and not lint */ +#ifndef SMALL #include "namespace.h" +#endif #include #include #include #include +#ifndef SMALL #include +#endif #include #include #include @@ -87,7 +91,9 @@ static size_t topreclen; /* toprec leng static char *toprec; /* Additional record specified by cgetset() */ static int gottoprec; /* Flag indicating retrieval of toprecord */ +#ifndef SMALL static int cdbget(DB *, char **, const char *); +#endif static int getent(char **, size_t *, const char * const *, int, const char *, int, char *); static int nfcmp(char *, char *); @@ -104,38 +110,38 @@ cgetset(const char *ent) char *dest; if (ent == NULL) { - if (toprec) + if (toprec != NULL) free(toprec); toprec = NULL; topreclen = 0; - return (0); + return 0; } topreclen = strlen(ent); - if ((toprec = malloc (topreclen + 1)) == NULL) { + if ((toprec = malloc(topreclen + 1)) == NULL) { errno = ENOMEM; - return (-1); + return -1; } gottoprec = 0; - source=ent; - dest=toprec; - while (*source) { /* Strip whitespace */ + source = ent; + dest = toprec; + while (*source != '\0') { /* Strip whitespace */ *dest++ = *source++; /* Do not check first field */ while (*source == ':') { - check=source+1; + check = source + 1; while (*check && (isspace((unsigned char)*check) || (*check=='\\' && isspace((unsigned char)check[1])))) ++check; - if( *check == ':' ) - source=check; + if (*check == ':') + source = check; else break; } } - *dest=0; + *dest = 0; - return (0); + return 0; } /* @@ -171,10 +177,9 @@ cgetcap(buf, cap, type) */ for (;;) if (*bp == '\0') - return (NULL); - else - if (*bp++ == ':') - break; + return NULL; + else if (*bp++ == ':') + break; /* * Try to match (cap, type) in buf. @@ -184,16 +189,16 @@ cgetcap(buf, cap, type) if (*cp != '\0') continue; if (*bp == '@') - return (NULL); + return NULL; if (type == ':') { if (*bp != '\0' && *bp != ':') continue; - return(bp); + return bp; } if (*bp != type) continue; bp++; - return (*bp == '@' ? NULL : bp); + return *bp == '@' ? NULL : bp; } /* NOTREACHED */ } @@ -207,6 +212,7 @@ cgetcap(buf, cap, type) * encountered (couldn't open/read a file, etc.), and -3 if a potential * reference loop is detected. */ +/* coverity[+alloc : arg-*0] */ int cgetent(char **buf, const char * const *db_array, const char *name) { @@ -216,7 +222,7 @@ cgetent(char **buf, const char * const * _DIAGASSERT(db_array != NULL); _DIAGASSERT(name != NULL); - return (getent(buf, &dummy, db_array, -1, name, 0, NULL)); + return getent(buf, &dummy, db_array, -1, name, 0, NULL); } /* @@ -237,18 +243,23 @@ cgetent(char **buf, const char * const * * names interpolated, a name can't be found, or depth exceeds * MAX_RECURSION. */ +/* coverity[+alloc : arg-*0] */ static int getent(char **cap, size_t *len, const char * const *db_array, int fd, const char *name, int depth, char *nfield) { +#ifndef SMALL DB *capdbp; - char *r_end, *rp = NULL; /* pacify gcc */ - const char * const *db_p; - int myfd = 0, eof, foundit, retval; + char pbuf[MAXPATHLEN]; + char *cbuf; + int retval; size_t clen; - char *record, *cbuf, *newrecord; +#endif + char *record, *newrecord; + char *r_end, *rp; /* pacify gcc */ + const char * const *db_p; + int myfd, eof, foundit; int tc_not_resolved; - char pbuf[MAXPATHLEN]; _DIAGASSERT(cap != NULL); _DIAGASSERT(len != NULL); @@ -257,20 +268,23 @@ getent(char **cap, size_t *len, const ch _DIAGASSERT(name != NULL); /* nfield may be NULL */ + myfd = 0; + rp = NULL; + /* * Return with ``loop detected'' error if we've recursed more than * MAX_RECURSION times. */ if (depth > MAX_RECURSION) - return (-3); + return -3; /* * Check if we have a top record from cgetset(). */ if (depth == 0 && toprec != NULL && cgetmatch(toprec, name) == 0) { - if ((record = malloc (topreclen + BFRAG)) == NULL) { + if ((record = malloc(topreclen + BFRAG)) == NULL) { errno = ENOMEM; - return (-2); + return -2; } (void)strcpy(record, toprec); /* XXX: strcpy is safe */ db_p = db_array; @@ -283,7 +297,7 @@ getent(char **cap, size_t *len, const ch */ if ((record = malloc(BFRAG)) == NULL) { errno = ENOMEM; - return (-2); + return -2; } r_end = record + BFRAG; foundit = 0; @@ -301,6 +315,7 @@ getent(char **cap, size_t *len, const ch if (fd >= 0) { (void)lseek(fd, (off_t)0, SEEK_SET); } else { +#ifndef SMALL (void)snprintf(pbuf, sizeof(pbuf), "%s.db", *db_p); if ((capdbp = dbopen(pbuf, O_RDONLY, 0, DB_HASH, 0)) != NULL) { @@ -309,23 +324,29 @@ getent(char **cap, size_t *len, const ch if (retval < 0) { /* no record available */ (void)capdbp->close(capdbp); - return (retval); + return retval; } /* save the data; close frees it */ clen = strlen(record); - cbuf = malloc(clen + 1); + if ((cbuf = malloc(clen + 1)) == NULL) { + (void)capdbp->close(capdbp); + errno = ENOMEM; + return -2; + } memmove(cbuf, record, clen + 1); if (capdbp->close(capdbp) < 0) { int serrno = errno; free(cbuf); errno = serrno; - return (-2); + return -2; } *len = clen; *cap = cbuf; - return (retval); - } else { + return retval; + } else +#endif + { fd = open(*db_p, O_RDONLY, 0); if (fd < 0) { /* No error on unfound file. */ @@ -353,10 +374,9 @@ getent(char **cap, size_t *len, const ch */ b_end = buf; bp = buf; - cp = 0; + cp = NULL; slash = 0; for (;;) { - /* * Read in a line implementing (\, newline) * line continuation. @@ -375,7 +395,7 @@ getent(char **cap, size_t *len, const ch free(record); errno = serrno; - return (-2); + return -2; } else { fd = -1; eof = 1; @@ -406,7 +426,7 @@ getent(char **cap, size_t *len, const ch * to the colon (eliminating the * field). */ - if (cp) + if (cp != NULL) rp = cp; else cp = rp; @@ -438,7 +458,7 @@ getent(char **cap, size_t *len, const ch if (myfd) (void)close(fd); errno = ENOMEM; - return (-2); + return -2; } record = newrecord; r_end = record + newsize; @@ -466,20 +486,19 @@ getent(char **cap, size_t *len, const ch /* * See if this is the record we want ... */ - if (cgetmatch(record, name) == 0) { + if (cgetmatch(record, name) == 0) if (nfield == NULL || !nfcmp(nfield, record)) { foundit = 1; break; /* found it! */ } - } } - } + } if (foundit) break; } if (!foundit) - return (-1); + return -1; /* * Got the capability record, but now we have to expand all tc=name @@ -532,7 +551,7 @@ tc_exp: { if (myfd) (void)close(fd); free(record); - return (iret); + return iret; } if (iret == 1) tc_not_resolved = 1; @@ -550,15 +569,14 @@ tc_exp: { for (;;) if (*s == '\0') break; - else - if (*s++ == ':') - break; + else if (*s++ == ':') + break; newilen -= s - newicap; newicap = s; /* make sure interpolated record is `:'-terminated */ s += newilen; - if (*(s-1) != ':') { + if (*(s - 1) != ':') { *s = ':'; /* overwrite NUL with : */ newilen++; } @@ -583,7 +601,7 @@ tc_exp: { (void)close(fd); free(icap); errno = ENOMEM; - return (-2); + return -2; } record = newrecord; r_end = record + newsize; @@ -605,7 +623,7 @@ tc_exp: { * Start scan on `:' so next cgetcap works properly * (cgetcap always skips first field). */ - scan = s-1; + scan = s - 1; } } @@ -621,17 +639,18 @@ tc_exp: { realloc(record, (size_t)(rp - record))) == NULL) { free(record); errno = ENOMEM; - return (-2); + return -2; } record = newrecord; } *cap = record; if (tc_not_resolved) - return (1); - return (0); + return 1; + return 0; } +#ifndef SMALL static int cdbget(DB *capdbp, char **bp, const char *name) { @@ -642,17 +661,16 @@ cdbget(DB *capdbp, char **bp, const char _DIAGASSERT(bp != NULL); _DIAGASSERT(name != NULL); - /* LINTED key is not modified */ - key.data = (char *)name; + key.data = __UNCONST(name); key.size = strlen(name); for (;;) { /* Get the reference. */ switch(capdbp->get(capdbp, &key, &data, 0)) { case -1: - return (-2); + return -2; case 1: - return (-1); + return -1; } /* If not an index to another record, leave. */ @@ -664,8 +682,9 @@ cdbget(DB *capdbp, char **bp, const char } *bp = (char *)data.data + 1; - return (((char *)(data.data))[0] == TCERR ? 1 : 0); + return ((char *)(data.data))[0] == TCERR ? 1 : 0; } +#endif /* * Cgetmatch will return 0 if name is one of the names of the capability @@ -691,12 +710,11 @@ cgetmatch(const char *buf, const char *n for (;;) if (*np == '\0') { if (*bp == '|' || *bp == ':' || *bp == '\0') - return (0); + return 0; else break; - } else - if (*bp++ != *np++) - break; + } else if (*bp++ != *np++) + break; /* * Match failed, skip to next name in record. @@ -704,13 +722,12 @@ cgetmatch(const char *buf, const char *n if (bp > buf) bp--; /* a '|' or ':' may have stopped the match */ else - return (-1); + return -1; for (;;) if (*bp == '\0' || *bp == ':') - return (-1); /* match failed totally */ - else - if (*bp++ == '|') - break; /* found next name */ + return -1; /* match failed totally */ + else if (*bp++ == '|') + break; /* found next name */ } } @@ -722,7 +739,7 @@ cgetfirst(char **buf, const char * const _DIAGASSERT(db_array != NULL); (void)cgetclose(); - return (cgetnext(buf, db_array)); + return cgetnext(buf, db_array); } static FILE *pfp; @@ -739,7 +756,7 @@ cgetclose(void) dbp = NULL; gottoprec = 0; slash = 0; - return(0); + return 0; } /* @@ -747,10 +764,11 @@ cgetclose(void) * specified by db_array. It returns 0 upon completion of the database, 1 * upon returning an entry with more remaining, and -1 if an error occurs. */ +/* coverity[+alloc : arg-*0] */ int cgetnext(char **bp, const char * const *db_array) { - size_t len; + size_t len = 0; int status, done; char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE]; size_t dummy; @@ -763,28 +781,30 @@ cgetnext(char **bp, const char * const * if (pfp == NULL && (pfp = fopen(*dbp, "r")) == NULL) { (void)cgetclose(); - return (-1); + return -1; } - for(;;) { - if (toprec && !gottoprec) { + for (;;) { + if (toprec != NULL && !gottoprec) { gottoprec = 1; line = toprec; } else { line = fgetln(pfp, &len); - if (line == NULL && pfp) { + if (line == NULL) { + if (pfp == NULL) + return -1; if (ferror(pfp)) { (void)cgetclose(); - return (-1); + return -1; } else { (void)fclose(pfp); pfp = NULL; if (*++dbp == NULL) { (void)cgetclose(); - return (0); + return 0; } else if ((pfp = fopen(*dbp, "r")) == NULL) { (void)cgetclose(); - return (-1); + return -1; } else continue; } @@ -835,7 +855,7 @@ cgetnext(char **bp, const char * const * if (line == NULL && pfp) { if (ferror(pfp)) { (void)cgetclose(); - return (-1); + return -1; } (void)fclose(pfp); pfp = NULL; @@ -848,7 +868,7 @@ cgetnext(char **bp, const char * const * if (len > sizeof(buf)) return -1; rp = buf; - for(cp = nbuf; *cp != '\0'; cp++) + for (cp = nbuf; *cp != '\0'; cp++) if (*cp == '|' || *cp == ':') break; else @@ -867,7 +887,7 @@ cgetnext(char **bp, const char * const * if (status == -2 || status == -3) (void)cgetclose(); - return (status + 1); + return status + 1; } /* NOTREACHED */ } @@ -899,7 +919,7 @@ cgetstr(char *buf, const char *cap, char */ bp = cgetcap(buf, cap, '='); if (bp == NULL) - return (-1); + return -1; /* * Conversion / storage allocation loop ... Allocate memory in @@ -907,7 +927,7 @@ cgetstr(char *buf, const char *cap, char */ if ((mem = malloc(SFRAG)) == NULL) { errno = ENOMEM; - return (-2); /* couldn't even allocate the first fragment */ + return -2; /* couldn't even allocate the first fragment */ } m_room = SFRAG; mp = mem; @@ -981,7 +1001,7 @@ cgetstr(char *buf, const char *cap, char if ((newmem = realloc(mem, size + SFRAG)) == NULL) { free(mem); - return (-2); + return -2; } mem = newmem; m_room = SFRAG; @@ -998,12 +1018,12 @@ cgetstr(char *buf, const char *cap, char if (m_room != 0) { if ((newmem = realloc(mem, (size_t)(mp - mem))) == NULL) { free(mem); - return (-2); + return -2; } mem = newmem; } *str = mem; - return (len); + return len; } /* @@ -1033,7 +1053,7 @@ cgetustr(char *buf, const char *cap, cha * Find string capability cap */ if ((bp = cgetcap(buf, cap, '=')) == NULL) - return (-1); + return -1; /* * Conversion / storage allocation loop ... Allocate memory in @@ -1041,7 +1061,7 @@ cgetustr(char *buf, const char *cap, cha */ if ((mem = malloc(SFRAG)) == NULL) { errno = ENOMEM; - return (-2); /* couldn't even allocate the first fragment */ + return -2; /* couldn't even allocate the first fragment */ } m_room = SFRAG; mp = mem; @@ -1065,7 +1085,7 @@ cgetustr(char *buf, const char *cap, cha if ((newmem = realloc(mem, size + SFRAG)) == NULL) { free(mem); - return (-2); + return -2; } mem = newmem; m_room = SFRAG; @@ -1082,12 +1102,12 @@ cgetustr(char *buf, const char *cap, cha if (m_room != 0) { if ((newmem = realloc(mem, (size_t)(mp - mem))) == NULL) { free(mem); - return (-2); + return -2; } mem = newmem; } *str = mem; - return (len); + return len; } /* @@ -1112,7 +1132,7 @@ cgetnum(char *buf, const char *cap, long */ bp = cgetcap(buf, cap, '#'); if (bp == NULL) - return (-1); + return -1; /* * Look at value and determine numeric base: @@ -1155,7 +1175,7 @@ cgetnum(char *buf, const char *cap, long * Return value and success. */ *num = n; - return (0); + return 0; } @@ -1172,12 +1192,12 @@ nfcmp(char *nf, char *rec) _DIAGASSERT(rec != NULL); for (cp = rec; *cp != ':'; cp++) - ; + continue; tmp = *(cp + 1); *(cp + 1) = '\0'; ret = strcmp(nf, rec); *(cp + 1) = tmp; - return (ret); + return ret; }