Address GCC Bug 95189 memcmp wrongly stripped like strcmp
commit02200d55eaf01a3a21d52eccfa7eea02f9e8df72
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 24 Nov 2021 14:21:36 +0000 (24 09:21 -0500)
committerJeffrey Altman <jaltman@auristor.com>
Thu, 25 Nov 2021 03:30:44 +0000 (24 22:30 -0500)
tree2f6bbee041a8a20e6baa61ea277d6072ff49d7e6
parent8123ffc3f2028902de34f9f5482c07f2a4654bc9
Address GCC Bug 95189 memcmp wrongly stripped like strcmp

As documented in Russell O'Connor's blog, Heimdal when compiled with
some versions of gcc 9 and 10 would generate incorrect behaviors from
_gssapi_verify_mic_arcfour(), _gssapi_unwrap_arcfour(),
_gssapi_unwrap_iov_arcfour() and _gssapi_unwrap_iov_arcfour().

As a result of the bug, code of the form

   if (memcmp(a, "\x00\x00\x00\x00"))

and

   cmp = memcmp(a, "\x00\x00\x00\x00")

will be compiled as if it were written as

   if (strcmp(a, "\x00\x00\x00\x00"))

and

   cmp = strcmp(a, "\x00\x00\x00\x00")

but not

   if (memcmp(a, "\x00\x00\x00\x00") != 0)

and

   cmp = (memcmp(a, "\x00\x00\x00\x00") != 0)

Bad code is generated whenever one of the parameters to memcmp()
is a constant with at least one NUL in the first four octets and
the return value is used immediated without a boolean comparison.

The gcc bug 95189 has since been fixed.

This change applies a defensive programming technique to avoid
the broken code generation.

Change-Id: I1db2a561735317cb6cac66a0ec9caf5443e65e03
Link: https://r6.ca/blog/20200929T023701Z.html
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95189
Reported-by: Buck Huppmann (buckh@pobox.com) <buckh@pobox.com>
lib/gssapi/krb5/arcfour.c