diff --git a/dlls/comctl32/syslink.c b/dlls/comctl32/syslink.c index a5ba3dd422d..eeb46b98053 100644 --- a/dlls/comctl32/syslink.c +++ b/dlls/comctl32/syslink.c @@ -183,6 +183,26 @@ static VOID SYSLINK_ClearDoc (SYSLINK_INFO *infoPtr) infoPtr->Items = NULL; } +/*********************************************************************** + * SYSLINK_StrCmpNIW + * Wrapper for StrCmpNIW to ensure 'len' is not too big. + */ +static INT SYSLINK_StrCmpNIW (LPCWSTR str, LPCWSTR comp, INT len) +{ + INT i; + + for(i = 0; i < len; i++) + { + if(!str[i]) + { + len = i + 1; + break; + } + } + + return StrCmpNIW(str, comp, len); +} + /*********************************************************************** * SYSLINK_ParseText * Parses the window text string and creates a document. Returns the @@ -203,7 +223,7 @@ static UINT SYSLINK_ParseText (SYSLINK_INFO *infoPtr, LPCWSTR Text) { if(*current == '<') { - if(!StrCmpNIW(current, SL_LINKOPEN, 2) && (CurrentType == slText)) + if(!SYSLINK_StrCmpNIW(current, SL_LINKOPEN, 2) && (CurrentType == slText)) { BOOL ValidParam = FALSE, ValidLink = FALSE; @@ -231,14 +251,14 @@ static UINT SYSLINK_ParseText (SYSLINK_INFO *infoPtr, LPCWSTR Text) CheckParameter: /* compare the current position with all known parameters */ - if(!StrCmpNIW(tmp, SL_HREF, 6)) + if(!SYSLINK_StrCmpNIW(tmp, SL_HREF, 6)) { taglen += 6; ValidParam = TRUE; CurrentParameter = &lpUrl; CurrentParameterLen = &lenUrl; } - else if(!StrCmpNIW(tmp, SL_ID, 4)) + else if(!SYSLINK_StrCmpNIW(tmp, SL_ID, 4)) { taglen += 4; ValidParam = TRUE; @@ -312,7 +332,7 @@ CheckParameter: } } } - else if(!StrCmpNIW(current, SL_LINKCLOSE, 4) && (CurrentType == slLink) && firsttag) + else if(!SYSLINK_StrCmpNIW(current, SL_LINKCLOSE, 4) && (CurrentType == slLink) && firsttag) { /* there's a tag opened, first add the previous text, if present */ if(textstart != NULL && textlen > 0 && firsttag > textstart)