TT#111150 fix possible unaligned memory access

Check if the uint64_t pointer is aligned before using it. If unaligned,
go byte by byte. Unaligned pointer access is undefined on some archs and
flagged as such by ASAN.

Change-Id: I3afc80a2ddbc874a62d6930971493f8d461aa452
pull/1285/head
Richard Fuchs 5 years ago
parent 49bfad1f5f
commit ef5a954e4c

@ -366,6 +366,7 @@ static void aes_ctr(unsigned char *out, str *in, EVP_CIPHER_CTX *ecc, const unsi
unsigned char *p, *q; unsigned char *p, *q;
unsigned int left; unsigned int left;
int outlen, i; int outlen, i;
gboolean aligned = TRUE;
u_int64_t *pi, *qi, *ki; u_int64_t *pi, *qi, *ki;
if (!ecc) if (!ecc)
@ -377,11 +378,16 @@ static void aes_ctr(unsigned char *out, str *in, EVP_CIPHER_CTX *ecc, const unsi
ki = (void *) key_block; ki = (void *) key_block;
left = in->len; left = in->len;
if ((GPOINTER_TO_UINT(pi) % sizeof(*pi)) != 0)
aligned = FALSE;
if ((GPOINTER_TO_UINT(qi) % sizeof(*qi)) != 0)
aligned = FALSE;
while (left) { while (left) {
EVP_EncryptUpdate(ecc, key_block, &outlen, ivx, 16); EVP_EncryptUpdate(ecc, key_block, &outlen, ivx, 16);
assert(outlen == 16); assert(outlen == 16);
if (G_UNLIKELY(left < 16)) { if (left < 16 || !aligned) {
p = (void *) pi; p = (void *) pi;
q = (void *) qi; q = (void *) qi;
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
@ -390,12 +396,14 @@ static void aes_ctr(unsigned char *out, str *in, EVP_CIPHER_CTX *ecc, const unsi
if (!left) if (!left)
goto done; goto done;
} }
abort();
} }
else {
*qi++ = *pi++ ^ ki[0]; qi[0] = pi[0] ^ ki[0];
*qi++ = *pi++ ^ ki[1]; qi[1] = pi[1] ^ ki[1];
left -= 16; left -= 16;
}
qi += 2;
pi += 2;
for (i = 15; i >= 0; i--) { for (i = 15; i >= 0; i--) {
ivx[i]++; ivx[i]++;

Loading…
Cancel
Save