From: Timo Sirainen Date: Thu, 24 Jul 2008 19:18:29 +0000 (+0300) Subject: dict-db: Don't assume bdb returns aligned memory addresses. X-Git-Tag: 1.2.alpha1~102 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f93fe6ff6e5f79f7cb8060f228a7b7553d010443;p=thirdparty%2Fdovecot%2Fcore.git dict-db: Don't assume bdb returns aligned memory addresses. --HG-- branch : HEAD --- 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);