bpo-34395: Fix memory leaks caused by incautious usage of PyMem_Resize().#8756
Conversation
serhiy-storchaka
left a comment
There was a problem hiding this comment.
LGTM, I left just few minor comments.
Modules/_csv.c
Outdated
| PyMem_Free(old_rec); | ||
| } | ||
| if (self->rec == NULL) { | ||
| size_t rec_size_new = (size_t)rec_len + MEM_INCR; |
There was a problem hiding this comment.
Why not (rec_len / MEM_INCR + 1) * MEM_INCR?
There was a problem hiding this comment.
I forgot about integer division :-). I'll revert it.
Modules/_pickle.c
Outdated
| PyMem_RESIZE(self->memo, PyObject *, new_size); | ||
| if (self->memo == NULL) { | ||
| PyObject **memo_new = self->memo; | ||
| PyMem_Resize(memo_new, PyObject *, new_size); |
There was a problem hiding this comment.
AFAIK currently there is no difference between PyMem_RESIZE and PyMem_Resize. But since this PR will be backported to old versions, I suggest to use PyMem_RESIZE.
Modules/_pickle.c
Outdated
| else | ||
| PyMem_RESIZE(self->marks, Py_ssize_t, alloc); | ||
| Py_ssize_t *marks_old = self->marks; | ||
| PyMem_Resize(self->marks, Py_ssize_t, alloc); |
|
Thanks @sir-sigurd for the PR, and @serhiy-storchaka for merging it 🌮🎉.. I'm working now to backport this PR to: 2.7, 3.6, 3.7. |
|
GH-8779 is a backport of this pull request to the 3.7 branch. |
|
GH-8780 is a backport of this pull request to the 3.6 branch. |
|
Sorry, @sir-sigurd and @serhiy-storchaka, I could not cleanly backport this to |
…e(). (pythonGH-8756) (cherry picked from commit 67b9cc8) Co-authored-by: Sergey Fedoseev <[email protected]>
…e(). (pythonGH-8756) (cherry picked from commit 67b9cc8) Co-authored-by: Sergey Fedoseev <[email protected]>
…e(). (GH-8756) (cherry picked from commit 67b9cc8) Co-authored-by: Sergey Fedoseev <[email protected]>
…e(). (GH-8756) (cherry picked from commit 67b9cc8) Co-authored-by: Sergey Fedoseev <[email protected]>
|
Thank you for your PR @sir-sigurd. Nice catch. Do you mind to make a backport to 2.7? It needs careful rewriting since |
|
GH-8785 is a backport of this pull request to the 2.7 branch. |
| Py_ssize_t *marks_old = self->marks; | ||
| PyMem_RESIZE(self->marks, Py_ssize_t, alloc); | ||
| if (self->marks == NULL) { | ||
| PyMem_FREE(marks_old); |
There was a problem hiding this comment.
@serhiy-storchaka
Might make sense to not change self->marks at all instead of PyMem_FREE() when PyMem_RESIZE() fails?
It was implemented this way in 2.7:
Lines 4661 to 4669 in 00aebab
There was a problem hiding this comment.
Agree, it makes sense.
* master: (107 commits) bpo-22057: Clarify eval() documentation (pythonGH-8812) bpo-34318: Convert deprecation warnings to errors in assertRaises() etc. (pythonGH-8623) bpo-22602: Raise an exception in the UTF-7 decoder for ill-formed sequences starting with "+". (pythonGH-8741) bpo-34415: Updated logging.Formatter docstring. (pythonGH-8811) bpo-34432: doc Mention complex and decimal.Decimal on str.format not about locales (pythonGH-8808) bpo-34381: refer to 'Running & Writing Tests' in README.rst (pythonGH-8797) Improve error message when mock.assert_has_calls fails (pythonGH-8205) Warn not to set SIGPIPE to SIG_DFL (python#6773) bpo-34419: selectmodule.c does not compile on HP-UX due to bpo-31938 (pythonGH-8796) bpo-34418: Fix HTTPErrorProcessor documentation (pythonGH-8793) bpo-34391: Fix ftplib test for TLS 1.3 (pythonGH-8787) bpo-34217: Use lowercase for windows headers (pythonGH-8472) bpo-34395: Fix memory leaks caused by incautious usage of PyMem_Resize(). (pythonGH-8756) bpo-34405: Updated to OpenSSL 1.1.0i for Windows builds. (pythonGH-8775) bpo-34384: Fix os.readlink() on Windows (pythonGH-8740) closes bpo-34400: Fix undefined behavior in parsetok(). (pythonGH-4439) bpo-34399: 2048 bits RSA keys and DH params (python#8762) Make regular expressions in test_tasks.py raw strings. (pythonGH-8759) smtplib documentation fixes (pythonGH-8708) Fix misindented yaml in logging how to example (pythonGH-8604) ...
https://bugs.python.org/issue34395