diff options
Diffstat (limited to 'src/ext')
-rw-r--r-- | src/ext/ed25519/donna/README.tor | 3 | ||||
-rw-r--r-- | src/ext/ed25519/donna/ed25519-donna-portable.h | 14 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/ext/ed25519/donna/README.tor b/src/ext/ed25519/donna/README.tor index 212fb119a2..2bb0efc012 100644 --- a/src/ext/ed25519/donna/README.tor +++ b/src/ext/ed25519/donna/README.tor @@ -37,3 +37,6 @@ as of 8757bd4cd209cb032853ece0ce413f122eef212c. since the compilation will fail in `ge25519_scalarmult_base_choose_niels` on x86_64 targets due to running out of registers. + * On non-x86 targets, GCC's Stack Protector dislikes variables that have + alignment constraints greater than that of other primitive types. + The `ALIGN` macro is thus no-oped for all non-SSE2 builds. diff --git a/src/ext/ed25519/donna/ed25519-donna-portable.h b/src/ext/ed25519/donna/ed25519-donna-portable.h index 44fa8407e2..9ec83b87e3 100644 --- a/src/ext/ed25519/donna/ed25519-donna-portable.h +++ b/src/ext/ed25519/donna/ed25519-donna-portable.h @@ -144,6 +144,20 @@ static inline void U64TO8_LE(unsigned char *p, const uint64_t v) { #endif #endif +/* Tor: GCC's Stack Protector freaks out and produces variable length + * buffer warnings when alignment is requested that is greater than + * STACK_BOUNDARY (x86 has special code to deal with this for SSE2). + * + * Since the only reason things are 16 byte aligned in the first place + * is for SSE2, only request variable alignment for SSE2 builds. + * + * See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59674 + */ +#if !defined(ED25519_SSE2) + #undef ALIGN + #define ALIGN(x) +#endif + #include <stdlib.h> #include <string.h> |