The (existing) abuse of toprec is a bit kludgy but this should fix
the problem for now.
- todd
Index: lib/libc/gen/getcap.c
===================================================================
RCS file: /home/cvs/openbsd/src/lib/libc/gen/getcap.c,v
retrieving revision 1.29
diff -u -r1.29 getcap.c
--- lib/libc/gen/getcap.c 10 Jul 2011 13:31:02 -0000 1.29
+++ lib/libc/gen/getcap.c 14 Oct 2011 13:30:07 -0000
@@ -658,11 +658,12 @@
int
cgetnext(char **cap, char **db_array)
{
- size_t len;
+ size_t len, otopreclen = topreclen;
int c, serrno, status = -1;
char buf[BUFSIZ], nbuf[BSIZE];
char *b_end, *bp, *r_end, *rp;
char *record = NULL;
+ char *otoprec = toprec;
u_int dummy;
off_t pos;
@@ -677,6 +678,7 @@
*/
if (toprec && !gottoprec) {
gottoprec = 1;
+ record = toprec;
goto lookup;
}
@@ -770,7 +772,6 @@
fseeko(pfp, (off_t)(bp - b_end), SEEK_CUR);
toprec = record;
topreclen = rp - record;
- gottoprec = 1;
break;
}
}
@@ -787,7 +788,11 @@
fseeko(pfp, pos, SEEK_SET);
done:
serrno = errno;
- free(record);
+ if (toprec != otoprec) {
+ toprec = otoprec;
+ topreclen = otopreclen;
+ free(record);
+ }
if (status <= 0)
(void)cgetclose();
errno = serrno;