424 lines
12 KiB
Diff
424 lines
12 KiB
Diff
|
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
|
||
|
index 2097342..defcde1 100644
|
||
|
--- a/Modules/_ctypes/callproc.c
|
||
|
+++ b/Modules/_ctypes/callproc.c
|
||
|
@@ -1831,6 +1831,7 @@ POINTER(PyObject *self, PyObject *cls)
|
||
|
"s(O){}",
|
||
|
buf,
|
||
|
&PyCPointer_Type);
|
||
|
+ PyMem_Free(buf);
|
||
|
if (result == NULL)
|
||
|
return result;
|
||
|
key = PyLong_FromVoidPtr(result);
|
||
|
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
|
||
|
index 46f041b..1b495fc 100644
|
||
|
--- a/Modules/_ctypes/cfield.c
|
||
|
+++ b/Modules/_ctypes/cfield.c
|
||
|
@@ -1291,24 +1291,16 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length)
|
||
|
static PyObject *
|
||
|
s_get(void *ptr, Py_ssize_t size)
|
||
|
{
|
||
|
- PyObject *result;
|
||
|
- size_t slen;
|
||
|
+ Py_ssize_t i;
|
||
|
+ char *p;
|
||
|
|
||
|
- result = PyString_FromString((char *)ptr);
|
||
|
- if (!result)
|
||
|
- return NULL;
|
||
|
- /* chop off at the first NUL character, if any.
|
||
|
- * On error, result will be deallocated and set to NULL.
|
||
|
- */
|
||
|
- slen = strlen(PyString_AS_STRING(result));
|
||
|
- size = min(size, (Py_ssize_t)slen);
|
||
|
- if (result->ob_refcnt == 1) {
|
||
|
- /* shorten the result */
|
||
|
- _PyString_Resize(&result, size);
|
||
|
- return result;
|
||
|
- } else
|
||
|
- /* cannot shorten the result */
|
||
|
- return PyString_FromStringAndSize(ptr, size);
|
||
|
+ p = (char *)ptr;
|
||
|
+ for (i = 0; i < size; ++i) {
|
||
|
+ if (*p++ == '\0')
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ return PyBytes_FromStringAndSize((char *)ptr, (Py_ssize_t)i);
|
||
|
}
|
||
|
|
||
|
static PyObject *
|
||
|
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
|
||
|
index de69f6f..78445eb 100644
|
||
|
--- a/Modules/_hashopenssl.c
|
||
|
+++ b/Modules/_hashopenssl.c
|
||
|
@@ -133,12 +133,6 @@ newEVPobject(PyObject *name)
|
||
|
if (retval == NULL)
|
||
|
return NULL;
|
||
|
|
||
|
- retval->ctx = EVP_MD_CTX_new();
|
||
|
- if (retval->ctx == NULL) {
|
||
|
- PyErr_NoMemory();
|
||
|
- return NULL;
|
||
|
- }
|
||
|
-
|
||
|
/* save the name for .name to return */
|
||
|
Py_INCREF(name);
|
||
|
retval->name = name;
|
||
|
@@ -146,6 +140,13 @@ newEVPobject(PyObject *name)
|
||
|
retval->lock = NULL;
|
||
|
#endif
|
||
|
|
||
|
+ retval->ctx = EVP_MD_CTX_new();
|
||
|
+ if (retval->ctx == NULL) {
|
||
|
+ Py_DECREF(retval);
|
||
|
+ PyErr_NoMemory();
|
||
|
+ return NULL;
|
||
|
+ }
|
||
|
+
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
@@ -205,6 +206,7 @@ EVP_copy(EVPobject *self, PyObject *unused)
|
||
|
return NULL;
|
||
|
|
||
|
if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) {
|
||
|
+ Py_DECREF(newobj);
|
||
|
return _setException(PyExc_ValueError);
|
||
|
}
|
||
|
return (PyObject *)newobj;
|
||
|
diff --git a/Modules/_hotshot.c b/Modules/_hotshot.c
|
||
|
index 33cd38d..4fc5cee 100644
|
||
|
--- a/Modules/_hotshot.c
|
||
|
+++ b/Modules/_hotshot.c
|
||
|
@@ -482,8 +482,11 @@ restart:
|
||
|
}
|
||
|
else if (!err) {
|
||
|
result = PyTuple_New(4);
|
||
|
- if (result == NULL)
|
||
|
+ if (result == NULL) {
|
||
|
+ Py_XDECREF(s1);
|
||
|
+ Py_XDECREF(s2);
|
||
|
return NULL;
|
||
|
+ }
|
||
|
PyTuple_SET_ITEM(result, 0, PyInt_FromLong(what));
|
||
|
PyTuple_SET_ITEM(result, 2, PyInt_FromLong(fileno));
|
||
|
if (s1 == NULL)
|
||
|
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
|
||
|
index b8c98a4..d68f7d8 100644
|
||
|
--- a/Modules/_io/bufferedio.c
|
||
|
+++ b/Modules/_io/bufferedio.c
|
||
|
@@ -1363,6 +1363,7 @@ _bufferedreader_read_all(buffered *self)
|
||
|
res = buffered_flush_and_rewind_unlocked(self);
|
||
|
if (res == NULL) {
|
||
|
Py_DECREF(chunks);
|
||
|
+ Py_XDECREF(data);
|
||
|
return NULL;
|
||
|
}
|
||
|
Py_CLEAR(res);
|
||
|
diff --git a/Modules/_json.c b/Modules/_json.c
|
||
|
index 3a88882..050d37d 100644
|
||
|
--- a/Modules/_json.c
|
||
|
+++ b/Modules/_json.c
|
||
|
@@ -1375,8 +1375,10 @@ _match_number_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssiz
|
||
|
else {
|
||
|
double d = PyOS_string_to_double(PyString_AS_STRING(numstr),
|
||
|
NULL, NULL);
|
||
|
- if (d == -1.0 && PyErr_Occurred())
|
||
|
+ if (d == -1.0 && PyErr_Occurred()) {
|
||
|
+ Py_DECREF(numstr);
|
||
|
return NULL;
|
||
|
+ }
|
||
|
rval = PyFloat_FromDouble(d);
|
||
|
}
|
||
|
}
|
||
|
diff --git a/Modules/linuxaudiodev.c b/Modules/linuxaudiodev.c
|
||
|
index 7fe20ae..f5135d9 100644
|
||
|
--- a/Modules/linuxaudiodev.c
|
||
|
+++ b/Modules/linuxaudiodev.c
|
||
|
@@ -126,10 +126,12 @@ newladobject(PyObject *arg)
|
||
|
}
|
||
|
if (imode == O_WRONLY && ioctl(fd, SNDCTL_DSP_NONBLOCK, NULL) == -1) {
|
||
|
PyErr_SetFromErrnoWithFilename(LinuxAudioError, basedev);
|
||
|
+ close(fd);
|
||
|
return NULL;
|
||
|
}
|
||
|
if (ioctl(fd, SNDCTL_DSP_GETFMTS, &afmts) == -1) {
|
||
|
PyErr_SetFromErrnoWithFilename(LinuxAudioError, basedev);
|
||
|
+ close(fd);
|
||
|
return NULL;
|
||
|
}
|
||
|
/* Create and initialize the object */
|
||
|
diff --git a/Parser/myreadline.c b/Parser/myreadline.c
|
||
|
index 59db41a..5376214 100644
|
||
|
--- a/Parser/myreadline.c
|
||
|
+++ b/Parser/myreadline.c
|
||
|
@@ -108,7 +108,7 @@ char *
|
||
|
PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
|
||
|
{
|
||
|
size_t n;
|
||
|
- char *p;
|
||
|
+ char *p, *pr;
|
||
|
n = 100;
|
||
|
if ((p = (char *)PyMem_MALLOC(n)) == NULL)
|
||
|
return NULL;
|
||
|
@@ -140,17 +140,29 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, char *prompt)
|
||
|
n = strlen(p);
|
||
|
while (n > 0 && p[n-1] != '\n') {
|
||
|
size_t incr = n+2;
|
||
|
- p = (char *)PyMem_REALLOC(p, n + incr);
|
||
|
- if (p == NULL)
|
||
|
- return NULL;
|
||
|
if (incr > INT_MAX) {
|
||
|
+ PyMem_FREE(p);
|
||
|
PyErr_SetString(PyExc_OverflowError, "input line too long");
|
||
|
+ return NULL;
|
||
|
+ }
|
||
|
+ pr = (char *)PyMem_REALLOC(p, n + incr);
|
||
|
+ if (pr == NULL) {
|
||
|
+ PyMem_FREE(p);
|
||
|
+ PyErr_NoMemory();
|
||
|
+ return NULL;
|
||
|
}
|
||
|
+ p = pr;
|
||
|
if (my_fgets(p+n, (int)incr, sys_stdin) != 0)
|
||
|
break;
|
||
|
n += strlen(p+n);
|
||
|
}
|
||
|
- return (char *)PyMem_REALLOC(p, n+1);
|
||
|
+ pr = (char *)PyMem_REALLOC(p, n+1);
|
||
|
+ if (pr == NULL) {
|
||
|
+ PyMem_FREE(p);
|
||
|
+ PyErr_NoMemory();
|
||
|
+ return NULL;
|
||
|
+ }
|
||
|
+ return pr;
|
||
|
}
|
||
|
|
||
|
|
||
|
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
|
||
|
index c6e61df..8966661 100644
|
||
|
--- a/Parser/tokenizer.c
|
||
|
+++ b/Parser/tokenizer.c
|
||
|
@@ -656,9 +656,14 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) {
|
||
|
}
|
||
|
*current = '\0';
|
||
|
final_length = current - buf + 1;
|
||
|
- if (final_length < needed_length && final_length)
|
||
|
+ if (final_length < needed_length && final_length) {
|
||
|
/* should never fail */
|
||
|
- buf = PyMem_REALLOC(buf, final_length);
|
||
|
+ char* result = PyMem_REALLOC(buf, final_length);
|
||
|
+ if (result == NULL) {
|
||
|
+ PyMem_FREE(buf);
|
||
|
+ }
|
||
|
+ buf = result;
|
||
|
+ }
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
diff --git a/Python/dtoa.c b/Python/dtoa.c
|
||
|
index 73e23af..25eb9a7 100644
|
||
|
--- a/Python/dtoa.c
|
||
|
+++ b/Python/dtoa.c
|
||
|
@@ -1514,8 +1514,9 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
ULong y, z, abs_exp;
|
||
|
Long L;
|
||
|
BCinfo bc;
|
||
|
- Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
|
||
|
+ Bigint *bb = NULL, *bd = NULL, *bd0 = NULL, *bs = NULL, *delta = NULL;
|
||
|
size_t ndigits, fraclen;
|
||
|
+ double result;
|
||
|
|
||
|
dval(&rv) = 0.;
|
||
|
|
||
|
@@ -1707,7 +1708,6 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
if (k > 9) {
|
||
|
dval(&rv) = tens[k - 9] * dval(&rv) + z;
|
||
|
}
|
||
|
- bd0 = 0;
|
||
|
if (nd <= DBL_DIG
|
||
|
&& Flt_Rounds == 1
|
||
|
) {
|
||
|
@@ -1877,14 +1877,11 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
|
||
|
bd = Balloc(bd0->k);
|
||
|
if (bd == NULL) {
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
Bcopy(bd, bd0);
|
||
|
bb = sd2b(&rv, bc.scale, &bbe); /* srv = bb * 2^bbe */
|
||
|
if (bb == NULL) {
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
/* Record whether lsb of bb is odd, in case we need this
|
||
|
@@ -1894,9 +1891,6 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
/* tdv = bd * 10**e; srv = bb * 2**bbe */
|
||
|
bs = i2b(1);
|
||
|
if (bs == NULL) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
|
||
|
@@ -1945,56 +1939,39 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
|
||
|
/* Scale bb, bd, bs by the appropriate powers of 2 and 5. */
|
||
|
if (bb5 > 0) {
|
||
|
+ Bigint *bb1;
|
||
|
bs = pow5mult(bs, bb5);
|
||
|
if (bs == NULL) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
bb1 = mult(bs, bb);
|
||
|
Bfree(bb);
|
||
|
bb = bb1;
|
||
|
if (bb == NULL) {
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
}
|
||
|
if (bb2 > 0) {
|
||
|
bb = lshift(bb, bb2);
|
||
|
if (bb == NULL) {
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
}
|
||
|
if (bd5 > 0) {
|
||
|
bd = pow5mult(bd, bd5);
|
||
|
if (bd == NULL) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
}
|
||
|
if (bd2 > 0) {
|
||
|
bd = lshift(bd, bd2);
|
||
|
if (bd == NULL) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
}
|
||
|
if (bs2 > 0) {
|
||
|
bs = lshift(bs, bs2);
|
||
|
if (bs == NULL) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
}
|
||
|
@@ -2005,10 +1982,6 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
|
||
|
delta = diff(bb, bd);
|
||
|
if (delta == NULL) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
dsign = delta->sign;
|
||
|
@@ -2062,10 +2035,6 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
}
|
||
|
delta = lshift(delta,Log2P);
|
||
|
if (delta == NULL) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bd0);
|
||
|
goto failed_malloc;
|
||
|
}
|
||
|
if (cmp(delta, bs) > 0)
|
||
|
@@ -2167,11 +2136,6 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
if ((word0(&rv) & Exp_mask) >=
|
||
|
Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
|
||
|
if (word0(&rv0) == Big0 && word1(&rv0) == Big1) {
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd0);
|
||
|
- Bfree(delta);
|
||
|
goto ovfl;
|
||
|
}
|
||
|
word0(&rv) = Big0;
|
||
|
@@ -2213,16 +2177,11 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
}
|
||
|
}
|
||
|
cont:
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bs);
|
||
|
- Bfree(delta);
|
||
|
+ Bfree(bb); bb = NULL;
|
||
|
+ Bfree(bd); bd = NULL;
|
||
|
+ Bfree(bs); bs = NULL;
|
||
|
+ Bfree(delta); delta = NULL;
|
||
|
}
|
||
|
- Bfree(bb);
|
||
|
- Bfree(bd);
|
||
|
- Bfree(bs);
|
||
|
- Bfree(bd0);
|
||
|
- Bfree(delta);
|
||
|
if (bc.nd > nd) {
|
||
|
error = bigcomp(&rv, s0, &bc);
|
||
|
if (error)
|
||
|
@@ -2236,24 +2195,37 @@ _Py_dg_strtod(const char *s00, char **se)
|
||
|
}
|
||
|
|
||
|
ret:
|
||
|
- return sign ? -dval(&rv) : dval(&rv);
|
||
|
+ result = sign ? -dval(&rv) : dval(&rv);
|
||
|
+ goto done;
|
||
|
|
||
|
parse_error:
|
||
|
- return 0.0;
|
||
|
+ result = 0.0;
|
||
|
+ goto done;
|
||
|
|
||
|
failed_malloc:
|
||
|
errno = ENOMEM;
|
||
|
- return -1.0;
|
||
|
+ result = -1.0;
|
||
|
+ goto done;
|
||
|
|
||
|
undfl:
|
||
|
- return sign ? -0.0 : 0.0;
|
||
|
+ result = sign ? -0.0 : 0.0;
|
||
|
+ goto done;
|
||
|
|
||
|
ovfl:
|
||
|
errno = ERANGE;
|
||
|
/* Can't trust HUGE_VAL */
|
||
|
word0(&rv) = Exp_mask;
|
||
|
word1(&rv) = 0;
|
||
|
- return sign ? -dval(&rv) : dval(&rv);
|
||
|
+ result = sign ? -dval(&rv) : dval(&rv);
|
||
|
+ goto done;
|
||
|
+
|
||
|
+ done:
|
||
|
+ Bfree(bb);
|
||
|
+ Bfree(bd);
|
||
|
+ Bfree(bs);
|
||
|
+ Bfree(bd0);
|
||
|
+ Bfree(delta);
|
||
|
+ return result;
|
||
|
|
||
|
}
|
||
|
|