|
@@ -56,23 +56,48 @@ static PyObject *py_apply_delta(PyObject *self, PyObject *args)
|
|
|
size_t outindex = 0;
|
|
|
int index;
|
|
|
uint8_t *out;
|
|
|
- PyObject *ret;
|
|
|
+ PyObject *ret, *py_src_buf;
|
|
|
|
|
|
- if (!PyArg_ParseTuple(args, "s#s#", (uint8_t *)&src_buf, &src_buf_len,
|
|
|
+ if (!PyArg_ParseTuple(args, "Os#", &py_src_buf,
|
|
|
(uint8_t *)&delta, &delta_len))
|
|
|
return NULL;
|
|
|
|
|
|
+ if (PyList_Check(py_src_buf)) {
|
|
|
+ PyObject *sep = PyString_FromString("");
|
|
|
+ if (sep == NULL) {
|
|
|
+ PyErr_NoMemory();
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ py_src_buf = _PyString_Join(sep, py_src_buf);
|
|
|
+ Py_DECREF(sep);
|
|
|
+ if (py_src_buf == NULL) {
|
|
|
+ PyErr_NoMemory();
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ } else if (PyString_Check(py_src_buf)) {
|
|
|
+ Py_INCREF(py_src_buf);
|
|
|
+ } else {
|
|
|
+ PyErr_SetString(PyExc_TypeError,
|
|
|
+ "src_buf is not a string or a list of chunks");
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ src_buf = (uint8_t *)PyString_AS_STRING(py_src_buf);
|
|
|
+ src_buf_len = PyString_GET_SIZE(py_src_buf);
|
|
|
+
|
|
|
index = 0;
|
|
|
src_size = get_delta_header_size(delta, &index, delta_len);
|
|
|
if (src_size != src_buf_len) {
|
|
|
PyErr_Format(PyExc_ValueError,
|
|
|
"Unexpected source buffer size: %lu vs %d", src_size, src_buf_len);
|
|
|
+ Py_DECREF(py_src_buf);
|
|
|
return NULL;
|
|
|
}
|
|
|
dest_size = get_delta_header_size(delta, &index, delta_len);
|
|
|
ret = PyString_FromStringAndSize(NULL, dest_size);
|
|
|
if (ret == NULL) {
|
|
|
PyErr_NoMemory();
|
|
|
+ Py_DECREF(py_src_buf);
|
|
|
return NULL;
|
|
|
}
|
|
|
out = (uint8_t *)PyString_AsString(ret);
|
|
@@ -111,9 +136,11 @@ static PyObject *py_apply_delta(PyObject *self, PyObject *args)
|
|
|
} else {
|
|
|
PyErr_SetString(PyExc_ValueError, "Invalid opcode 0");
|
|
|
Py_DECREF(ret);
|
|
|
+ Py_DECREF(py_src_buf);
|
|
|
return NULL;
|
|
|
}
|
|
|
}
|
|
|
+ Py_DECREF(py_src_buf);
|
|
|
|
|
|
if (index != delta_len) {
|
|
|
PyErr_SetString(PyExc_ValueError, "delta not empty");
|