diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2015-02-12 09:07:02 +0100 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2015-02-12 16:37:55 +0000 |
commit | bdcac172eaa2ec4998c9f2775e691460b9b7a2d0 (patch) | |
tree | fce8f3fc4cee653f0edfe8ed93f1133474e66ea8 /wsutil/ws_mempbrk_sse42.c | |
parent | 678a9b6463b3661660da2e8a99781332c23cf78c (diff) | |
download | wireshark-bdcac172eaa2ec4998c9f2775e691460b9b7a2d0.tar.gz |
Fix crash at startup in SSE4.2 code when running a 32 bits Windows build
There is no guarantee that a g_malloc'ed memory block will be aligned on a 128 bits boundary
Instead use a static variable definition (at the cost of exposing the HAVE_SSE4_2 compilation flag in ws_mempbrk.h)
Change-Id: I661bf479a9d458d64c96bafc940c519d29a4780b
Reviewed-on: https://code.wireshark.org/review/7070
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'wsutil/ws_mempbrk_sse42.c')
-rw-r--r-- | wsutil/ws_mempbrk_sse42.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/wsutil/ws_mempbrk_sse42.c b/wsutil/ws_mempbrk_sse42.c index da37a665aa..4fd3ef0701 100644 --- a/wsutil/ws_mempbrk_sse42.c +++ b/wsutil/ws_mempbrk_sse42.c @@ -68,11 +68,8 @@ ws_mempbrk_sse42_compile(tvb_pbrk_pattern* pattern, const gchar *needles) pattern->use_sse42 = ws_cpuid_sse42() && (length <= 16); if (pattern->use_sse42) { - __m128i *pmask = NULL; - pattern->mask = g_malloc(sizeof(__m128i)); - pmask = (__m128i *) pattern->mask; - *pmask = _mm_setzero_si128(); - memcpy(pmask, needles, length); + pattern->mask = _mm_setzero_si128(); + memcpy(&(pattern->mask), needles, length); } } @@ -112,7 +109,6 @@ const char * ws_mempbrk_sse42_exec(const char *s, size_t slen, const tvb_pbrk_pattern* pattern, guchar *found_needle) { const char *aligned; - __m128i *pmask = (__m128i *) pattern->mask; int offset; offset = (int) ((size_t) s & 15); @@ -122,9 +118,9 @@ ws_mempbrk_sse42_exec(const char *s, size_t slen, const tvb_pbrk_pattern* patter /* Check partial string. cast safe it's 16B aligned */ __m128i value = __m128i_shift_right (_mm_load_si128 (cast_128aligned__m128i(aligned)), offset); - int length = _mm_cmpistri (*pmask, value, 0x2); + int length = _mm_cmpistri (pattern->mask, value, 0x2); /* No need to check ZFlag since ZFlag is always 1. */ - int cflag = _mm_cmpistrc (*pmask, value, 0x2); + int cflag = _mm_cmpistrc (pattern->mask, value, 0x2); /* XXX: why does this compare value with value? */ int idx = _mm_cmpistri (value, value, 0x3a); @@ -149,9 +145,9 @@ ws_mempbrk_sse42_exec(const char *s, size_t slen, const tvb_pbrk_pattern* patter while (slen >= 16) { __m128i value = _mm_load_si128 (cast_128aligned__m128i(aligned)); - int idx = _mm_cmpistri (*pmask, value, 0x2); - int cflag = _mm_cmpistrc (*pmask, value, 0x2); - int zflag = _mm_cmpistrz (*pmask, value, 0x2); + int idx = _mm_cmpistri (pattern->mask, value, 0x2); + int cflag = _mm_cmpistrc (pattern->mask, value, 0x2); + int zflag = _mm_cmpistrz (pattern->mask, value, 0x2); if (cflag) { if (found_needle) |