Skip to content

Commit e93f59b

Browse files
author
kalibera
committed
Translate strings to native encoding defensively before use.
git-svn-id: https://svn.r-project.org/R/trunk@85695 00db46b3-68df-0310-9c12-caf00c1e9a41
1 parent 6fd9fb5 commit e93f59b

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/modules/internet/libcurl.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -269,12 +269,14 @@ static void curlCommon(CURL *hnd, int redirect, int verify)
269269
int Default = 1;
270270
SEXP sua = GetOption1(install("HTTPUserAgent")); // set in utils startup
271271
if (TYPEOF(sua) == STRSXP && LENGTH(sua) == 1 ) {
272-
const char *p = CHAR(STRING_ELT(sua, 0));
272+
const void *vmax = vmaxget();
273+
const char *p = translateChar(STRING_ELT(sua, 0));
273274
if (p[0] && p[1] && p[2] && p[0] == 'R' && p[1] == ' ' && p[2] == '(') {
274275
} else {
275276
Default = 0;
276277
curl_easy_setopt(hnd, CURLOPT_USERAGENT, p);
277278
}
279+
vmaxset(vmax);
278280
}
279281
if (Default) {
280282
char buf[20];
@@ -533,6 +535,7 @@ in_do_curlDownload(SEXP call, SEXP op, SEXP args, SEXP rho)
533535
const char *url, *file, *mode;
534536
int quiet, cacheOK;
535537
struct curl_slist *headers = NULL;
538+
const void *vmax = vmaxget();
536539

537540
scmd = CAR(args); args = CDR(args);
538541
if (!isString(scmd) || length(scmd) < 1)
@@ -553,7 +556,7 @@ in_do_curlDownload(SEXP call, SEXP op, SEXP args, SEXP rho)
553556
smode = CAR(args); args = CDR(args);
554557
if (!isString(smode) || length(smode) != 1)
555558
error(_("invalid '%s' argument"), "mode");
556-
mode = CHAR(STRING_ELT(smode, 0));
559+
mode = translateChar(STRING_ELT(smode, 0));
557560
cacheOK = asLogical(CAR(args)); args = CDR(args);
558561
if (cacheOK == NA_LOGICAL)
559562
error(_("invalid '%s' argument"), "cacheOK");
@@ -563,7 +566,8 @@ in_do_curlDownload(SEXP call, SEXP op, SEXP args, SEXP rho)
563566
if(TYPEOF(sheaders) != NILSXP) {
564567
for (int i = 0; i < LENGTH(sheaders); i++) {
565568
struct curl_slist *tmp =
566-
curl_slist_append(headers, CHAR(STRING_ELT(sheaders, i)));
569+
curl_slist_append(headers,
570+
translateChar(STRING_ELT(sheaders, i)));
567571
if (!tmp) {
568572
if (headers) curl_slist_free_all(headers);
569573
error(_("out of memory"));
@@ -604,7 +608,7 @@ in_do_curlDownload(SEXP call, SEXP op, SEXP args, SEXP rho)
604608
}
605609

606610
for(int i = 0; i < nurls; i++) {
607-
url = CHAR(STRING_ELT(scmd, i));
611+
url = translateChar(STRING_ELT(scmd, i));
608612
hnd[i] = curl_easy_init();
609613
if (!hnd[i]) {
610614
n_err += 1;
@@ -695,6 +699,7 @@ in_do_curlDownload(SEXP call, SEXP op, SEXP args, SEXP rho)
695699
if (n_err == nurls) {
696700
// no dest files could be opened, so bail out
697701
curl_multi_cleanup(mhnd);
702+
vmaxset(vmax);
698703
return ScalarInteger(1);
699704
}
700705

@@ -791,11 +796,13 @@ in_do_curlDownload(SEXP call, SEXP op, SEXP args, SEXP rho)
791796
else if (n_err) warning(_("some files were not downloaded"));
792797
} else if(n_err) {
793798
if (status != 200)
794-
error(_("cannot open URL '%s'"), CHAR(STRING_ELT(scmd, 0)));
799+
error(_("cannot open URL '%s'"),
800+
translateChar(STRING_ELT(scmd, 0)));
795801
else
796-
error(_("download from '%s' failed"), CHAR(STRING_ELT(scmd, 0)));
802+
error(_("download from '%s' failed"),
803+
translateChar(STRING_ELT(scmd, 0)));
797804
}
798-
805+
vmaxset(vmax);
799806
return ScalarInteger(0);
800807
#endif
801808
}
@@ -1052,9 +1059,11 @@ in_newCurlUrl(const char *description, const char * const mode,
10521059
/* for Solaris 12.5 */ new = NULL;
10531060
}
10541061
ctxt->headers = NULL;
1062+
const void *vmax = vmaxget();
10551063
for (int i = 0; i < LENGTH(headers); i++) {
10561064
struct curl_slist *tmp =
1057-
curl_slist_append(ctxt->headers, CHAR(STRING_ELT(headers, i)));
1065+
curl_slist_append(ctxt->headers,
1066+
translateChar(STRING_ELT(headers, i)));
10581067
if (!tmp) {
10591068
free(new->description); free(new->class); free(new->private);
10601069
free(new); curl_slist_free_all(ctxt->headers);
@@ -1063,6 +1072,7 @@ in_newCurlUrl(const char *description, const char * const mode,
10631072
}
10641073
ctxt->headers = tmp;
10651074
}
1075+
vmaxset(vmax);
10661076
return new;
10671077
#else
10681078
error(_("url(method = \"libcurl\") is not supported on this platform"));

0 commit comments

Comments
 (0)