Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8059:25ff4c990c23 HEAD
dict-db: Don't assume bdb returns aligned memory addresses.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 24 Jul 2008 22:18:29 +0300 |
parents | 17d8b197641b |
children | 4bfe7618743e |
files | src/lib-dict/dict-db.c |
diffstat | 1 files changed, 10 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-dict/dict-db.c Thu Jul 24 02:31:37 2008 +0300 +++ b/src/lib-dict/dict-db.c Thu Jul 24 22:18:29 2008 +0300 @@ -175,6 +175,7 @@ const char **key_r, const char **value_r) { struct db_dict *dict = (struct db_dict *)ctx->ctx.dict; + uint32_t value; if (ret == DB_NOTFOUND) return 0; @@ -187,8 +188,10 @@ switch (dict->value_type) { case DICT_DATA_TYPE_UINT32: i_assert(ctx->pdata.size == sizeof(uint32_t)); - *value_r = p_strdup(ctx->pool, - dec2str(*((uint32_t *)ctx->pdata.data))); + + /* data may not be aligned, so use memcpy() */ + memcpy(&value, ctx->pdata.data, sizeof(value)); + *value_r = p_strdup(ctx->pool, dec2str(value)); break; case DICT_DATA_TYPE_STRING: *value_r = p_strndup(ctx->pool, @@ -203,6 +206,7 @@ { struct db_dict *dict = (struct db_dict *)_dict; DBT pkey, pdata; + uint32_t value; int ret; memset(&pkey, 0, sizeof(DBT)); @@ -220,7 +224,10 @@ switch (dict->value_type) { case DICT_DATA_TYPE_UINT32: i_assert(pdata.size == sizeof(uint32_t)); - *value_r = p_strdup(pool, dec2str(*((uint32_t *)pdata.data))); + + /* data may not be aligned, so use memcpy() */ + memcpy(&value, pdata.data, sizeof(value)); + *value_r = p_strdup(pool, dec2str(value)); break; case DICT_DATA_TYPE_STRING: *value_r = p_strndup(pool, pdata.data, pdata.size);