aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/apropos_db.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-12-20 21:41:11 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-12-20 21:41:11 +0000
commit028a2f531d2c69747d239102a16dc0a9044afea1 (patch)
treeeb2fb84de2a29396760278671d5a732eff310a48 /apropos_db.c
parent0d9470784d26b2926cea58b30ad4c1587cbedb14 (diff)
downloadmandoc-028a2f531d2c69747d239102a16dc0a9044afea1.tar.gz
mandoc-028a2f531d2c69747d239102a16dc0a9044afea1.tar.zst
mandoc-028a2f531d2c69747d239102a16dc0a9044afea1.zip
Do not cast void pointers to pointers requiring alignment.
This makes mandocdb(8)/apropos(1) work on strict alignment architectures. Basic way to fix this confirmed by deraadt@ and kettenis@, thanks. ok kristaps@ This now works on both sparc64 and i386, but note that the binary database format is still machine-dependent.
Diffstat (limited to 'apropos_db.c')
-rw-r--r--apropos_db.c13
1 files changed, 7 insertions, 6 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++))