mirror of
https://github.com/curl/curl.git
synced 2026-04-11 12:01:42 +08:00
lib1560: fix memory leak when run without UTF-8 support
The issue is missed in CI, because valgrind jobs all run with UTF-8
support.
Fixing:
```
test 1560...[URL API]
valgrind ERROR ==13362== 104 bytes in 1 blocks are definitely lost in loss record 1 of 1
==13362== at 0x484D953: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==13362== by 0x48E1302: curl_dbg_calloc (in /curl/bld/lib/libcurl.so.4.8.0)
==13362== by 0x4931D12: curl_url (in /curl/bld/lib/libcurl.so.4.8.0)
==13362== by 0x14F658: get_parts (in /curl/bld/tests/libtest/libtests)
==13362== by 0x150AC6: test_lib1560 (in /curl/bld/tests/libtest/libtests)
==13362== by 0x17F5D5: main (in /curl/bld/tests/libtest/libtests)
```
Ref: https://github.com/curl/curl/actions/runs/16446352985/job/46479298080?pr=17988#step:41:3007
Follow-up to 7d1ca2e7e1 #17933
Closes #17998
This commit is contained in:
parent
9657a2041e
commit
5cdb9b44bd
@ -1434,43 +1434,45 @@ static int setget_parts(int has_utf8)
|
||||
int error = 0;
|
||||
|
||||
for(i = 0; setget_parts_list[i].set && !error; i++) {
|
||||
CURLUcode rc;
|
||||
CURLU *urlp = curl_url();
|
||||
if(!urlp) {
|
||||
error++;
|
||||
break;
|
||||
}
|
||||
if((setget_parts_list[i].getflags == CURLU_PUNYCODE ||
|
||||
setget_parts_list[i].getflags == CURLU_PUNY2IDN) && !has_utf8) {
|
||||
continue;
|
||||
}
|
||||
if(setget_parts_list[i].in)
|
||||
rc = curl_url_set(urlp, CURLUPART_URL, setget_parts_list[i].in,
|
||||
setget_parts_list[i].urlflags);
|
||||
else
|
||||
rc = CURLUE_OK;
|
||||
if(!rc) {
|
||||
char *url = NULL;
|
||||
CURLUcode uc = updateurl(urlp, setget_parts_list[i].set,
|
||||
setget_parts_list[i].setflags);
|
||||
if((setget_parts_list[i].getflags != CURLU_PUNYCODE &&
|
||||
setget_parts_list[i].getflags != CURLU_PUNY2IDN) || has_utf8) {
|
||||
CURLUcode rc;
|
||||
if(setget_parts_list[i].in)
|
||||
rc = curl_url_set(urlp, CURLUPART_URL, setget_parts_list[i].in,
|
||||
setget_parts_list[i].urlflags);
|
||||
else
|
||||
rc = CURLUE_OK;
|
||||
if(!rc) {
|
||||
char *url = NULL;
|
||||
CURLUcode uc = updateurl(urlp, setget_parts_list[i].set,
|
||||
setget_parts_list[i].setflags);
|
||||
|
||||
if(uc != setget_parts_list[i].pcode) {
|
||||
curl_mfprintf(stderr, "updateurl\nin: %s\nreturned %d (expected %d)\n",
|
||||
setget_parts_list[i].set,
|
||||
(int)uc, setget_parts_list[i].pcode);
|
||||
if(uc != setget_parts_list[i].pcode) {
|
||||
curl_mfprintf(stderr,
|
||||
"updateurl\nin: %s\nreturned %d (expected %d)\n",
|
||||
setget_parts_list[i].set, (int)uc,
|
||||
setget_parts_list[i].pcode);
|
||||
error++;
|
||||
}
|
||||
if(!uc) {
|
||||
if(checkparts(urlp,
|
||||
setget_parts_list[i].set,
|
||||
setget_parts_list[i].out,
|
||||
setget_parts_list[i].getflags))
|
||||
error++; /* add */
|
||||
}
|
||||
curl_free(url);
|
||||
}
|
||||
else if(rc != CURLUE_OK) {
|
||||
curl_mfprintf(stderr, "Set parts\nin: %s\nreturned %d (expected %d)\n",
|
||||
setget_parts_list[i].in, (int)rc, 0);
|
||||
error++;
|
||||
}
|
||||
if(!uc) {
|
||||
if(checkparts(urlp, setget_parts_list[i].set, setget_parts_list[i].out,
|
||||
setget_parts_list[i].getflags))
|
||||
error++; /* add */
|
||||
}
|
||||
curl_free(url);
|
||||
}
|
||||
else if(rc != CURLUE_OK) {
|
||||
curl_mfprintf(stderr, "Set parts\nin: %s\nreturned %d (expected %d)\n",
|
||||
setget_parts_list[i].in, (int)rc, 0);
|
||||
error++;
|
||||
}
|
||||
curl_url_cleanup(urlp);
|
||||
}
|
||||
@ -1534,39 +1536,38 @@ static int get_url(int has_utf8)
|
||||
int i;
|
||||
int error = 0;
|
||||
for(i = 0; get_url_list[i].in && !error; i++) {
|
||||
CURLUcode rc;
|
||||
CURLU *urlp = curl_url();
|
||||
if(!urlp) {
|
||||
error++;
|
||||
break;
|
||||
}
|
||||
if((get_url_list[i].getflags == CURLU_PUNYCODE ||
|
||||
get_url_list[i].getflags == CURLU_PUNY2IDN) && !has_utf8) {
|
||||
continue;
|
||||
}
|
||||
rc = curl_url_set(urlp, CURLUPART_URL, get_url_list[i].in,
|
||||
get_url_list[i].urlflags);
|
||||
if(!rc) {
|
||||
char *url = NULL;
|
||||
rc = curl_url_get(urlp, CURLUPART_URL, &url, get_url_list[i].getflags);
|
||||
if((get_url_list[i].getflags != CURLU_PUNYCODE &&
|
||||
get_url_list[i].getflags != CURLU_PUNY2IDN) || has_utf8) {
|
||||
CURLUcode rc;
|
||||
rc = curl_url_set(urlp, CURLUPART_URL, get_url_list[i].in,
|
||||
get_url_list[i].urlflags);
|
||||
if(!rc) {
|
||||
char *url = NULL;
|
||||
rc = curl_url_get(urlp, CURLUPART_URL, &url, get_url_list[i].getflags);
|
||||
|
||||
if(rc) {
|
||||
curl_mfprintf(stderr, "%s:%d returned %d (%s). URL: '%s'\n",
|
||||
__FILE__, __LINE__, (int)rc, curl_url_strerror(rc),
|
||||
get_url_list[i].in);
|
||||
error++;
|
||||
}
|
||||
else {
|
||||
if(checkurl(get_url_list[i].in, url, get_url_list[i].out)) {
|
||||
if(rc) {
|
||||
curl_mfprintf(stderr, "%s:%d returned %d (%s). URL: '%s'\n",
|
||||
__FILE__, __LINE__, (int)rc, curl_url_strerror(rc),
|
||||
get_url_list[i].in);
|
||||
error++;
|
||||
}
|
||||
else {
|
||||
if(checkurl(get_url_list[i].in, url, get_url_list[i].out)) {
|
||||
error++;
|
||||
}
|
||||
}
|
||||
curl_free(url);
|
||||
}
|
||||
if(rc != get_url_list[i].ucode) {
|
||||
curl_mfprintf(stderr, "Get URL\nin: %s\nreturned %d (expected %d)\n",
|
||||
get_url_list[i].in, (int)rc, get_url_list[i].ucode);
|
||||
error++;
|
||||
}
|
||||
curl_free(url);
|
||||
}
|
||||
if(rc != get_url_list[i].ucode) {
|
||||
curl_mfprintf(stderr, "Get URL\nin: %s\nreturned %d (expected %d)\n",
|
||||
get_url_list[i].in, (int)rc, get_url_list[i].ucode);
|
||||
error++;
|
||||
}
|
||||
curl_url_cleanup(urlp);
|
||||
}
|
||||
@ -1578,30 +1579,29 @@ static int get_parts(int has_utf8)
|
||||
int i;
|
||||
int error = 0;
|
||||
for(i = 0; get_parts_list[i].in && !error; i++) {
|
||||
CURLUcode rc;
|
||||
CURLU *urlp = curl_url();
|
||||
if(!urlp) {
|
||||
error++;
|
||||
break;
|
||||
}
|
||||
if((get_parts_list[i].getflags == CURLU_PUNYCODE ||
|
||||
get_parts_list[i].getflags == CURLU_PUNY2IDN) && !has_utf8) {
|
||||
continue;
|
||||
if((get_parts_list[i].getflags != CURLU_PUNYCODE &&
|
||||
get_parts_list[i].getflags != CURLU_PUNY2IDN) || has_utf8) {
|
||||
CURLUcode rc;
|
||||
rc = curl_url_set(urlp, CURLUPART_URL,
|
||||
get_parts_list[i].in,
|
||||
get_parts_list[i].urlflags);
|
||||
if(rc != get_parts_list[i].ucode) {
|
||||
curl_mfprintf(stderr, "Get parts\nin: %s\nreturned %d (expected %d)\n",
|
||||
get_parts_list[i].in, (int)rc, get_parts_list[i].ucode);
|
||||
error++;
|
||||
}
|
||||
else if(get_parts_list[i].ucode) {
|
||||
/* the expected error happened */
|
||||
}
|
||||
else if(checkparts(urlp, get_parts_list[i].in, get_parts_list[i].out,
|
||||
get_parts_list[i].getflags))
|
||||
error++;
|
||||
}
|
||||
rc = curl_url_set(urlp, CURLUPART_URL,
|
||||
get_parts_list[i].in,
|
||||
get_parts_list[i].urlflags);
|
||||
if(rc != get_parts_list[i].ucode) {
|
||||
curl_mfprintf(stderr, "Get parts\nin: %s\nreturned %d (expected %d)\n",
|
||||
get_parts_list[i].in, (int)rc, get_parts_list[i].ucode);
|
||||
error++;
|
||||
}
|
||||
else if(get_parts_list[i].ucode) {
|
||||
/* the expected error happened */
|
||||
}
|
||||
else if(checkparts(urlp, get_parts_list[i].in, get_parts_list[i].out,
|
||||
get_parts_list[i].getflags))
|
||||
error++;
|
||||
curl_url_cleanup(urlp);
|
||||
}
|
||||
return error;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user