Module: wine
Branch: master
Commit: 01146582cc56e399a3313e4bad6f367c7d33c503
URL: https://gitlab.winehq.org/wine/wine/-/commit/01146582cc56e399a3313e4bad6f36…
Author: Torge Matthies <tmatthies(a)codeweavers.com>
Date: Mon Feb 6 05:51:33 2023 +0100
kernelbase: Break out of inner for-loop early in find_substring.
If I'm interpreting this code correctly, once either of these two
if-conditions are true once, they will also be true at some point
during all of the remaining iterations of the for-loop. Thus, we can
just stop the for-loop here.
Signed-off-by: Torge Matthies <tmatthies(a)codeweavers.com>
---
dlls/kernelbase/locale.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
index 13ec1ebeb3a..edab78317da 100644
--- a/dlls/kernelbase/locale.c
+++ b/dlls/kernelbase/locale.c
@@ -3924,8 +3924,12 @@ static int find_substring( const struct sortguid *sortid, DWORD flags, const WCH
pos += append_weights( sortid, flags, src, srclen, pos,
case_mask, except, compr_tables, &s, TRUE );
- if (s.primary_pos + s.key_primary.len > val.key_primary.len) goto next;
- if (memcmp( primary, val.key_primary.buf + s.primary_pos, s.key_primary.len )) goto next;
+ if (s.primary_pos + s.key_primary.len > val.key_primary.len ||
+ memcmp( primary, val.key_primary.buf + s.primary_pos, s.key_primary.len ))
+ {
+ len = srclen + 1;
+ goto next;
+ }
s.primary_pos += s.key_primary.len;
s.key_primary.len = 0;
}