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.2 retrieving revision 1.33.2.1 diff -u -p -r1.2 -r1.33.2.1 --- src/lib/libc/gen/getcap.c 1993/06/08 16:49:53 1.2 +++ src/lib/libc/gen/getcap.c 2001/10/26 18:06:41 1.33.2.1 @@ -1,6 +1,8 @@ +/* $NetBSD: getcap.c,v 1.33.2.1 2001/10/26 18:06:41 jhawk Exp $ */ + /*- - * Copyright (c) 1992 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Casey Leedom of Lawrence Livermore National Laboratory. @@ -34,12 +36,19 @@ * SUCH DAMAGE. */ +#include #if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)getcap.c 5.15 (Berkeley) 3/19/93"; +#if 0 +static char sccsid[] = "@(#)getcap.c 8.3 (Berkeley) 3/25/94"; +#else +__RCSID("$NetBSD: getcap.c,v 1.33.2.1 2001/10/26 18:06:41 jhawk Exp $"); +#endif #endif /* LIBC_SCCS and not lint */ +#include "namespace.h" #include +#include #include #include #include @@ -50,6 +59,19 @@ static char sccsid[] = "@(#)getcap.c 5.1 #include #include +#ifdef __weak_alias +__weak_alias(cgetcap,_cgetcap) +__weak_alias(cgetclose,_cgetclose) +__weak_alias(cgetent,_cgetent) +__weak_alias(cgetfirst,_cgetfirst) +__weak_alias(cgetmatch,_cgetmatch) +__weak_alias(cgetnext,_cgetnext) +__weak_alias(cgetnum,_cgetnum) +__weak_alias(cgetset,_cgetset) +__weak_alias(cgetstr,_cgetstr) +__weak_alias(cgetustr,_cgetustr) +#endif + #define BFRAG 1024 #define BSIZE 1024 #define ESC ('[' & 037) /* ASCII ESC */ @@ -64,8 +86,8 @@ static size_t topreclen; /* toprec leng static char *toprec; /* Additional record specified by cgetset() */ static int gottoprec; /* Flag indicating retrieval of toprecord */ -static int cdbget __P((DB *, char **, char *)); -static int getent __P((char **, u_int *, char **, int, char *, int, char *)); +static int cdbget __P((DB *, char **, const char *)); +static int getent __P((char **, size_t *, char **, int, const char *, int, char *)); static int nfcmp __P((char *, char *)); /* @@ -75,8 +97,11 @@ static int nfcmp __P((char *, char *)); */ int cgetset(ent) - char *ent; + const char *ent; { + const char *source, *check; + char *dest; + if (ent == NULL) { if (toprec) free(toprec); @@ -90,7 +115,25 @@ cgetset(ent) return (-1); } gottoprec = 0; - (void)strcpy(toprec, ent); + + source=ent; + dest=toprec; + while (*source) { /* Strip whitespace */ + *dest++ = *source++; /* Do not check first field */ + while (*source == ':') { + check=source+1; + while (*check && (isspace((unsigned char)*check) || + (*check=='\\' && isspace((unsigned char)check[1])))) + ++check; + if( *check == ':' ) + source=check; + else + break; + + } + } + *dest=0; + return (0); } @@ -108,10 +151,15 @@ cgetset(ent) */ char * cgetcap(buf, cap, type) - char *buf, *cap; + char *buf; + const char *cap; int type; { - register char *bp, *cp; + char *bp; + const char *cp; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(cap != NULL); bp = buf; for (;;) { @@ -160,9 +208,14 @@ cgetcap(buf, cap, type) */ int cgetent(buf, db_array, name) - char **buf, **db_array, *name; + char **buf, **db_array; + const char *name; { - u_int dummy; + size_t dummy; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(db_array != NULL); + _DIAGASSERT(name != NULL); return (getent(buf, &dummy, db_array, -1, name, 0, NULL)); } @@ -187,18 +240,26 @@ cgetent(buf, db_array, name) */ static int getent(cap, len, db_array, fd, name, depth, nfield) - char **cap, **db_array, *name, *nfield; - u_int *len; + char **cap, **db_array, *nfield; + const char *name; + size_t *len; int fd, depth; { DB *capdbp; - DBT key, data; - register char *r_end, *rp, **db_p; - int myfd, eof, foundit, retval; - char *record; + char *r_end, *rp = NULL, **db_p; /* pacify gcc */ + int myfd = 0, eof, foundit, retval; + size_t clen; + char *record, *cbuf, *newrecord; int tc_not_resolved; char pbuf[_POSIX_PATH_MAX]; + _DIAGASSERT(cap != NULL); + _DIAGASSERT(len != NULL); + _DIAGASSERT(db_array != NULL); + /* fd may be -1 */ + _DIAGASSERT(name != NULL); + /* nfield may be NULL */ + /* * Return with ``loop detected'' error if we've recursed more than * MAX_RECURSION times. @@ -214,8 +275,7 @@ getent(cap, len, db_array, fd, name, dep errno = ENOMEM; return (-2); } - (void)strcpy(record, toprec); - myfd = 0; + (void)strcpy(record, toprec); /* XXX: strcpy is safe */ db_p = db_array; rp = record + topreclen + 1; r_end = rp + BFRAG; @@ -242,28 +302,37 @@ getent(cap, len, db_array, fd, name, dep */ if (fd >= 0) { - (void)lseek(fd, (off_t)0, L_SET); - myfd = 0; + (void)lseek(fd, (off_t)0, SEEK_SET); } else { (void)snprintf(pbuf, sizeof(pbuf), "%s.db", *db_p); if ((capdbp = dbopen(pbuf, O_RDONLY, 0, DB_HASH, 0)) != NULL) { free(record); retval = cdbget(capdbp, &record, name); - if (capdbp->close(capdbp) < 0) + if (retval < 0) { + /* no record available */ + (void)capdbp->close(capdbp); + return (retval); + } + /* save the data; close frees it */ + clen = strlen(record); + cbuf = malloc(clen + 1); + memmove(cbuf, record, clen + 1); + if (capdbp->close(capdbp) < 0) { + int serrno = errno; + + free(cbuf); + errno = serrno; return (-2); - *len = strlen(record); - *cap = malloc(*len + 1); - memmove(*cap, record, *len + 1); + } + *len = clen; + *cap = cbuf; return (retval); } else { fd = open(*db_p, O_RDONLY, 0); if (fd < 0) { /* No error on unfound file. */ - if (errno == ENOENT) - continue; - free(record); - return (-2); + continue; } myfd = 1; } @@ -273,8 +342,8 @@ getent(cap, len, db_array, fd, name, dep */ { char buf[BUFSIZ]; - register char *b_end, *bp; - register int c; + char *b_end, *bp, *cp; + int c, slash; /* * Loop invariants: @@ -283,9 +352,12 @@ getent(cap, len, db_array, fd, name, dep * Rp always points just past last character in record. * B_end always points just past last character in buf. * Bp always points at next character in buf. + * Cp remembers where the last colon was. */ b_end = buf; bp = buf; + cp = 0; + slash = 0; for (;;) { /* @@ -302,7 +374,10 @@ getent(cap, len, db_array, fd, name, dep if (myfd) (void)close(fd); if (n < 0) { + int serrno = errno; + free(record); + errno = serrno; return (-2); } else { fd = -1; @@ -316,12 +391,37 @@ getent(cap, len, db_array, fd, name, dep c = *bp++; if (c == '\n') { - if (rp > record && *(rp-1) == '\\') { + if (slash) { + slash = 0; rp--; continue; } else break; } + if (slash) { + slash = 0; + cp = 0; + } + if (c == ':') { + /* + * If the field was `empty' (i.e. + * contained only white space), back up + * to the colon (eliminating the + * field). + */ + if (cp) + rp = cp; + else + cp = rp; + } else if (c == '\\') { + slash = 1; + } else if (c != ' ' && c != '\t') { + /* + * Forget where the colon was, as this + * is not an empty field. + */ + cp = 0; + } *rp++ = c; /* @@ -335,18 +435,23 @@ getent(cap, len, db_array, fd, name, dep pos = rp - record; newsize = r_end - record + BFRAG; - record = realloc(record, newsize); - if (record == NULL) { - errno = ENOMEM; + newrecord = realloc(record, newsize); + if (newrecord == NULL) { + free(record); if (myfd) (void)close(fd); + errno = ENOMEM; return (-2); } + record = newrecord; r_end = record + newsize; rp = record + pos; } } - /* loop invariant let's us do this */ + /* Eliminate any white space after the last colon. */ + if (cp) + rp = cp + 1; + /* Loop invariant lets us do this. */ *rp++ = '\0'; /* @@ -384,9 +489,8 @@ getent(cap, len, db_array, fd, name, dep * references in it ... */ tc_exp: { - register char *newicap, *s; - register int newilen; - u_int ilen; + char *newicap, *s; + size_t ilen, newilen; int diff, iret, tclen; char *icap, *scan, *tc, *tcstart, *tcend; @@ -475,14 +579,16 @@ tc_exp: { newsize = r_end - record + diff + BFRAG; tcpos = tcstart - record; tcposend = tcend - record; - record = realloc(record, newsize); - if (record == NULL) { - errno = ENOMEM; + newrecord = realloc(record, newsize); + if (newrecord == NULL) { + free(record); if (myfd) (void)close(fd); free(icap); + errno = ENOMEM; return (-2); } + record = newrecord; r_end = record + newsize; rp = record + pos; tcstart = record + tcpos; @@ -493,8 +599,8 @@ tc_exp: { * Insert tc'ed record into our record. */ s = tcstart + newilen; - bcopy(tcend, s, rp - tcend); - bcopy(newicap, tcstart, newilen); + memmove(s, tcend, (size_t)(rp - tcend)); + memmove(tcstart, newicap, newilen); rp += diff; free(icap); @@ -513,12 +619,15 @@ tc_exp: { if (myfd) (void)close(fd); *len = rp - record - 1; /* don't count NUL */ - if (r_end > rp) - if ((record = + if (r_end > rp) { + if ((newrecord = realloc(record, (size_t)(rp - record))) == NULL) { + free(record); errno = ENOMEM; return (-2); } + record = newrecord; + } *cap = record; if (tc_not_resolved) @@ -529,13 +638,18 @@ tc_exp: { static int cdbget(capdbp, bp, name) DB *capdbp; - char **bp, *name; + char **bp; + const char *name; { - DBT key, data; - char *buf; - int st; + DBT key; + DBT data; + + _DIAGASSERT(capdbp != NULL); + _DIAGASSERT(bp != NULL); + _DIAGASSERT(name != NULL); - key.data = name; + /* LINTED key is not modified */ + key.data = (char *)name; key.size = strlen(name); for (;;) { @@ -565,9 +679,12 @@ cdbget(capdbp, bp, name) */ int cgetmatch(buf, name) - char *buf, *name; + const char *buf, *name; { - register char *np, *bp; + const char *np, *bp; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(name != NULL); /* * Start search at beginning of record. @@ -579,19 +696,22 @@ cgetmatch(buf, name) */ np = name; for (;;) - if (*np == '\0') + if (*np == '\0') { if (*bp == '|' || *bp == ':' || *bp == '\0') return (0); else break; - else + } else if (*bp++ != *np++) break; /* * Match failed, skip to next name in record. */ - bp--; /* a '|' or ':' may have stopped the match */ + if (bp > buf) + bp--; /* a '|' or ':' may have stopped the match */ + else + return (-1); for (;;) if (*bp == '\0' || *bp == ':') return (-1); /* match failed totally */ @@ -601,14 +721,14 @@ cgetmatch(buf, name) } } - - - - int cgetfirst(buf, db_array) char **buf, **db_array; { + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(db_array != NULL); + (void)cgetclose(); return (cgetnext(buf, db_array)); } @@ -637,13 +757,16 @@ cgetclose() */ int cgetnext(bp, db_array) - register char **bp; + char **bp; char **db_array; { size_t len; - int status, i, done; + int status, done; char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE]; - u_int dummy; + size_t dummy; + + _DIAGASSERT(bp != NULL); + _DIAGASSERT(db_array != NULL); if (dbp == NULL) dbp = db_array; @@ -657,13 +780,14 @@ cgetnext(bp, db_array) gottoprec = 1; line = toprec; } else { - line = fgetline(pfp, &len); + line = fgetln(pfp, &len); if (line == NULL && pfp) { - (void)fclose(pfp); if (ferror(pfp)) { (void)cgetclose(); return (-1); } else { + (void)fclose(pfp); + pfp = NULL; if (*++dbp == NULL) { (void)cgetclose(); return (0); @@ -674,20 +798,21 @@ cgetnext(bp, db_array) } else continue; } - } - if (len == 0) { + } else + line[len - 1] = '\0'; + if (len == 1) { slash = 0; continue; } - if (isspace(*line) || + if (isspace((unsigned char)*line) || *line == ':' || *line == '#' || slash) { - if (line[len - 1] == '\\') + if (line[len - 2] == '\\') slash = 1; else slash = 0; continue; } - if (line[len - 1] == '\\') + if (line[len - 2] == '\\') slash = 1; else slash = 0; @@ -697,7 +822,6 @@ cgetnext(bp, db_array) /* * Line points to a name line. */ - i = 0; done = 0; np = nbuf; for (;;) { @@ -715,18 +839,22 @@ cgetnext(bp, db_array) *np = '\0'; break; } else { /* name field extends beyond the line */ - line = fgetline(pfp, &len); + line = fgetln(pfp, &len); if (line == NULL && pfp) { - (void)fclose(pfp); if (ferror(pfp)) { (void)cgetclose(); return (-1); } - } + (void)fclose(pfp); + pfp = NULL; + *np = '\0'; + break; + } else + line[len - 1] = '\0'; } } rp = buf; - for(cp = nbuf; *cp != NULL; cp++) + for(cp = nbuf; *cp != '\0'; cp++) if (*cp == '|' || *cp == ':') break; else @@ -761,13 +889,19 @@ cgetnext(bp, db_array) */ int cgetstr(buf, cap, str) - char *buf, *cap; + char *buf; + const char *cap; char **str; { - register u_int m_room; - register char *bp, *mp; + u_int m_room; + const char *bp; + char *mp; int len; - char *mem; + char *mem, *newmem; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(cap != NULL); + _DIAGASSERT(str != NULL); /* * Find string capability cap @@ -804,7 +938,7 @@ cgetstr(buf, cap, str) if (*bp == ':' || *bp == '\0') break; /* drop unfinished escape */ if ('0' <= *bp && *bp <= '7') { - register int n, i; + int n, i; n = 0; i = 3; /* maximum of three octal digits */ @@ -854,8 +988,11 @@ cgetstr(buf, cap, str) if (m_room == 0) { size_t size = mp - mem; - if ((mem = realloc(mem, size + SFRAG)) == NULL) + if ((newmem = realloc(mem, size + SFRAG)) == NULL) { + free(mem); return (-2); + } + mem = newmem; m_room = SFRAG; mp = mem + size; } @@ -867,9 +1004,13 @@ cgetstr(buf, cap, str) /* * Give back any extra memory and return value and success. */ - if (m_room != 0) - if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL) + if (m_room != 0) { + if ((newmem = realloc(mem, (size_t)(mp - mem))) == NULL) { + free(mem); return (-2); + } + mem = newmem; + } *str = mem; return (len); } @@ -886,12 +1027,19 @@ cgetstr(buf, cap, str) */ int cgetustr(buf, cap, str) - char *buf, *cap, **str; + char *buf; + const char *cap; + char **str; { - register u_int m_room; - register char *bp, *mp; + u_int m_room; + const char *bp; + char *mp; int len; - char *mem; + char *mem, *newmem; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(cap != NULL); + _DIAGASSERT(str != NULL); /* * Find string capability cap @@ -927,8 +1075,11 @@ cgetustr(buf, cap, str) if (m_room == 0) { size_t size = mp - mem; - if ((mem = realloc(mem, size + SFRAG)) == NULL) + if ((newmem = realloc(mem, size + SFRAG)) == NULL) { + free(mem); return (-2); + } + mem = newmem; m_room = SFRAG; mp = mem + size; } @@ -940,9 +1091,13 @@ cgetustr(buf, cap, str) /* * Give back any extra memory and return value and success. */ - if (m_room != 0) - if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL) + if (m_room != 0) { + if ((newmem = realloc(mem, (size_t)(mp - mem))) == NULL) { + free(mem); return (-2); + } + mem = newmem; + } *str = mem; return (len); } @@ -955,12 +1110,17 @@ cgetustr(buf, cap, str) */ int cgetnum(buf, cap, num) - char *buf, *cap; + char *buf; + const char *cap; long *num; { - register long n; - register int base, digit; - register char *bp; + long n; + int base, digit; + const char *bp; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(cap != NULL); + _DIAGASSERT(num != NULL); /* * Find numeric capability cap @@ -1023,7 +1183,10 @@ nfcmp(nf, rec) { char *cp, tmp; int ret; - + + _DIAGASSERT(nf != NULL); + _DIAGASSERT(rec != NULL); + for (cp = rec; *cp != ':'; cp++) ;