]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Improve constant memcmp function
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 14 Sep 2016 22:53:01 +0000 (23:53 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 14 Sep 2016 22:57:32 +0000 (23:57 +0100)
src/libutil/util.c

index 65756693c71298cbab39f9f621c9634378264e77..7e7614005231453756a6cfe1f6a73658ce022503 100644 (file)
@@ -2372,7 +2372,8 @@ gboolean
 rspamd_constant_memcmp (const guchar *a, const guchar *b, gsize len)
 {
        gsize lena, lenb, i;
-       gint acc = 0;
+       guint16 d, r = 0, m;
+       guint16 v;
 
        if (len == 0) {
                lena = strlen (a);
@@ -2386,10 +2387,13 @@ rspamd_constant_memcmp (const guchar *a, const guchar *b, gsize len)
        }
 
        for (i = 0; i < len; i++) {
-               acc |= a[i] ^ b[i];
+               v = ((guint16)(guint8)r) + 255;
+               m = v / 256 - 1;
+               d = (guint16)((int)a[i] - (int)b[i]);
+               r |= (d & m);
        }
 
-       return acc == 0;
+       return (((gint32)(guint16)((guint32)r + 0x8000) - 0x8000) == 0);
 }
 
 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000000UL