]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
Remove possibly undefined behaviour from Noodle.
authorGeorge Wort <george.wort@arm.com>
Thu, 1 Jul 2021 13:19:20 +0000 (14:19 +0100)
committerKonstantinos Margaritis <konstantinos@vectorcamp.gr>
Tue, 12 Oct 2021 08:51:34 +0000 (11:51 +0300)
Change-Id: I9a7997cea6a48927cb02b00c5dba5009bbf83850

src/hwlm/noodle_engine_sve.hpp

index 232e0ee033c063ae7146ae8d64620556ea7e7b21..d541b6eb68b86ccb15c2a1da6694623dded48ae3 100644 (file)
@@ -122,16 +122,16 @@ hwlm_error_t scanSingle(const struct noodTable *n, const u8 *buf, size_t len,
 
     svuint8_t chars = getCharMaskSingle(n, noCase);
 
+    size_t scan_len = e - d;
+    if (scan_len <= svcntb()) {
+        return scanSingleOnce(n, buf, len, cbi, chars, d, e);
+    }
     // peel off first part to align to the vector size
     const u8 *d1 = ROUNDUP_PTR(d, svcntb_pat(SV_POW2));
     if (d != d1) {
-        if (d1 >= e) {
-            return scanSingleOnce(n, buf, len, cbi, chars, d, e);
-        } else {
-            DEBUG_PRINTF("until aligned %p \n", d1);
-            hwlmcb_rv_t rv = scanSingleOnce(n, buf, len, cbi, chars, d, d1);
-            RETURN_IF_TERMINATED(rv);
-        }
+        DEBUG_PRINTF("until aligned %p \n", d1);
+        hwlmcb_rv_t rv = scanSingleOnce(n, buf, len, cbi, chars, d, d1);
+        RETURN_IF_TERMINATED(rv);
     }
     return scanSingleLoop(n, buf, len, cbi, chars, d1, e);
 }
@@ -242,23 +242,24 @@ hwlm_error_t scanDouble(const struct noodTable *n, const u8 *buf, size_t len,
     assert(d < e);
     assert(d >= buf);
 
-    if (e - d < 2) {
+    size_t scan_len = e - d;
+    if (scan_len < 2) {
         return HWLM_SUCCESS;
     }
     ++d;
 
     svuint16_t chars = getCharMaskDouble(n, noCase);
+
+    if (scan_len <= svcntb()) {
+        return scanDoubleOnce(n, buf, len, cbi, chars, d, e);
+    }
     // peel off first part to align to the vector size
     const u8 *d1 = ROUNDUP_PTR(d, svcntb_pat(SV_POW2));
     if (d != d1) {
-        if (d1 >= e) {
-            return scanDoubleOnce(n, buf, len, cbi, chars, d, e);
-        } else {
-            DEBUG_PRINTF("until aligned %p \n", d1);
-            hwlmcb_rv_t rv = scanDoubleOnce(n, buf, len, cbi, chars,
-                                            d, d1);
-            RETURN_IF_TERMINATED(rv);
-        }
+        DEBUG_PRINTF("until aligned %p \n", d1);
+        hwlmcb_rv_t rv = scanDoubleOnce(n, buf, len, cbi, chars,
+                                        d, d1);
+        RETURN_IF_TERMINATED(rv);
     }
     return scanDoubleLoop(n, buf, len, cbi, chars, d1, e);
 }
\ No newline at end of file