]> git.sven.stormbind.net Git - sven/tclcurl.git/blob - debian/patches/bts719441.patch
Add d/pattches/bts719441.patch - thanks to Christian Werner! (Closes: #719441.patch)
[sven/tclcurl.git] / debian / patches / bts719441.patch
1 Description: close the file handle in time, increase space allocated for handleName and shandleName
2 Origin: https://www.androwish.org/index.html/vpatch?from=e4864fde820aac71&to=ce9a5b5886ac7381
3 Author: Christian Werner <chw@ch-werner.de>
4 Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719441
5 Forwarded: yes, email
6
7 Index: tclcurl/generic/tclcurl.c
8 ===================================================================
9 --- tclcurl.orig/generic/tclcurl.c
10 +++ tclcurl/generic/tclcurl.c
11 @@ -87,7 +87,7 @@ curlCreateObjCmd (Tcl_Interp *interp,str
12      Tcl_Command         cmdToken;
13  
14      /* We try with curl1, if it already exists with curl2...*/
15 -    handleName=(char *)Tcl_Alloc(10);
16 +    handleName=(char *)Tcl_Alloc(32);
17      for (i=1;;i++) {
18          sprintf(handleName,"curl%d",i);
19          if (!Tcl_GetCommandInfo(interp,handleName,&info)) {
20 @@ -483,6 +483,12 @@ curlSetOpts(Tcl_Interp *interp, struct c
21          case 2:
22              Tcl_Free(curlData->inFile);
23              curlData->inFile=curlstrdup(Tcl_GetString(objv));
24 +            if (curlData->inFlag) {
25 +                if (curlData->inHandle!=NULL) {
26 +                    fclose(curlData->inHandle);
27 +                    curlData->inHandle=NULL;
28 +                }
29 +            }
30              if ((strcmp(curlData->inFile,""))&&(strcmp(curlData->inFile,"stdin"))) {
31                  curlData->inFlag=1;
32              } else {
33 @@ -914,6 +920,13 @@ curlSetOpts(Tcl_Interp *interp, struct c
34          case 44:
35              Tcl_Free(curlData->headerFile);
36              curlData->headerFile=curlstrdup(Tcl_GetString(objv));
37 +            if (curlData->headerFlag) {
38 +                if (curlData->headerHandle!=NULL) {
39 +                    fclose(curlData->headerHandle);
40 +                    curlData->headerHandle=NULL;
41 +                }
42 +                curl_easy_setopt(curlHandle,CURLOPT_HEADERDATA,NULL);
43 +            }
44              if ((strcmp(curlData->headerFile,""))&&(strcmp(curlData->headerFile,"stdout"))
45                      &&(strcmp(curlData->headerFile,"stderr"))) {
46                  curlData->headerFlag=1;
47 @@ -1035,6 +1048,14 @@ curlSetOpts(Tcl_Interp *interp, struct c
48              }
49              break;
50          case 61:
51 +            if (curlData->headerFlag) {
52 +                if (curlData->headerHandle!=NULL) {
53 +                    fclose(curlData->headerHandle);
54 +                    curlData->headerHandle=NULL;
55 +                }
56 +                curl_easy_setopt(curlHandle,CURLOPT_HEADERDATA,NULL);
57 +                curlData->headerFlag=0;
58 +            }
59              if (curl_easy_setopt(curlHandle,CURLOPT_HEADERFUNCTION,
60                      curlHeaderReader)) {
61                  return TCL_ERROR;
62 @@ -1114,6 +1135,13 @@ curlSetOpts(Tcl_Interp *interp, struct c
63              break;
64          case 66:
65              curlData->readProc=curlstrdup(Tcl_GetString(objv));
66 +            if (curlData->inFlag) {
67 +                if (curlData->inHandle!=NULL) {
68 +                    fclose(curlData->inHandle);
69 +                    curlData->inHandle=NULL;
70 +                }
71 +                curl_easy_setopt(curlHandle,CURLOPT_READDATA,NULL);
72 +            }
73              curlData->inFlag=0;
74              if (strcmp(curlData->readProc,"")) {
75                  if (curl_easy_setopt(curlHandle,CURLOPT_READFUNCTION,
76 @@ -2439,12 +2467,14 @@ curlHeaderReader(void *ptr,size_t size,s
77          headerContent[charLength]=0;
78          /* There may be multiple 'Set-Cookie' headers, so we use a list */
79          if (Tcl_StringCaseMatch(headerName,"Set-Cookie",1)) {
80 -            Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName, \
81 +            Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName,
82                      headerContent,TCL_LIST_ELEMENT|TCL_APPEND_VALUE);
83          } else {
84              Tcl_SetVar2(curlData->interp,curlData->headerVar,headerName,
85                      headerContent,0);
86          }
87 +        Tcl_Free(headerContent);
88 +        Tcl_Free(headerName);
89      }
90      regExp=Tcl_RegExpCompile(curlData->interp,"(^(HTTP|http)[^\r]+)(\r*)(\n)");
91      match=Tcl_RegExpExec(curlData->interp,regExp,header,header);
92 @@ -2457,6 +2487,7 @@ curlHeaderReader(void *ptr,size_t size,s
93  
94          Tcl_SetVar2(curlData->interp,curlData->headerVar,"http",
95                  httpStatus,0);
96 +       Tcl_Free(httpStatus);
97      }
98      return size*nmemb;
99  }
100 @@ -4159,7 +4190,7 @@ curlCreateShareObjCmd (Tcl_Interp *inter
101      Tcl_Command         cmdToken;
102  
103      /* We try with scurl1, if it already exists with scurl2...*/
104 -    shandleName=(char *)Tcl_Alloc(10);
105 +    shandleName=(char *)Tcl_Alloc(32);
106      for (i=1;;i++) {
107          sprintf(shandleName,"scurl%d",i);
108          if (!Tcl_GetCommandInfo(interp,shandleName,&info)) {