=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mandocdb.c,v retrieving revision 1.15 retrieving revision 1.16 diff -c -r1.15 -r1.16 *** src/usr.bin/mandoc/mandocdb.c 2011/11/29 22:30:56 1.15 --- src/usr.bin/mandoc/mandocdb.c 2011/12/01 23:22:09 1.16 *************** *** 1,4 **** ! /* $Id: mandocdb.c,v 1.15 2011/11/29 22:30:56 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze --- 1,4 ---- ! /* $Id: mandocdb.c,v 1.16 2011/12/01 23:22:09 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze *************** *** 626,634 **** val.size = sizeof(struct db_val); val.data = &vbuf; - if (verb > 1) - printf("%s: Added keyword: %s\n", - fn, (char *)key.data); dbt_put(db, dbf, &key, &val); } if (ch < 0) { --- 626,631 ---- *************** *** 652,657 **** --- 649,655 ---- if (verb) printf("%s: Added index\n", fn); + dbt_put(idx, idxf, &key, &val); } } *************** *** 668,674 **** recno_t *maxrec, recno_t **recs, size_t *recsz) { const struct of *of; ! const char *fn; struct db_val *vbuf; unsigned seq, sseq; DBT key, val; --- 666,672 ---- recno_t *maxrec, recno_t **recs, size_t *recsz) { const struct of *of; ! const char *fn, *cp; struct db_val *vbuf; unsigned seq, sseq; DBT key, val; *************** *** 680,697 **** while (0 == (ch = (*idx->seq)(idx, &key, &val, seq))) { seq = R_NEXT; *maxrec = *(recno_t *)key.data; ! if (0 == val.size) { ! if (reccur >= *recsz) { ! *recsz += MANDOC_SLOP; ! *recs = mandoc_realloc(*recs, ! *recsz * sizeof(recno_t)); ! } ! (*recs)[(int)reccur] = *maxrec; ! reccur++; ! continue; ! } ! fn = (char *)val.data; for (of = ofile; of; of = of->next) if (0 == strcmp(fn, of->fname)) break; --- 678,709 ---- while (0 == (ch = (*idx->seq)(idx, &key, &val, seq))) { seq = R_NEXT; *maxrec = *(recno_t *)key.data; ! cp = val.data; ! /* Deleted records are zero-sized. Skip them. */ ! ! if (0 == val.size) ! goto cont; ! ! /* ! * Make sure we're sane. ! * Read past our mdoc/man/cat type to the next string, ! * then make sure it's bounded by a NUL. ! * Failing any of these, we go into our error handler. ! */ ! ! if (NULL == (fn = memchr(cp, '\0', val.size))) ! break; ! if (++fn - cp >= (int)val.size) ! break; ! if (NULL == memchr(fn, '\0', val.size - (fn - cp))) ! break; ! ! /* ! * Search for the file in those we care about. ! * XXX: build this into a tree. Too slow. ! */ ! for (of = ofile; of; of = of->next) if (0 == strcmp(fn, of->fname)) break; *************** *** 699,721 **** if (NULL == of) continue; sseq = R_FIRST; while (0 == (ch = (*db->seq)(db, &key, &val, sseq))) { sseq = R_NEXT; ! assert(sizeof(struct db_val) == val.size); vbuf = val.data; if (*maxrec != vbuf->rec) continue; ! if (verb) ! printf("%s: Deleted keyword: %s\n", ! fn, (char *)key.data); ! ch = (*db->del)(db, &key, R_CURSOR); ! if (ch < 0) break; } if (ch < 0) { perror(dbf); exit((int)MANDOCLEVEL_SYSERR); } if (verb) --- 711,741 ---- if (NULL == of) continue; + /* + * Search through the keyword database, throwing out all + * references to our file. + */ + sseq = R_FIRST; while (0 == (ch = (*db->seq)(db, &key, &val, sseq))) { sseq = R_NEXT; ! if (sizeof(struct db_val) != val.size) ! break; ! vbuf = val.data; if (*maxrec != vbuf->rec) continue; ! ! if ((ch = (*db->del)(db, &key, R_CURSOR)) < 0) break; } + if (ch < 0) { perror(dbf); exit((int)MANDOCLEVEL_SYSERR); + } else if (1 != ch) { + fprintf(stderr, "%s: Corrupt database\n", dbf); + exit((int)MANDOCLEVEL_SYSERR); } if (verb) *************** *** 723,733 **** val.size = 0; ch = (*idx->put)(idx, &key, &val, R_CURSOR); - if (ch < 0) { - perror(idxf); - exit((int)MANDOCLEVEL_SYSERR); - } if (reccur >= *recsz) { *recsz += MANDOC_SLOP; *recs = mandoc_realloc --- 743,752 ---- val.size = 0; ch = (*idx->put)(idx, &key, &val, R_CURSOR); + if (ch < 0) + break; + cont: if (reccur >= *recsz) { *recsz += MANDOC_SLOP; *recs = mandoc_realloc *************** *** 737,742 **** --- 756,770 ---- (*recs)[(int)reccur] = *maxrec; reccur++; } + + if (ch < 0) { + perror(idxf); + exit((int)MANDOCLEVEL_SYSERR); + } else if (1 != ch) { + fprintf(stderr, "%s: Corrupt index\n", idxf); + exit((int)MANDOCLEVEL_SYSERR); + } + (*maxrec)++; }