Commit 644c17d2 authored by Jeremy Hylton's avatar Jeremy Hylton

Several bug fixes.

 -- initialize length to DEFAULTALLOC and not 0
 -- resize string before returning (to remove '\000' padding)

Also converted some compression routines to use PyString instead of
buffer.
parent 4a944d7a
...@@ -355,8 +355,8 @@ PyZlib_objcompress(self, args) ...@@ -355,8 +355,8 @@ PyZlib_objcompress(self, args)
compobject *self; compobject *self;
PyObject *args; PyObject *args;
{ {
int length=0, err, inplen; int err = Z_OK, inplen;
Byte *buf=NULL; int length = DEFAULTALLOC;
PyObject *RetVal; PyObject *RetVal;
Byte *input; Byte *input;
...@@ -364,21 +364,28 @@ PyZlib_objcompress(self, args) ...@@ -364,21 +364,28 @@ PyZlib_objcompress(self, args)
return NULL; return NULL;
self->zst.avail_in=inplen; self->zst.avail_in=inplen;
self->zst.next_in=input; self->zst.next_in=input;
do if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
{ PyErr_SetString(PyExc_MemoryError,
buf=(Byte *)realloc(buf, length << 1); "Can't allocate memory to compress data");
if (buf==NULL) return NULL;
}
self->zst.next_out = PyString_AsString(RetVal);
self->zst.avail_out = length;
while (self->zst.avail_in != 0 && err == Z_OK)
{ {
err = deflate(&(self->zst), Z_NO_FLUSH);
if (self->zst.avail_out <= 0) {
if (_PyString_Resize(&RetVal, length << 1) == -1) {
PyErr_SetString(PyExc_MemoryError, PyErr_SetString(PyExc_MemoryError,
"Can't allocate memory to compress data"); "Can't allocate memory to compress data");
return NULL; return NULL;
} }
self->zst.next_out=buf+length; self->zst.next_out = PyString_AsString(RetVal) + length;
self->zst.avail_out=length; self->zst.avail_out = length;
length = length << 1; length = length << 1;
err=deflate(&(self->zst), Z_NO_FLUSH); }
} while (self->zst.avail_in!=0 && err==Z_OK); }
if (err!=Z_OK) if (err != Z_OK)
{ {
char temp[500]; char temp[500];
if (self->zst.msg==Z_NULL) self->zst.msg=""; if (self->zst.msg==Z_NULL) self->zst.msg="";
...@@ -387,8 +394,7 @@ PyZlib_objcompress(self, args) ...@@ -387,8 +394,7 @@ PyZlib_objcompress(self, args)
PyErr_SetString(ZlibError, temp); PyErr_SetString(ZlibError, temp);
return NULL; return NULL;
} }
RetVal=PyString_FromStringAndSize((char *)buf, self->zst.next_out-buf); _PyString_Resize(&RetVal, self->zst.total_out);
free(buf);
return RetVal; return RetVal;
} }
...@@ -456,29 +462,35 @@ PyZlib_flush(self, args) ...@@ -456,29 +462,35 @@ PyZlib_flush(self, args)
compobject *self; compobject *self;
PyObject *args; PyObject *args;
{ {
int length=0, err; int length=DEFAULTALLOC, err = Z_OK;
Byte *buf=NULL;
PyObject *RetVal; PyObject *RetVal;
if (!PyArg_NoArgs(args)) if (!PyArg_NoArgs(args))
return NULL; return NULL;
self->zst.avail_in=0; self->zst.avail_in = 0;
do self->zst.next_in = Z_NULL;
{ if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
buf=(Byte *)realloc(buf, length << 1); PyErr_SetString(PyExc_MemoryError,
if (buf==NULL) "Can't allocate memory to compress data");
return NULL;
}
self->zst.next_out = PyString_AsString(RetVal);
self->zst.avail_out = length;
while (err == Z_OK)
{ {
err = deflate(&(self->zst), Z_FINISH);
if (self->zst.avail_out <= 0) {
if (_PyString_Resize(&RetVal, length << 1) == -1) {
PyErr_SetString(PyExc_MemoryError, PyErr_SetString(PyExc_MemoryError,
"Can't allocate memory to compress data"); "Can't allocate memory to compress data");
return NULL; return NULL;
} }
self->zst.next_out=buf+length; self->zst.next_out = PyString_AsString(RetVal) + length;
self->zst.avail_out=length; self->zst.avail_out = length;
length = length << 1; length = length << 1;
err=deflate(&(self->zst), Z_FINISH); }
} while (err==Z_OK); }
if (err!=Z_STREAM_END) if (err!=Z_STREAM_END) {
{
char temp[500]; char temp[500];
if (self->zst.msg==Z_NULL) self->zst.msg=""; if (self->zst.msg==Z_NULL) self->zst.msg="";
sprintf(temp, "Error %i while compressing [%s]", sprintf(temp, "Error %i while compressing [%s]",
...@@ -486,11 +498,8 @@ PyZlib_flush(self, args) ...@@ -486,11 +498,8 @@ PyZlib_flush(self, args)
PyErr_SetString(ZlibError, temp); PyErr_SetString(ZlibError, temp);
return NULL; return NULL;
} }
RetVal=PyString_FromStringAndSize((char *)buf, self->zst.next_out-buf);
free(buf);
err=deflateEnd(&(self->zst)); err=deflateEnd(&(self->zst));
if (err!=Z_OK) if (err!=Z_OK) {
{
char temp[500]; char temp[500];
if (self->zst.msg==Z_NULL) self->zst.msg=""; if (self->zst.msg==Z_NULL) self->zst.msg="";
sprintf(temp, "Error %i while flushing compression object [%s]", sprintf(temp, "Error %i while flushing compression object [%s]",
...@@ -498,6 +507,8 @@ PyZlib_flush(self, args) ...@@ -498,6 +507,8 @@ PyZlib_flush(self, args)
PyErr_SetString(ZlibError, temp); PyErr_SetString(ZlibError, temp);
return NULL; return NULL;
} }
_PyString_Resize(&RetVal,
(char *)self->zst.next_out - PyString_AsString(RetVal));
return RetVal; return RetVal;
} }
...@@ -516,7 +527,12 @@ PyZlib_unflush(self, args) ...@@ -516,7 +527,12 @@ PyZlib_unflush(self, args)
if (!PyArg_NoArgs(args)) if (!PyArg_NoArgs(args))
return NULL; return NULL;
RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC); if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
{
PyErr_SetString(PyExc_MemoryError,
"Can't allocate memory to decompress data");
return NULL;
}
self->zst.avail_in=0; self->zst.avail_in=0;
self->zst.next_out = PyString_AsString(RetVal); self->zst.next_out = PyString_AsString(RetVal);
length = self->zst.avail_out = DEFAULTALLOC; length = self->zst.avail_out = DEFAULTALLOC;
...@@ -557,6 +573,8 @@ PyZlib_unflush(self, args) ...@@ -557,6 +573,8 @@ PyZlib_unflush(self, args)
PyErr_SetString(ZlibError, temp); PyErr_SetString(ZlibError, temp);
return NULL; return NULL;
} }
_PyString_Resize(&RetVal,
(char *)self->zst.next_out - PyString_AsString(RetVal));
return RetVal; return RetVal;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment