Close the file handle in time, increase space allocated for handleName and shandleName.
Origin: https://www.androwish.org/index.html/vpatch?from=e4864fde820aac71&to=ce9a5b5886ac7381 Author: Christian Werner <chw@ch-werner.de>
This commit is contained in:
parent
93ced48247
commit
c616ae3f10
@ -87,7 +87,7 @@ curlCreateObjCmd (Tcl_Interp *interp,struct curlObjData *curlData) {
|
|||||||
Tcl_Command cmdToken;
|
Tcl_Command cmdToken;
|
||||||
|
|
||||||
/* We try with curl1, if it already exists with curl2...*/
|
/* We try with curl1, if it already exists with curl2...*/
|
||||||
handleName=(char *)Tcl_Alloc(10);
|
handleName=(char *)Tcl_Alloc(32);
|
||||||
for (i=1;;i++) {
|
for (i=1;;i++) {
|
||||||
sprintf(handleName,"curl%d",i);
|
sprintf(handleName,"curl%d",i);
|
||||||
if (!Tcl_GetCommandInfo(interp,handleName,&info)) {
|
if (!Tcl_GetCommandInfo(interp,handleName,&info)) {
|
||||||
@ -477,6 +477,12 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData,
|
|||||||
case 2:
|
case 2:
|
||||||
Tcl_Free(curlData->inFile);
|
Tcl_Free(curlData->inFile);
|
||||||
curlData->inFile=curlstrdup(Tcl_GetString(objv));
|
curlData->inFile=curlstrdup(Tcl_GetString(objv));
|
||||||
|
if (curlData->inFlag) {
|
||||||
|
if (curlData->inHandle!=NULL) {
|
||||||
|
fclose(curlData->inHandle);
|
||||||
|
curlData->inHandle=NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
if ((strcmp(curlData->inFile,""))&&(strcmp(curlData->inFile,"stdin"))) {
|
if ((strcmp(curlData->inFile,""))&&(strcmp(curlData->inFile,"stdin"))) {
|
||||||
curlData->inFlag=1;
|
curlData->inFlag=1;
|
||||||
} else {
|
} else {
|
||||||
@ -908,6 +914,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData,
|
|||||||
case 44:
|
case 44:
|
||||||
Tcl_Free(curlData->headerFile);
|
Tcl_Free(curlData->headerFile);
|
||||||
curlData->headerFile=curlstrdup(Tcl_GetString(objv));
|
curlData->headerFile=curlstrdup(Tcl_GetString(objv));
|
||||||
|
if (curlData->headerFlag) {
|
||||||
|
if (curlData->headerHandle!=NULL) {
|
||||||
|
fclose(curlData->headerHandle);
|
||||||
|
curlData->headerHandle=NULL;
|
||||||
|
}
|
||||||
|
curl_easy_setopt(curlHandle,CURLOPT_HEADERDATA,NULL);
|
||||||
|
}
|
||||||
if ((strcmp(curlData->headerFile,""))&&(strcmp(curlData->headerFile,"stdout"))
|
if ((strcmp(curlData->headerFile,""))&&(strcmp(curlData->headerFile,"stdout"))
|
||||||
&&(strcmp(curlData->headerFile,"stderr"))) {
|
&&(strcmp(curlData->headerFile,"stderr"))) {
|
||||||
curlData->headerFlag=1;
|
curlData->headerFlag=1;
|
||||||
@ -1029,6 +1042,14 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 61:
|
case 61:
|
||||||
|
if (curlData->headerFlag) {
|
||||||
|
if (curlData->headerHandle!=NULL) {
|
||||||
|
fclose(curlData->headerHandle);
|
||||||
|
curlData->headerHandle=NULL;
|
||||||
|
}
|
||||||
|
curl_easy_setopt(curlHandle,CURLOPT_HEADERDATA,NULL);
|
||||||
|
curlData->headerFlag=0;
|
||||||
|
}
|
||||||
if (curl_easy_setopt(curlHandle,CURLOPT_HEADERFUNCTION,
|
if (curl_easy_setopt(curlHandle,CURLOPT_HEADERFUNCTION,
|
||||||
curlHeaderReader)) {
|
curlHeaderReader)) {
|
||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
@ -1093,6 +1114,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData,
|
|||||||
break;
|
break;
|
||||||
case 66:
|
case 66:
|
||||||
curlData->readProc=curlstrdup(Tcl_GetString(objv));
|
curlData->readProc=curlstrdup(Tcl_GetString(objv));
|
||||||
|
if (curlData->inFlag) {
|
||||||
|
if (curlData->inHandle!=NULL) {
|
||||||
|
fclose(curlData->inHandle);
|
||||||
|
curlData->inHandle=NULL;
|
||||||
|
}
|
||||||
|
curl_easy_setopt(curlHandle,CURLOPT_READDATA,NULL);
|
||||||
|
}
|
||||||
curlData->inFlag=0;
|
curlData->inFlag=0;
|
||||||
if (strcmp(curlData->readProc,"")) {
|
if (strcmp(curlData->readProc,"")) {
|
||||||
if (curl_easy_setopt(curlHandle,CURLOPT_READFUNCTION,
|
if (curl_easy_setopt(curlHandle,CURLOPT_READFUNCTION,
|
||||||
@ -2418,12 +2446,14 @@ curlHeaderReader(void *ptr,size_t size,size_t nmemb,FILE *curlDataPtr) {
|
|||||||
headerContent[charLength]=0;
|
headerContent[charLength]=0;
|
||||||
/* There may be multiple 'Set-Cookie' headers, so we use a list */
|
/* There may be multiple 'Set-Cookie' headers, so we use a list */
|
||||||
if (Tcl_StringCaseMatch(headerName,"Set-Cookie",1)) {
|
if (Tcl_StringCaseMatch(headerName,"Set-Cookie",1)) {
|
||||||
Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName, \
|
Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName,
|
||||||
headerContent,TCL_LIST_ELEMENT|TCL_APPEND_VALUE);
|
headerContent,TCL_LIST_ELEMENT|TCL_APPEND_VALUE);
|
||||||
} else {
|
} else {
|
||||||
Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName,
|
Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName,
|
||||||
headerContent,0);
|
headerContent,0);
|
||||||
}
|
}
|
||||||
|
Tcl_Free(headerContent);
|
||||||
|
Tcl_Free(headerName);
|
||||||
}
|
}
|
||||||
regExp=Tcl_RegExpCompile(curlData->interp,"(^(HTTP|http)[^\r]+)(\r*)(\n)");
|
regExp=Tcl_RegExpCompile(curlData->interp,"(^(HTTP|http)[^\r]+)(\r*)(\n)");
|
||||||
match=Tcl_RegExpExec(curlData->interp,regExp,header,header);
|
match=Tcl_RegExpExec(curlData->interp,regExp,header,header);
|
||||||
@ -2436,6 +2466,7 @@ curlHeaderReader(void *ptr,size_t size,size_t nmemb,FILE *curlDataPtr) {
|
|||||||
|
|
||||||
Tcl_SetVar2(curlData->interp,curlData->headerVar,"http",
|
Tcl_SetVar2(curlData->interp,curlData->headerVar,"http",
|
||||||
httpStatus,0);
|
httpStatus,0);
|
||||||
|
Tcl_Free(httpStatus);
|
||||||
}
|
}
|
||||||
return size*nmemb;
|
return size*nmemb;
|
||||||
}
|
}
|
||||||
@ -4138,7 +4169,7 @@ curlCreateShareObjCmd (Tcl_Interp *interp,struct shcurlObjData *shcurlData) {
|
|||||||
Tcl_Command cmdToken;
|
Tcl_Command cmdToken;
|
||||||
|
|
||||||
/* We try with scurl1, if it already exists with scurl2...*/
|
/* We try with scurl1, if it already exists with scurl2...*/
|
||||||
shandleName=(char *)Tcl_Alloc(10);
|
shandleName=(char *)Tcl_Alloc(32);
|
||||||
for (i=1;;i++) {
|
for (i=1;;i++) {
|
||||||
sprintf(shandleName,"scurl%d",i);
|
sprintf(shandleName,"scurl%d",i);
|
||||||
if (!Tcl_GetCommandInfo(interp,shandleName,&info)) {
|
if (!Tcl_GetCommandInfo(interp,shandleName,&info)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user