Blame SOURCES/0201-Keep-a-reference-to-the-object-used-for-CURLOPT_POST.patch

1fb0df
From f1169a50516e34d22a22229113aef46212177417 Mon Sep 17 00:00:00 2001
1fb0df
From: Oleg Pudeyev <oleg@bsdpower.com>
1fb0df
Date: Thu, 3 Oct 2013 22:31:31 -0400
1fb0df
Subject: [PATCH] Keep a reference to the object used for CURLOPT_POSTFIELDS.
1fb0df
1fb0df
Fixes #34
1fb0df
1fb0df
Upstream-commit: b01a04fbd7797c70c5397a1b04abb09e6e4c8a36
1fb0df
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
1fb0df
---
1fb0df
 src/pycurl.c | 10 ++++++++++
1fb0df
 1 file changed, 10 insertions(+)
1fb0df
1fb0df
diff --git a/src/pycurl.c b/src/pycurl.c
1fb0df
index 9a7135c..31722ad 100644
1fb0df
--- a/src/pycurl.c
1fb0df
+++ b/src/pycurl.c
1fb0df
@@ -149,16 +149,18 @@ typedef struct {
1fb0df
     PyObject *pro_cb;
1fb0df
     PyObject *debug_cb;
1fb0df
     PyObject *ioctl_cb;
1fb0df
     PyObject *opensocket_cb;
1fb0df
     /* file objects */
1fb0df
     PyObject *readdata_fp;
1fb0df
     PyObject *writedata_fp;
1fb0df
     PyObject *writeheader_fp;
1fb0df
+    /* reference to the object used for CURLOPT_POSTFIELDS */
1fb0df
+    PyObject *postfields_obj;
1fb0df
     /* misc */
1fb0df
     char error[CURL_ERROR_SIZE+1];
1fb0df
 } CurlObject;
1fb0df
 
1fb0df
 /* Throw exception based on return value `res' and `self->error' */
1fb0df
 #define CURLERROR_RETVAL() do {\
1fb0df
     PyObject *v; \
1fb0df
     self->error[sizeof(self->error) - 1] = 0; \
1fb0df
@@ -727,16 +729,17 @@ util_curl_new(void)
1fb0df
     self->debug_cb = NULL;
1fb0df
     self->ioctl_cb = NULL;
1fb0df
     self->opensocket_cb = NULL;
1fb0df
 
1fb0df
     /* Set file object pointers to NULL by default */
1fb0df
     self->readdata_fp = NULL;
1fb0df
     self->writedata_fp = NULL;
1fb0df
     self->writeheader_fp = NULL;
1fb0df
+    self->postfields_obj = NULL;
1fb0df
 
1fb0df
     /* Zero string pointer memory buffer used by setopt */
1fb0df
     memset(self->error, 0, sizeof(self->error));
1fb0df
 
1fb0df
     return self;
1fb0df
 }
1fb0df
 
1fb0df
 /* initializer - used to intialize curl easy handles for use with pycurl */
1fb0df
@@ -854,16 +857,17 @@ util_curl_xdecref(CurlObject *self, int flags, CURL *handle)
1fb0df
         ZAP(self->ioctl_cb);
1fb0df
     }
1fb0df
 
1fb0df
     if (flags & 8) {
1fb0df
         /* Decrement refcount for python file objects. */
1fb0df
         ZAP(self->readdata_fp);
1fb0df
         ZAP(self->writedata_fp);
1fb0df
         ZAP(self->writeheader_fp);
1fb0df
+        ZAP(self->postfields_obj);
1fb0df
     }
1fb0df
 
1fb0df
     if (flags & 16) {
1fb0df
         /* Decrement refcount for share objects. */
1fb0df
         if (self->share != NULL) {
1fb0df
             CurlShareObject *share = self->share;
1fb0df
             self->share = NULL;
1fb0df
             if (share->share_handle != NULL && handle != NULL) {
1fb0df
@@ -1626,16 +1630,22 @@ do_curl_setopt(CurlObject *self, PyObject *args)
1fb0df
         /* Allocate memory to hold the string */
1fb0df
         assert(str != NULL);
1fb0df
         /* Call setopt */
1fb0df
         res = curl_easy_setopt(self->handle, (CURLoption)option, str);
1fb0df
         /* Check for errors */
1fb0df
         if (res != CURLE_OK) {
1fb0df
             CURLERROR_RETVAL();
1fb0df
         }
1fb0df
+        /* libcurl does not copy the value of CURLOPT_POSTFIELDS */
1fb0df
+        if (option == CURLOPT_POSTFIELDS) {
1fb0df
+            Py_INCREF(obj);
1fb0df
+            Py_XDECREF(self->postfields_obj);
1fb0df
+            self->postfields_obj = obj;
1fb0df
+        }
1fb0df
         Py_INCREF(Py_None);
1fb0df
         return Py_None;
1fb0df
     }
1fb0df
 
1fb0df
 #define IS_LONG_OPTION(o)   (o < CURLOPTTYPE_OBJECTPOINT)
1fb0df
 #define IS_OFF_T_OPTION(o)  (o >= CURLOPTTYPE_OFF_T)
1fb0df
 
1fb0df
     /* Handle the case of integer arguments */
1fb0df
-- 
1fb0df
2.5.0
1fb0df