You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.2 KiB
174 lines
4.2 KiB
diff -u M2Crypto/SWIG/_lib.h M2Crypto-0.21.1/SWIG/_lib.h |
|
--- M2Crypto/SWIG/_lib.h 2011-01-19 19:56:37.622364336 +0100 |
|
+++ M2Crypto-0.21.1/SWIG/_lib.h 2011-05-10 20:14:38.593211256 +0200 |
|
@@ -7,6 +7,16 @@ |
|
#define PY_SSIZE_T_MIN INT_MIN |
|
#endif |
|
|
|
+#if PY_VERSION_HEX < 0x02060000 |
|
+struct Py_buffer /* Only a subset */ |
|
+{ |
|
+ void *buf; |
|
+ Py_ssize_t len; |
|
+}; |
|
+ |
|
+#define PyBUF_CONTIG_RO 0 |
|
+#endif /* PY_VERSION_HEX < 0x02060000 */ |
|
+ |
|
typedef struct _blob { |
|
unsigned char *data; |
|
int len; |
|
@@ -20,6 +30,10 @@ |
|
int *buffer_len); |
|
static int m2_PyString_AsStringAndSizeInt(PyObject *obj, char **s, int *len); |
|
|
|
+/* Always use these two together, to correctly handle non-memoryview objects. */ |
|
+static int m2_PyObject_GetBufferInt(PyObject *obj, Py_buffer *view, int flags); |
|
+static void m2_PyBuffer_Release(PyObject *obj, Py_buffer *view); |
|
+ |
|
void gen_callback(int p, int n, void *arg); |
|
int passphrase_callback(char *buf, int num, int v, void *userdata); |
|
|
|
diff -u M2Crypto/SWIG/_lib.i M2Crypto-0.21.1/SWIG/_lib.i |
|
--- M2Crypto/SWIG/_lib.i 2011-01-19 19:49:21.537145465 +0100 |
|
+++ M2Crypto-0.21.1/SWIG/_lib.i 2011-05-10 20:19:10.924328007 +0200 |
|
@@ -47,9 +47,36 @@ |
|
/* Python helpers. */ |
|
|
|
%} |
|
+%ignore PyObject_CheckBuffer; |
|
+%ignore PyObject_GetBuffer; |
|
+%ignore PyBuffer_Release; |
|
%ignore m2_PyObject_AsReadBufferInt; |
|
+%ignore m2_PyObject_GetBufferInt; |
|
+%ignore m2_PyBuffer_Release; |
|
%ignore m2_PyString_AsStringAndSizeInt; |
|
%{ |
|
+ |
|
+#if PY_VERSION_HEX < 0x02060000 |
|
+static int PyObject_CheckBuffer(PyObject *obj) |
|
+{ |
|
+ (void)obj; |
|
+ return 0; |
|
+} |
|
+ |
|
+static int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) |
|
+{ |
|
+ (void)obj; |
|
+ (void)view; |
|
+ (void)flags; |
|
+ return -1; |
|
+} |
|
+ |
|
+static void PyBuffer_Release(Py_buffer *view) |
|
+{ |
|
+ (void)view; |
|
+} |
|
+#endif /* PY_VERSION_HEX < 0x02060000 */ |
|
+ |
|
static int |
|
m2_PyObject_AsReadBufferInt(PyObject *obj, const void **buffer, |
|
int *buffer_len) |
|
@@ -68,6 +95,37 @@ |
|
return 0; |
|
} |
|
|
|
+static int m2_PyObject_GetBufferInt(PyObject *obj, Py_buffer *view, int flags) |
|
+{ |
|
+ int ret; |
|
+ |
|
+ if (PyObject_CheckBuffer(obj)) |
|
+ ret = PyObject_GetBuffer(obj, view, flags); |
|
+ else { |
|
+ const void *buf; |
|
+ |
|
+ ret = PyObject_AsReadBuffer(obj, &buf, &view->len); |
|
+ if (ret == 0) |
|
+ view->buf = (void *)buf; |
|
+ } |
|
+ if (ret) |
|
+ return ret; |
|
+ if (view->len > INT_MAX) { |
|
+ PyErr_SetString(PyExc_ValueError, "object too large"); |
|
+ m2_PyBuffer_Release(obj, view); |
|
+ return -1; |
|
+ } |
|
+ |
|
+ return 0; |
|
+} |
|
+ |
|
+static void m2_PyBuffer_Release(PyObject *obj, Py_buffer *view) |
|
+{ |
|
+ if (PyObject_CheckBuffer(obj)) |
|
+ PyBuffer_Release(view); |
|
+ /* else do nothing, view->buf comes from PyObject_AsReadBuffer */ |
|
+} |
|
+ |
|
static int |
|
m2_PyString_AsStringAndSizeInt(PyObject *obj, char **s, int *len) |
|
{ |
|
diff -u M2Crypto/SWIG/_ssl.i M2Crypto-0.21.1/SWIG/_ssl.i |
|
--- M2Crypto/SWIG/_ssl.i 2011-01-19 19:56:51.957338576 +0100 |
|
+++ M2Crypto-0.21.1/SWIG/_ssl.i 2011-05-10 19:58:26.779904541 +0200 |
|
@@ -700,12 +700,12 @@ |
|
} |
|
|
|
int ssl_write(SSL *ssl, PyObject *blob, double timeout) { |
|
- const void *buf; |
|
- int len, r, ssl_err, ret; |
|
+ Py_buffer buf; |
|
+ int r, ssl_err, ret; |
|
struct timeval tv; |
|
|
|
|
|
- if (m2_PyObject_AsReadBufferInt(blob, &buf, &len) == -1) { |
|
+ if (m2_PyObject_GetBufferInt(blob, &buf, PyBUF_CONTIG_RO) == -1) { |
|
return -1; |
|
} |
|
|
|
@@ -713,7 +713,7 @@ |
|
gettimeofday(&tv, NULL); |
|
again: |
|
Py_BEGIN_ALLOW_THREADS |
|
- r = SSL_write(ssl, buf, len); |
|
+ r = SSL_write(ssl, buf.buf, buf.len); |
|
ssl_err = SSL_get_error(ssl, r); |
|
Py_END_ALLOW_THREADS |
|
|
|
@@ -741,22 +741,22 @@ |
|
ret = -1; |
|
} |
|
|
|
- |
|
+ m2_PyBuffer_Release(blob, &buf); |
|
return ret; |
|
} |
|
|
|
int ssl_write_nbio(SSL *ssl, PyObject *blob) { |
|
- const void *buf; |
|
- int len, r, err, ret; |
|
+ Py_buffer buf; |
|
+ int r, err, ret; |
|
|
|
|
|
- if (m2_PyObject_AsReadBufferInt(blob, &buf, &len) == -1) { |
|
+ if (m2_PyObject_GetBufferInt(blob, &buf, PyBUF_CONTIG_RO) == -1) { |
|
return -1; |
|
} |
|
|
|
|
|
Py_BEGIN_ALLOW_THREADS |
|
- r = SSL_write(ssl, buf, len); |
|
+ r = SSL_write(ssl, buf.buf, buf.len); |
|
Py_END_ALLOW_THREADS |
|
|
|
|
|
@@ -785,7 +785,7 @@ |
|
ret = -1; |
|
} |
|
|
|
- |
|
+ m2_PyBuffer_Release(blob, &buf); |
|
return ret; |
|
} |
|
|
|
|