Module: wine Branch: master Commit: bd7c86bb4ff15b4fa706dbfe697d61b378c99004 URL: https://source.winehq.org/git/wine.git/?a=commit;h=bd7c86bb4ff15b4fa706dbfe6...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Oct 31 14:21:26 2018 +0100
webservices: Also trace return values in the URL functions.
Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/webservices/url.c | 67 ++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 29 deletions(-)
diff --git a/dlls/webservices/url.c b/dlls/webservices/url.c index 731b74e..fd8d33a 100644 --- a/dlls/webservices/url.c +++ b/dlls/webservices/url.c @@ -192,22 +192,22 @@ HRESULT WINAPI WsDecodeUrl( const WS_STRING *str, ULONG flags, WS_HEAP *heap, WS return E_NOTIMPL; } if (!(decoded = url_decode( str->chars, str->length, heap, &len_decoded )) || - !(url = ws_alloc( heap, sizeof(*url) ))) goto error; + !(url = ws_alloc( heap, sizeof(*url) ))) goto done;
hr = WS_E_INVALID_FORMAT;
p = q = decoded; len = len_decoded; while (len && *q != ':') { q++; len--; }; - if (*q != ':') goto error; - if ((url->url.scheme = scheme_type( p, q - p )) == ~0u) goto error; + if (*q != ':') goto done; + if ((url->url.scheme = scheme_type( p, q - p )) == ~0u) goto done;
- if (!--len || *++q != '/') goto error; - if (!--len || *++q != '/') goto error; + if (!--len || *++q != '/') goto done; + if (!--len || *++q != '/') goto done;
p = ++q; len--; while (len && *q != '/' && *q != ':' && *q != '?' && *q != '#') { q++; len--; }; - if (q == p) goto error; + if (q == p) goto done; url->host.length = q - p; url->host.chars = p;
@@ -216,7 +216,7 @@ HRESULT WINAPI WsDecodeUrl( const WS_STRING *str, ULONG flags, WS_HEAP *heap, WS p = ++q; len--; while (len && isdigitW( *q )) { - if ((port = port * 10 + *q - '0') > 65535) goto error; + if ((port = port * 10 + *q - '0') > 65535) goto done; q++; len--; }; url->port = port; @@ -258,11 +258,15 @@ HRESULT WINAPI WsDecodeUrl( const WS_STRING *str, ULONG flags, WS_HEAP *heap, WS else url->fragment.length = 0;
*ret = (WS_URL *)url; - return S_OK; + hr = S_OK;
-error: - if (decoded != str->chars) ws_free( heap, decoded, len_decoded ); - ws_free( heap, url, sizeof(*url) ); +done: + if (hr != S_OK) + { + if (decoded != str->chars) ws_free( heap, decoded, len_decoded ); + ws_free( heap, url, sizeof(*url) ); + } + TRACE( "returning %08x\n", hr ); return hr; }
@@ -420,12 +424,12 @@ HRESULT WINAPI WsEncodeUrl( const WS_URL *base, ULONG flags, WS_HEAP *heap, WS_S WS_ERROR *error ) { static const WCHAR fmtW[] = {':','%','u',0}; - ULONG len = 0, len_scheme, len_enc, ret_size; + ULONG len = 0, len_scheme, len_enc, ret_size = 0; const WS_HTTP_URL *url = (const WS_HTTP_URL *)base; const WCHAR *scheme; - WCHAR *str, *p, *q; + WCHAR *str = NULL, *p, *q; ULONG port = 0; - HRESULT hr; + HRESULT hr = WS_E_INVALID_FORMAT;
TRACE( "%p %08x %p %p %p\n", base, flags, heap, ret, error ); if (error) FIXME( "ignoring error parameter\n" ); @@ -436,28 +440,32 @@ HRESULT WINAPI WsEncodeUrl( const WS_URL *base, ULONG flags, WS_HEAP *heap, WS_S FIXME( "unimplemented flags %08x\n", flags ); return E_NOTIMPL; } - if (!(scheme = scheme_str( url->url.scheme, &len_scheme ))) return WS_E_INVALID_FORMAT; + if (!(scheme = scheme_str( url->url.scheme, &len_scheme ))) goto done; len = len_scheme + 3; /* '://' */ len += 6; /* ':65535' */
if ((hr = url_encode_size( url->host.chars, url->host.length, "", &len_enc )) != S_OK) - return hr; + goto done; len += len_enc;
if ((hr = url_encode_size( url->path.chars, url->path.length, "/", &len_enc )) != S_OK) - return hr; + goto done; len += len_enc;
if ((hr = url_encode_size( url->query.chars, url->query.length, "/?", &len_enc )) != S_OK) - return hr; + goto done; len += len_enc + 1; /* '?' */
if ((hr = url_encode_size( url->fragment.chars, url->fragment.length, "/?", &len_enc )) != S_OK) - return hr; + goto done; len += len_enc + 1; /* '#' */
ret_size = len * sizeof(WCHAR); - if (!(str = ws_alloc( heap, ret_size ))) return WS_E_QUOTA_EXCEEDED; + if (!(str = ws_alloc( heap, ret_size ))) + { + hr = WS_E_QUOTA_EXCEEDED; + goto done; + }
memcpy( str, scheme, len_scheme * sizeof(WCHAR) ); p = str + len_scheme; @@ -466,7 +474,7 @@ HRESULT WINAPI WsEncodeUrl( const WS_URL *base, ULONG flags, WS_HEAP *heap, WS_S p += 3;
if ((hr = url_encode( url->host.chars, url->host.length, p, "", &len_enc )) != S_OK) - goto error; + goto done; p += len_enc;
if (url->portAsString.length) @@ -478,14 +486,14 @@ HRESULT WINAPI WsEncodeUrl( const WS_URL *base, ULONG flags, WS_HEAP *heap, WS_S if ((port = port * 10 + *q - '0') > 65535) { hr = WS_E_INVALID_FORMAT; - goto error; + goto done; } q++; len--; } if (url->port && port != url->port) { hr = E_INVALIDARG; - goto error; + goto done; } } else port = url->port;
@@ -499,14 +507,14 @@ HRESULT WINAPI WsEncodeUrl( const WS_URL *base, ULONG flags, WS_HEAP *heap, WS_S }
if ((hr = url_encode( url->path.chars, url->path.length, p, "/", &len_enc )) != S_OK) - goto error; + goto done; p += len_enc;
if (url->query.length) { *p++ = '?'; if ((hr = url_encode( url->query.chars, url->query.length, p, "/?", &len_enc )) != S_OK) - goto error; + goto done; p += len_enc; }
@@ -514,15 +522,16 @@ HRESULT WINAPI WsEncodeUrl( const WS_URL *base, ULONG flags, WS_HEAP *heap, WS_S { *p++ = '#'; if ((hr = url_encode( url->fragment.chars, url->fragment.length, p, "/?", &len_enc )) != S_OK) - goto error; + goto done; p += len_enc; }
ret->length = p - str; ret->chars = str; - return S_OK; + hr = S_OK;
-error: - ws_free( heap, str, ret_size ); +done: + if (hr != S_OK) ws_free( heap, str, ret_size ); + TRACE( "returning %08x\n", hr ); return hr; }