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);