components/samba/patches/talloc_dict_sigbus.patch
author Jiri Sasek <Jiri.Sasek@Oracle.COM>
Wed, 27 Jan 2016 18:45:20 -0800
changeset 5398 f499dad29f21
parent 5222 8298df727253
permissions -rw-r--r--
22662663 samba: Uprev to 4.1.22 22526544 problem in UTILITY/SAMBA 22526597 problem in UTILITY/SAMBA 22526577 problem in UTILITY/SAMBA

Based on patch sent me by Ralph Boehme <[email protected]> :

https://lists.samba.org/archive/samba-technical/2015-November/110889.html

...patch is assumed to be released in community.

--- a/source3/lib/talloc_dict.c	2013-06-13 02:21:02.000000000 -0700
+++ b/source3/lib/talloc_dict.c	2015-11-27 15:11:39.212179014 -0800
@@ -72,7 +72,11 @@
 			TALLOC_FREE(rec);
 			return false;
 		}
+#if defined(__SUNPRO_C) && (defined(__sparcv9) && defined(_LP64))
+		memcpy(&old_data, value.dptr, sizeof(old_data));
+#else /* Do not chase memcpy on archs where unaligned address do not throw SIGBUS */
 		old_data = *(void **)(value.dptr);
+#endif
 		TALLOC_FREE(old_data);
 		if (data == NULL) {
 			status = dbwrap_record_delete(rec);
@@ -138,6 +142,7 @@
 	TDB_DATA value;
 	struct talloc_dict_traverse_state *state =
 		(struct talloc_dict_traverse_state *)private_data;
+	void *p;
 
 	key = dbwrap_record_get_key(rec);
 	value = dbwrap_record_get_value(rec);
@@ -145,8 +150,14 @@
 	if (value.dsize != sizeof(void *)) {
 		return -1;
 	}
+
+#if defined(__SUNPRO_C) && (defined(__sparcv9) && defined(_LP64))
+	memcpy(&p, value.dptr, sizeof(p));
+#else /* Do not chase memcpy on archs where unaligned address do not throw SIGBUS */
+	p = *(void **)(value.dptr);
+#endif
 	return state->fn(data_blob_const(key.dptr, key.dsize),
-			 *(void **)value.dptr, state->private_data);
+			 p, state->private_data);
 }
 
 /*