Alex Henrie : winhttp: Fix memory leak on error path in WinHttpCrackUrl (Coverity).

Alexandre Julliard julliard at winehq.org
Wed Feb 2 16:38:03 CST 2022


Module: wine
Branch: master
Commit: 2b63fdd9a5fb58951e90af877f79c0a65bd445ec
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2b63fdd9a5fb58951e90af877f79c0a65bd445ec

Author: Alex Henrie <alexhenrie24 at gmail.com>
Date:   Wed Feb  2 00:23:17 2022 -0700

winhttp: Fix memory leak on error path in WinHttpCrackUrl (Coverity).

And use a single variable for the encoded or decoded URL so that free
only has to be called once.

Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winhttp/url.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/dlls/winhttp/url.c b/dlls/winhttp/url.c
index 0d9dfb76de6..8efd5ed0c49 100644
--- a/dlls/winhttp/url.c
+++ b/dlls/winhttp/url.c
@@ -172,7 +172,7 @@ static DWORD parse_port( const WCHAR *str, DWORD len, INTERNET_PORT *ret )
  */
 BOOL WINAPI WinHttpCrackUrl( LPCWSTR url, DWORD len, DWORD flags, LPURL_COMPONENTSW uc )
 {
-    WCHAR *p, *q, *r, *url_decoded = NULL, *url_escaped = NULL;
+    WCHAR *p, *q, *r, *url_transformed = NULL;
     INTERNET_SCHEME scheme_number = 0;
     struct url_component scheme, username, password, hostname, path, extra;
     BOOL overflow = FALSE;
@@ -189,25 +189,26 @@ BOOL WINAPI WinHttpCrackUrl( LPCWSTR url, DWORD len, DWORD flags, LPURL_COMPONEN
 
     if (flags & ICU_ESCAPE)
     {
-        if ((err = escape_url( url, &len, &url_escaped )))
+        if ((err = escape_url( url, &len, &url_transformed )))
         {
             SetLastError( err );
             return FALSE;
         }
-        url = url_escaped;
+        url = url_transformed;
     }
     else if (flags & ICU_DECODE)
     {
-        if (!(url_decoded = decode_url( url, &len )))
+        if (!(url_transformed = decode_url( url, &len )))
         {
             SetLastError( ERROR_OUTOFMEMORY );
             return FALSE;
         }
-        url = url_decoded;
+        url = url_transformed;
     }
     if (!(p = wcschr( url, ':' )))
     {
         SetLastError( ERROR_WINHTTP_UNRECOGNIZED_SCHEME );
+        free( url_transformed );
         return FALSE;
     }
     if (p - url == 4 && !wcsnicmp( url, L"http", 4 )) scheme_number = INTERNET_SCHEME_HTTP;
@@ -331,8 +332,7 @@ exit:
         if (overflow) err = ERROR_INSUFFICIENT_BUFFER;
         uc->nScheme = scheme_number;
     }
-    free( url_decoded );
-    free( url_escaped );
+    free( url_transformed );
     SetLastError( err );
     return !err;
 }




More information about the wine-cvs mailing list