From f93fe6ff6e5f79f7cb8060f228a7b7553d010443 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 24 Jul 2008 22:18:29 +0300 Subject: [PATCH] dict-db: Don't assume bdb returns aligned memory addresses. --HG-- branch : HEAD --- src/lib-dict/dict-db.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/lib-dict/dict-db.c b/src/lib-dict/dict-db.c index 7a8294fbf0..650000ff41 100644 --- a/src/lib-dict/dict-db.c +++ b/src/lib-dict/dict-db.c @@ -175,6 +175,7 @@ static int db_dict_iterate_set(struct db_dict_iterate_context *ctx, int ret, 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 @@ static int db_dict_iterate_set(struct db_dict_iterate_context *ctx, int ret, 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 @@ static int db_dict_lookup(struct dict *_dict, pool_t pool, { 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 @@ static int db_dict_lookup(struct dict *_dict, pool_t pool, 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); -- 2.47.3