Module: wine Branch: master Commit: 01146582cc56e399a3313e4bad6f367c7d33c503 URL: https://gitlab.winehq.org/wine/wine/-/commit/01146582cc56e399a3313e4bad6f367...
Author: Torge Matthies tmatthies@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@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; }