Commits

Barry Warsaw committed 5a22465

In order to fix SF bug # 824977, we replace calloc()/free() calls in
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.

  • Participants
  • Parent commits 66ede03
  • Branches 2.3

Comments (0)

Files changed (1)

Modules/binascii.c

 	      &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) {
 		}
 	}
 	if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
-		free (odata);
+		PyMem_Free(odata);
 		return NULL;
 	}
-	free (odata);
+	PyMem_Free(odata);
 	return rv;
 }
 
 		}
 	}
 
-	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) {
 		}
 	}
 	if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
-		free (odata);
+		PyMem_Free(odata);
 		return NULL;
 	}
-	free (odata);
+	PyMem_Free(odata);
 	return rv;
 }