aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--apropos_db.c13
-rw-r--r--mandocdb.c18
2 files changed, 20 insertions, 11 deletions
diff --git a/apropos_db.c b/apropos_db.c
index 20d290f0..41d78742 100644
--- a/apropos_db.c
+++ b/apropos_db.c
@@ -1,4 +1,4 @@
-/* $Id: apropos_db.c,v 1.26 2011/12/16 20:06:58 kristaps Exp $ */
+/* $Id: apropos_db.c,v 1.27 2011/12/20 21:41:11 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -171,7 +171,7 @@ btree_read(const DBT *k, const DBT *v,
const struct mchars *mc,
struct db_val *dbv, char **buf)
{
- const struct db_val *vp;
+ struct db_val raw_dbv;
/* Are our sizes sane? */
if (k->size < 2 || sizeof(struct db_val) != v->size)
@@ -181,10 +181,10 @@ btree_read(const DBT *k, const DBT *v,
if ('\0' != ((const char *)k->data)[(int)k->size - 1])
return(0);
- vp = v->data;
norm_string((const char *)k->data, mc, buf);
- dbv->rec = betoh32(vp->rec);
- dbv->mask = betoh64(vp->mask);
+ memcpy(&raw_dbv, v->data, v->size);
+ dbv->rec = betoh32(raw_dbv.rec);
+ dbv->mask = betoh64(raw_dbv.mask);
return(1);
}
@@ -380,7 +380,8 @@ index_read(const DBT *key, const DBT *val, int index,
return(0);
cp = val->data;
- rec->res.rec = *(recno_t *)key->data;
+ assert(sizeof(recno_t) == key->size);
+ memcpy(&rec->res.rec, key->data, key->size);
rec->res.volume = index;
if ('d' == (type = *cp++))
diff --git a/mandocdb.c b/mandocdb.c
index 24758a0e..ffe5996a 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -1,4 +1,4 @@
-/* $Id: mandocdb.c,v 1.36 2011/12/16 12:06:35 kristaps Exp $ */
+/* $Id: mandocdb.c,v 1.37 2011/12/20 21:41:11 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -525,6 +525,7 @@ index_merge(const struct of *of, struct mparse *mp,
struct mdoc *mdoc;
struct man *man;
const char *fn, *msec, *mtitle, *arch;
+ uint64_t mask;
size_t sv;
unsigned seq;
struct db_val vbuf;
@@ -655,7 +656,9 @@ index_merge(const struct of *of, struct mparse *mp,
seq = R_FIRST;
while (0 == (ch = (*hash->seq)(hash, &key, &val, seq))) {
seq = R_NEXT;
- vbuf.mask = htobe64(*(uint64_t *)val.data);
+ assert(sizeof(uint64_t) == val.size);
+ memcpy(&mask, val.data, val.size);
+ vbuf.mask = htobe64(mask);
val.size = sizeof(struct db_val);
val.data = &vbuf;
dbt_put(db, dbf, &key, &val);
@@ -708,7 +711,8 @@ index_prune(const struct of *ofile, DB *db, const char *dbf,
seq = R_FIRST;
while (0 == (ch = (*idx->seq)(idx, &key, &val, seq))) {
seq = R_NEXT;
- *maxrec = *(recno_t *)key.data;
+ assert(sizeof(recno_t) == key.size);
+ memcpy(maxrec, key.data, key.size);
/* Deleted records are zero-sized. Skip them. */
@@ -1068,6 +1072,7 @@ pmdoc_Sh(MDOC_ARGS)
static void
hash_put(DB *db, const struct buf *buf, uint64_t mask)
{
+ uint64_t oldmask;
DBT key, val;
int rc;
@@ -1080,8 +1085,11 @@ hash_put(DB *db, const struct buf *buf, uint64_t mask)
if ((rc = (*db->get)(db, &key, &val, 0)) < 0) {
perror("hash");
exit((int)MANDOCLEVEL_SYSERR);
- } else if (0 == rc)
- mask |= *(uint64_t *)val.data;
+ } else if (0 == rc) {
+ assert(sizeof(uint64_t) == val.size);
+ memcpy(&oldmask, val.data, val.size);
+ mask |= oldmask;
+ }
val.data = &mask;
val.size = sizeof(uint64_t);