diff options
author | 2011-12-20 21:41:11 +0000 | |
---|---|---|
committer | 2011-12-20 21:41:11 +0000 | |
commit | 028a2f531d2c69747d239102a16dc0a9044afea1 (patch) | |
tree | eb2fb84de2a29396760278671d5a732eff310a48 /mandocdb.c | |
parent | 0d9470784d26b2926cea58b30ad4c1587cbedb14 (diff) | |
download | mandoc-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 'mandocdb.c')
-rw-r--r-- | mandocdb.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -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); |