dovecot-1.2: dict-db: Don't assume bdb returns aligned memory ad...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jul 24 22:19:01 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/25ff4c990c23
changeset: 8059:25ff4c990c23
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 17d8b197641b -r 25ff4c990c23 src/lib-dict/dict-db.c
--- 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 @@ 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