Skip to content

Commit

Permalink
In order to fix SF bug # 824977, we replace calloc()/free() calls in
Browse files Browse the repository at this point in the history
binascii_a2b_qp() and binascii_b2a_qp() with calls to PyMem_Malloc() and
PyMem_Free().  These won't return NULL unless the allocations actually fail,
so it won't trigger a bogus memory error on some platforms <cough>AIX</cough>
when passed a length of zero.
  • Loading branch information
warsaw committed May 11, 2004
1 parent fd0283e commit 23164a5
Showing 1 changed file with 16 additions and 9 deletions.
25 changes: 16 additions & 9 deletions Modules/binascii.c
Original file line number Diff line number Diff line change
Expand Up @@ -1036,13 +1036,16 @@ binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
&datalen, &header))
return NULL;

/* We allocate the output same size as input, this is overkill */
odata = (unsigned char *) calloc(1, datalen);

/* We allocate the output same size as input, this is overkill.
* The previous implementation used calloc() so we'll zero out the
* memory here too, since PyMem_Malloc() does not guarantee that.
*/
odata = (unsigned char *) PyMem_Malloc(datalen);
if (odata == NULL) {
PyErr_NoMemory();
return NULL;
}
memset(odata, datalen, 0);

in = out = 0;
while (in < datalen) {
Expand Down Expand Up @@ -1090,10 +1093,10 @@ binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
}
}
if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
free (odata);
PyMem_Free(odata);
return NULL;
}
free (odata);
PyMem_Free(odata);
return rv;
}

Expand Down Expand Up @@ -1207,12 +1210,16 @@ binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
}
}

odata = (unsigned char *) calloc(1, odatalen);

/* We allocate the output same size as input, this is overkill.
* The previous implementation used calloc() so we'll zero out the
* memory here too, since PyMem_Malloc() does not guarantee that.
*/
odata = (unsigned char *) PyMem_Malloc(odatalen);
if (odata == NULL) {
PyErr_NoMemory();
return NULL;
}
memset(odata, odatalen, 0);

in = out = linelen = 0;
while (in < datalen) {
Expand Down Expand Up @@ -1281,10 +1288,10 @@ binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
}
}
if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
free (odata);
PyMem_Free(odata);
return NULL;
}
free (odata);
PyMem_Free(odata);
return rv;
}

Expand Down

0 comments on commit 23164a5

Please sign in to comment.