From c616ae3f10fdb1587ce62da84ff64b5814d8e152 Mon Sep 17 00:00:00 2001 From: Sven Hoexter Date: Sun, 14 Aug 2016 16:00:12 +0200 Subject: [PATCH] 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 --- generic/tclcurl.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/generic/tclcurl.c b/generic/tclcurl.c index 21c947c..5bd7dda 100755 --- a/generic/tclcurl.c +++ b/generic/tclcurl.c @@ -87,7 +87,7 @@ curlCreateObjCmd (Tcl_Interp *interp,struct curlObjData *curlData) { Tcl_Command cmdToken; /* We try with curl1, if it already exists with curl2...*/ - handleName=(char *)Tcl_Alloc(10); + handleName=(char *)Tcl_Alloc(32); for (i=1;;i++) { sprintf(handleName,"curl%d",i); if (!Tcl_GetCommandInfo(interp,handleName,&info)) { @@ -477,6 +477,12 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, case 2: Tcl_Free(curlData->inFile); 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"))) { curlData->inFlag=1; } else { @@ -908,6 +914,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, case 44: Tcl_Free(curlData->headerFile); 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")) &&(strcmp(curlData->headerFile,"stderr"))) { curlData->headerFlag=1; @@ -1029,6 +1042,14 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, } break; 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, curlHeaderReader)) { return TCL_ERROR; @@ -1093,6 +1114,13 @@ curlSetOpts(Tcl_Interp *interp, struct curlObjData *curlData, break; case 66: 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; if (strcmp(curlData->readProc,"")) { 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; /* There may be multiple 'Set-Cookie' headers, so we use a list */ 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); } else { Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName, headerContent,0); } + Tcl_Free(headerContent); + Tcl_Free(headerName); } regExp=Tcl_RegExpCompile(curlData->interp,"(^(HTTP|http)[^\r]+)(\r*)(\n)"); 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", httpStatus,0); + Tcl_Free(httpStatus); } return size*nmemb; } @@ -4138,7 +4169,7 @@ curlCreateShareObjCmd (Tcl_Interp *interp,struct shcurlObjData *shcurlData) { Tcl_Command cmdToken; /* We try with scurl1, if it already exists with scurl2...*/ - shandleName=(char *)Tcl_Alloc(10); + shandleName=(char *)Tcl_Alloc(32); for (i=1;;i++) { sprintf(shandleName,"scurl%d",i); if (!Tcl_GetCommandInfo(interp,shandleName,&info)) {