@@ -297,47 +297,51 @@ static void throw_invalid_uri_exception(void)
297297{
298298 zend_throw_exception (uri_invalid_uri_exception_ce , "The specified URI is malformed" , 0 );
299299}
300-
301- #define PARSE_URI (dest_uri , uri_str , uriparser_uris , silent ) \
302- do { \
303- if (ZSTR_LEN(uri_str) == 0 || \
304- uriParseSingleUriExMmA(dest_uri, ZSTR_VAL(uri_str), ZSTR_VAL(uri_str) + ZSTR_LEN(uri_str), NULL, mm) != URI_SUCCESS \
305- ) { \
306- efree(uriparser_uris); \
307- if (!silent) { \
308- throw_invalid_uri_exception(); \
309- } \
310- return NULL; \
311- } \
312- } while (0)
313-
314300void * uriparser_parse_uri_ex (const zend_string * uri_str , const uriparser_uris_t * uriparser_base_urls , bool silent )
315301{
316- uriparser_uris_t * uriparser_uris = uriparser_create_uris ();
317-
318- if (uriparser_base_urls == NULL ) {
319- PARSE_URI (& uriparser_uris -> uri , uri_str , uriparser_uris , silent );
320- uriMakeOwnerMmA (& uriparser_uris -> uri , mm );
321- } else {
322- UriUriA uri ;
302+ UriUriA uri = {0 };
323303
324- PARSE_URI (& uri , uri_str , uriparser_uris , silent );
304+ /* Empty URIs are always invalid. */
305+ if (ZSTR_LEN (uri_str ) == 0 ) {
306+ goto fail ;
307+ }
308+
309+ /* Parse the URI. */
310+ if (uriParseSingleUriExMmA (& uri , ZSTR_VAL (uri_str ), ZSTR_VAL (uri_str ) + ZSTR_LEN (uri_str ), NULL , mm ) != URI_SUCCESS ) {
311+ goto fail ;
312+ }
325313
326- if (uriAddBaseUriExMmA (& uriparser_uris -> uri , & uri , & uriparser_base_urls -> uri , URI_RESOLVE_STRICTLY , mm ) != URI_SUCCESS ) {
327- efree (uriparser_uris );
328- uriFreeUriMembersMmA (& uri , mm );
329- if (!silent ) {
330- throw_invalid_uri_exception ();
331- }
314+ if (uriparser_base_urls != NULL ) {
315+ UriUriA tmp = {0 };
332316
333- return NULL ;
317+ /* Combine the parsed URI with the base URI and store the result in 'tmp',
318+ * since the target and source URLs must be distinct. */
319+ if (uriAddBaseUriExMmA (& tmp , & uri , & uriparser_base_urls -> uri , URI_RESOLVE_STRICTLY , mm ) != URI_SUCCESS ) {
320+ goto fail ;
334321 }
335322
336- uriMakeOwnerMmA ( & uriparser_uris -> uri , mm );
323+ /* Store the combined URI back into ' uri'. */
337324 uriFreeUriMembersMmA (& uri , mm );
325+ uri = tmp ;
338326 }
339327
328+ /* Make the resulting URI independent of the 'uri_str'. */
329+ uriMakeOwnerMmA (& uri , mm );
330+
331+ uriparser_uris_t * uriparser_uris = uriparser_create_uris ();
332+ uriparser_uris -> uri = uri ;
333+
340334 return uriparser_uris ;
335+
336+ fail :
337+
338+ uriFreeUriMembersA (& uri );
339+
340+ if (!silent ) {
341+ throw_invalid_uri_exception ();
342+ }
343+
344+ return NULL ;
341345}
342346
343347void * uriparser_parse_uri (const zend_string * uri_str , const void * base_url , zval * errors , bool silent )
0 commit comments