Skip to content

ffi: fix PyStatus._type#1791

Merged
davidhewitt merged 2 commits intoPyO3:mainfrom
indygreg:fix-pystatus
Aug 14, 2021
Merged

ffi: fix PyStatus._type#1791
davidhewitt merged 2 commits intoPyO3:mainfrom
indygreg:fix-pystatus

Conversation

@indygreg
Copy link
Contributor

The field wasn't defined previously. And the enum wasn't defined as
[repr(C)].

This missing field could result in memory corruption if a Rust-allocated
PyStatus was passed to a Python API, which could perform an
out-of-bounds write. In my code, the out-of-bounds write corrupted a
variable on the stack, leading to a segfault due to illegal memory
access. However, this crash only occurred on Rust 1.54! So I initially
mis-attribted it as a compiler bug / regression. It appears that a
low-level Rust change in 1.54.0 changed the LLVM IR in such a way to
cause LLVM optimization passes to produce sufficiently different
assembly code, tickling the crash. See
rust-lang/rust#87947 if you want to see
the wild goose chase I went on in Rust / LLVM land to potentially
pin this on a compiler bug.

Lessen learned: Rust crashes are almost certainly due to use of
unsafe.

The field wasn't defined previously. And the enum wasn't defined as
`[repr(C)]`.

This missing field could result in memory corruption if a Rust-allocated
`PyStatus` was passed to a Python API, which could perform an
out-of-bounds write. In my code, the out-of-bounds write corrupted a
variable on the stack, leading to a segfault due to illegal memory
access. However, this crash only occurred on Rust 1.54! So I initially
mis-attribted it as a compiler bug / regression. It appears that a
low-level Rust change in 1.54.0 changed the LLVM IR in such a way to
cause LLVM optimization passes to produce sufficiently different
assembly code, tickling the crash. See
rust-lang/rust#87947 if you want to see
the wild goose chase I went on in Rust / LLVM land to potentially
pin this on a compiler bug.

Lessen learned: Rust crashes are almost certainly due to use of
`unsafe`.
Copy link
Member

@davidhewitt davidhewitt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yikes, sorry about that.

We've started merging breaking changes for 0.15, so I wasn't planning to do a release any time soon. However this looks pretty bad, so I might merge this and a few of your other FFI fixes into a 0.14.3.

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.

2 participants