dovecot-1.1: dict-db: Don't assume bdb returns aligned memory ad...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Jul 24 22:18:33 EEST 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/1425b6e25819
changeset: 7801:1425b6e25819
user: Timo Sirainen <tss at iki.fi>
date: Thu Jul 24 22:18:29 2008 +0300
description:
dict-db: Don't assume bdb returns aligned memory addresses.
diffstat:
1 file changed, 10 insertions(+), 3 deletions(-)
src/lib-dict/dict-db.c | 13 ++++++++++---
diffs (44 lines):
diff -r 46e9c30df5bc -r 1425b6e25819 src/lib-dict/dict-db.c
--- a/src/lib-dict/dict-db.c Thu Jul 24 02:49:03 2008 +0300
+++ b/src/lib-dict/dict-db.c Thu Jul 24 22:18:29 2008 +0300
@@ -175,6 +175,7 @@ static int db_dict_iterate_set(struct db
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
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 *_
{
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 *_
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);
More information about the dovecot-cvs
mailing list