@@ -297,47 +297,51 @@ static void throw_invalid_uri_exception(void)
297
297
{
298
298
zend_throw_exception (uri_invalid_uri_exception_ce , "The specified URI is malformed" , 0 );
299
299
}
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
-
314
300
void * uriparser_parse_uri_ex (const zend_string * uri_str , const uriparser_uris_t * uriparser_base_urls , bool silent )
315
301
{
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 };
323
303
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
+ }
325
313
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 };
332
316
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 ;
334
321
}
335
322
336
- uriMakeOwnerMmA ( & uriparser_uris -> uri , mm );
323
+ /* Store the combined URI back into ' uri'. */
337
324
uriFreeUriMembersMmA (& uri , mm );
325
+ uri = tmp ;
338
326
}
339
327
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
+
340
334
return uriparser_uris ;
335
+
336
+ fail :
337
+
338
+ uriFreeUriMembersA (& uri );
339
+
340
+ if (!silent ) {
341
+ throw_invalid_uri_exception ();
342
+ }
343
+
344
+ return NULL ;
341
345
}
342
346
343
347
void * uriparser_parse_uri (const zend_string * uri_str , const void * base_url , zval * errors , bool silent )
0 commit comments