Skip to content

Commit 09efcdd

Browse files
committed
Fixes
1 parent 4f94e0d commit 09efcdd

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

ext/uri/php_uriparser.c

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,14 @@ static void uriparser_normalize_uri(UriUriA *uriparser_uri)
4242
ZEND_ASSERT(result == URI_SUCCESS);
4343
}
4444

45-
static void normalize_uri_if_needed(uriparser_uris_t *uriparser_uris)
46-
{
47-
if (uriparser_uris->normalized_uri_initialized == false) {
45+
static UriUriA *get_normalized_uri(uriparser_uris_t *uriparser_uris) {
46+
if (!uriparser_uris->normalized_uri_initialized) {
4847
uriparser_copy_uri(&uriparser_uris->normalized_uri, &uriparser_uris->uri);
4948
uriparser_normalize_uri(&uriparser_uris->normalized_uri);
5049
uriparser_uris->normalized_uri_initialized = true;
5150
}
51+
52+
return &uriparser_uris->normalized_uri;
5253
}
5354

5455
static UriUriA *uriparser_read_uri(uriparser_uris_t *uriparser_uris, uri_component_read_mode_t read_mode)
@@ -59,9 +60,7 @@ static UriUriA *uriparser_read_uri(uriparser_uris_t *uriparser_uris, uri_compone
5960
case URI_COMPONENT_READ_NORMALIZED_ASCII:
6061
ZEND_FALLTHROUGH;
6162
case URI_COMPONENT_READ_NORMALIZED_UNICODE:
62-
normalize_uri_if_needed(uriparser_uris);
63-
64-
return &uriparser_uris->normalized_uri;
63+
return get_normalized_uri(uriparser_uris);
6564
EMPTY_SWITCH_DEFAULT_CASE()
6665
}
6766
}
@@ -102,7 +101,7 @@ static zend_result uriparser_read_username(const uri_internal_t *internal_uri, u
102101

103102
if (uriparser_uri->userInfo.first != NULL && uriparser_uri->userInfo.afterLast != NULL) {
104103
size_t length = get_text_range_length(&uriparser_uri->userInfo);
105-
char *c = memchr(uriparser_uri->userInfo.first, ':', length);
104+
const char *c = memchr(uriparser_uri->userInfo.first, ':', length);
106105

107106
if (c == NULL && length > 0) {
108107
ZVAL_STRINGL(retval, uriparser_uri->userInfo.first, length);
@@ -145,6 +144,7 @@ static zend_result uriparser_read_host(const uri_internal_t *internal_uri, uri_c
145144

146145
if (uriparser_uri->hostText.first != NULL && uriparser_uri->hostText.afterLast != NULL && get_text_range_length(&uriparser_uri->hostText) > 0) {
147146
if (uriparser_uri->hostData.ip6 != NULL || uriparser_uri->hostData.ipFuture.first != NULL) {
147+
/* the textual representation of the host is always accessible in the .hostText field no matter what the host is */
148148
smart_str host_str = {0};
149149

150150
smart_str_appendc(&host_str, '[');
@@ -162,7 +162,7 @@ static zend_result uriparser_read_host(const uri_internal_t *internal_uri, uri_c
162162
return SUCCESS;
163163
}
164164

165-
static int str_to_int(const char *str, int len)
165+
static size_t str_to_int(const char *str, size_t len)
166166
{
167167
int result = 0;
168168

@@ -287,7 +287,7 @@ PHP_MINIT_FUNCTION(uri_uriparser)
287287

288288
static uriparser_uris_t *uriparser_create_uris(void)
289289
{
290-
uriparser_uris_t *uriparser_uris = emalloc(sizeof(*uriparser_uris));
290+
uriparser_uris_t *uriparser_uris = ecalloc(1, sizeof(*uriparser_uris));
291291
uriparser_uris->normalized_uri_initialized = false;
292292

293293
return uriparser_uris;
@@ -325,6 +325,7 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
325325

326326
if (uriAddBaseUriA(&uriparser_uris->uri, &uri, &uriparser_base_urls->uri) != URI_SUCCESS) {
327327
efree(uriparser_uris);
328+
uriFreeUriMembersA(&uri);
328329
if (!silent) {
329330
throw_invalid_uri_exception();
330331
}
@@ -350,7 +351,7 @@ void *uriparser_parse_uri(const zend_string *uri_str, const void *base_url, zval
350351
* is discarded altogether. */
351352
static void *uriparser_clone_uri(void *uri)
352353
{
353-
uriparser_uris_t *uriparser_uris = (uriparser_uris_t *) uri;
354+
uriparser_uris_t *uriparser_uris = uri;
354355

355356
uriparser_uris_t *new_uriparser_uris = uriparser_create_uris();
356357
uriparser_copy_uri(&new_uriparser_uris->uri, &uriparser_uris->uri);
@@ -364,15 +365,13 @@ static void *uriparser_clone_uri(void *uri)
364365

365366
static zend_string *uriparser_uri_to_string(void *uri, uri_recomposition_mode_t recomposition_mode, bool exclude_fragment)
366367
{
367-
uriparser_uris_t *uriparser_uris = (uriparser_uris_t *) uri;
368+
uriparser_uris_t *uriparser_uris = uri;
368369
UriUriA *uriparser_uri;
369370

370371
if (recomposition_mode == URI_RECOMPOSITION_RAW_ASCII || recomposition_mode == URI_RECOMPOSITION_RAW_UNICODE) {
371372
uriparser_uri = &uriparser_uris->uri;
372373
} else {
373-
normalize_uri_if_needed(uriparser_uris);
374-
375-
uriparser_uri = &uriparser_uris->normalized_uri;
374+
uriparser_uri = get_normalized_uri(uriparser_uris);
376375
}
377376

378377
int charsRequired = 0;
@@ -397,15 +396,10 @@ static zend_string *uriparser_uri_to_string(void *uri, uri_recomposition_mode_t
397396

398397
static void uriparser_free_uri(void *uri)
399398
{
400-
uriparser_uris_t *uriparser_uris = (uriparser_uris_t *) uri;
399+
uriparser_uris_t *uriparser_uris = uri;
401400

402401
uriFreeUriMembersA(&uriparser_uris->uri);
403-
404-
if (uriparser_uris->normalized_uri_initialized) {
405-
ZEND_ASSERT(uriparser_uris->normalized_uri.owner);
406-
407-
uriFreeUriMembersA(&uriparser_uris->normalized_uri);
408-
}
402+
uriFreeUriMembersA(&uriparser_uris->normalized_uri);
409403

410404
efree(uriparser_uris);
411405
}

ext/uri/tests/046.phpt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ var_dump($uri->toRawString());
2121
var_dump($uri->getPath());
2222
var_dump($uri->getRawPath());
2323

24+
$uri = new Uri\Rfc3986\Uri("//");
25+
var_dump($uri->toRawString());
26+
var_dump($uri->getPath());
27+
var_dump($uri->getRawPath());
28+
29+
$uri = new Uri\Rfc3986\Uri("///");
30+
var_dump($uri->toRawString());
31+
var_dump($uri->getPath());
32+
var_dump($uri->getRawPath());
33+
2434
$uri = new Uri\Rfc3986\Uri("https://example.com");
2535

2636
var_dump($uri->toRawString());
@@ -59,6 +69,12 @@ string(7) "foo/bar"
5969
string(8) "/foo/bar"
6070
string(8) "/foo/bar"
6171
string(8) "/foo/bar"
72+
string(2) "//"
73+
string(0) ""
74+
string(0) ""
75+
string(3) "///"
76+
string(1) "/"
77+
string(1) "/"
6278
string(19) "https://example.com"
6379
string(0) ""
6480
string(0) ""

ext/uri/tests/055.phpt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Test InvalidUrlException constructor error handling
3+
--EXTENSIONS--
4+
uri
5+
--FILE--
6+
<?php
7+
8+
try {
9+
var_dump(new Uri\Rfc3986\Uri('foo', new Uri\Rfc3986\Uri('bar')));
10+
} catch (Uri\InvalidUriException $e) {
11+
echo $e->getMessage() . "\n";
12+
}
13+
?>
14+
--EXPECT--
15+
The specified URI is malformed

0 commit comments

Comments
 (0)