Skip to content

[3.7] closes bpo-39510: Fix use-after-free in BufferedReader.readinto() (GH-18295)#18349

Merged
miss-islington merged 1 commit into
python:3.7from
miss-islington:backport-cb1c074-3.7
Feb 4, 2020
Merged

[3.7] closes bpo-39510: Fix use-after-free in BufferedReader.readinto() (GH-18295)#18349
miss-islington merged 1 commit into
python:3.7from
miss-islington:backport-cb1c074-3.7

Conversation

@miss-islington

@miss-islington miss-islington commented Feb 4, 2020

Copy link
Copy Markdown
Contributor

When called on a closed object, readinto() segfaults on account
of a write to a freed buffer:

==220553== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==220553==  Access not within mapped region at address 0x2A
==220553==    at 0x48408A0: memmove (vg_replace_strmem.c:1272)
==220553==    by 0x58DB0C: _buffered_readinto_generic (bufferedio.c:972)
==220553==    by 0x58DCBA: _io__Buffered_readinto_impl (bufferedio.c:1053)
==220553==    by 0x58DCBA: _io__Buffered_readinto (bufferedio.c.h:253)

Reproducer:

reader = open ("/dev/zero", "rb")
_void  = reader.read (42)
reader.close ()
reader.readinto (bytearray (42)) GH-GH-GH- BANG!

The problem exists since 2012 when commit dc46945 added code
to free the read buffer on close().

Signed-off-by: Philipp Gesang philipp.gesang@intra2net.com
(cherry picked from commit cb1c074)

Co-authored-by: Philipp Gesang phg@phi-gamma.net

https://bugs.python.org/issue39510

…thonGH-18295)

When called on a closed object, readinto() segfaults on account
of a write to a freed buffer:

    ==220553== Process terminating with default action of signal 11 (SIGSEGV): dumping core
    ==220553==  Access not within mapped region at address 0x2A
    ==220553==    at 0x48408A0: memmove (vg_replace_strmem.c:1272)
    ==220553==    by 0x58DB0C: _buffered_readinto_generic (bufferedio.c:972)
    ==220553==    by 0x58DCBA: _io__Buffered_readinto_impl (bufferedio.c:1053)
    ==220553==    by 0x58DCBA: _io__Buffered_readinto (bufferedio.c.h:253)

Reproducer:

    reader = open ("/dev/zero", "rb")
    _void  = reader.read (42)
    reader.close ()
    reader.readinto (bytearray (42)) GH-GH-GH- BANG!

The problem exists since 2012 when commit dc46945 added code
to free the read buffer on close().

Signed-off-by: Philipp Gesang <philipp.gesang@intra2net.com>
(cherry picked from commit cb1c074)

Co-authored-by: Philipp Gesang <phg@phi-gamma.net>
@miss-islington

Copy link
Copy Markdown
Contributor Author

@phi-gamma and @benjaminp: Status check is done, and it's a success ✅ .

@miss-islington miss-islington merged commit 97d2a98 into python:3.7 Feb 4, 2020
@miss-islington miss-islington deleted the backport-cb1c074-3.7 branch February 4, 2020 21:43
@miss-islington

Copy link
Copy Markdown
Contributor Author

@phi-gamma and @benjaminp: Status check is done, and it's a success ✅ .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants