]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Silence NULL pointer dereferene false positive
authorMark Andrews <marka@isc.org>
Wed, 8 Mar 2023 05:05:03 +0000 (16:05 +1100)
committerOndřej Surý <ondrej@isc.org>
Mon, 3 Apr 2023 13:32:40 +0000 (13:32 +0000)
Only attempt to digest 'in' if it is non NULL.  This will prevent
false positives about NULL pointer dereferences against 'in' and
should also speed up the processing.

lib/isc/siphash.c

index 46bd5de70aa56c3847efa05c0aa976bdf770a3d9..ce24a6229f0162975857e1539c1f8c27d33ac6f5 100644 (file)
@@ -90,51 +90,52 @@ isc_siphash24(const uint8_t *k, const uint8_t *in, const size_t inlen,
 
        uint64_t b = ((uint64_t)inlen) << 56;
 
-       const uint8_t *end = (in == NULL)
-                                    ? NULL
-                                    : in + inlen - (inlen % sizeof(uint64_t));
-       const size_t left = inlen & 7;
+       if (in != NULL && inlen != 0) {
+               const uint8_t *end = in + inlen - (inlen % sizeof(uint64_t));
+               const size_t left = inlen & 7;
 
-       for (; in != end; in += 8) {
-               uint64_t m = case_sensitive
-                                    ? ISC_U8TO64_LE(in)
-                                    : isc_ascii_tolower8(ISC_U8TO64_LE(in));
+               for (; in != end; in += 8) {
+                       uint64_t m =
+                               case_sensitive
+                                       ? ISC_U8TO64_LE(in)
+                                       : isc_ascii_tolower8(ISC_U8TO64_LE(in));
 
-               v3 ^= m;
+                       v3 ^= m;
 
-               for (size_t i = 0; i < cROUNDS; ++i) {
-                       SIPROUND(v0, v1, v2, v3);
-               }
+                       for (size_t i = 0; i < cROUNDS; ++i) {
+                               SIPROUND(v0, v1, v2, v3);
+                       }
 
-               v0 ^= m;
-       }
+                       v0 ^= m;
+               }
 
-       switch (left) {
-       case 7:
-               b |= U8TO64_ONE(case_sensitive, in[6]) << 48;
-               FALLTHROUGH;
-       case 6:
-               b |= U8TO64_ONE(case_sensitive, in[5]) << 40;
-               FALLTHROUGH;
-       case 5:
-               b |= U8TO64_ONE(case_sensitive, in[4]) << 32;
-               FALLTHROUGH;
-       case 4:
-               b |= U8TO64_ONE(case_sensitive, in[3]) << 24;
-               FALLTHROUGH;
-       case 3:
-               b |= U8TO64_ONE(case_sensitive, in[2]) << 16;
-               FALLTHROUGH;
-       case 2:
-               b |= U8TO64_ONE(case_sensitive, in[1]) << 8;
-               FALLTHROUGH;
-       case 1:
-               b |= U8TO64_ONE(case_sensitive, in[0]);
-               FALLTHROUGH;
-       case 0:
-               break;
-       default:
-               UNREACHABLE();
+               switch (left) {
+               case 7:
+                       b |= U8TO64_ONE(case_sensitive, in[6]) << 48;
+                       FALLTHROUGH;
+               case 6:
+                       b |= U8TO64_ONE(case_sensitive, in[5]) << 40;
+                       FALLTHROUGH;
+               case 5:
+                       b |= U8TO64_ONE(case_sensitive, in[4]) << 32;
+                       FALLTHROUGH;
+               case 4:
+                       b |= U8TO64_ONE(case_sensitive, in[3]) << 24;
+                       FALLTHROUGH;
+               case 3:
+                       b |= U8TO64_ONE(case_sensitive, in[2]) << 16;
+                       FALLTHROUGH;
+               case 2:
+                       b |= U8TO64_ONE(case_sensitive, in[1]) << 8;
+                       FALLTHROUGH;
+               case 1:
+                       b |= U8TO64_ONE(case_sensitive, in[0]);
+                       FALLTHROUGH;
+               case 0:
+                       break;
+               default:
+                       UNREACHABLE();
+               }
        }
 
        v3 ^= b;
@@ -173,39 +174,40 @@ isc_halfsiphash24(const uint8_t *k, const uint8_t *in, const size_t inlen,
 
        uint32_t b = ((uint32_t)inlen) << 24;
 
-       const uint8_t *end = (in == NULL)
-                                    ? NULL
-                                    : in + inlen - (inlen % sizeof(uint32_t));
-       const int left = inlen & 3;
+       if (in != NULL && inlen != 0) {
+               const uint8_t *end = in + inlen - (inlen % sizeof(uint32_t));
+               const int left = inlen & 3;
 
-       for (; in != end; in += 4) {
-               uint32_t m = case_sensitive
-                                    ? ISC_U8TO32_LE(in)
-                                    : isc_ascii_tolower4(ISC_U8TO32_LE(in));
+               for (; in != end; in += 4) {
+                       uint32_t m =
+                               case_sensitive
+                                       ? ISC_U8TO32_LE(in)
+                                       : isc_ascii_tolower4(ISC_U8TO32_LE(in));
 
-               v3 ^= m;
+                       v3 ^= m;
 
-               for (size_t i = 0; i < cROUNDS; ++i) {
-                       HALFSIPROUND(v0, v1, v2, v3);
-               }
+                       for (size_t i = 0; i < cROUNDS; ++i) {
+                               HALFSIPROUND(v0, v1, v2, v3);
+                       }
 
-               v0 ^= m;
-       }
+                       v0 ^= m;
+               }
 
-       switch (left) {
-       case 3:
-               b |= U8TO32_ONE(case_sensitive, in[2]) << 16;
-               FALLTHROUGH;
-       case 2:
-               b |= U8TO32_ONE(case_sensitive, in[1]) << 8;
-               FALLTHROUGH;
-       case 1:
-               b |= U8TO32_ONE(case_sensitive, in[0]);
-               FALLTHROUGH;
-       case 0:
-               break;
-       default:
-               UNREACHABLE();
+               switch (left) {
+               case 3:
+                       b |= U8TO32_ONE(case_sensitive, in[2]) << 16;
+                       FALLTHROUGH;
+               case 2:
+                       b |= U8TO32_ONE(case_sensitive, in[1]) << 8;
+                       FALLTHROUGH;
+               case 1:
+                       b |= U8TO32_ONE(case_sensitive, in[0]);
+                       FALLTHROUGH;
+               case 0:
+                       break;
+               default:
+                       UNREACHABLE();
+               }
        }
 
        v3 ^= b;