GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||
GeezerVison is showing github.com — bpo-34543: Fix SystemErrors and segfaults with uninitialized Structs by ZackerySpytz · Pull Request #14777 · python/cpython Conversation
|
|
This patch uses a |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
In order to test the changes, I attempted to recreate the segfault in the most current commit to cpython master and in your remote branch bpo-34543-struct-crashes.
For the version used for testing the latest cpython, I used the function test_segfault() on the second round in order to perform the test multiple times consecutively. The issue tracker reported similar problems with replication. The first round caused a TypeError, and the second one caused the segfault.
After performing test_segfault() 3 times consecutively in the PR's branch, ValueError was raised each time with the same message. As far as I can tell, this resolves the segfault issue and provides a significant improvement by raising a consistent exception each time.
Nicely done @ZackerySpytz, approved.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| for meth in s.iter_unpack, s.pack, s.unpack, s.unpack_from: | ||
| self.assertRaises(ValueError, meth, b'0') | ||
| self.assertRaises(ValueError, s.pack_into, bytearray(1), 0, b'0') | ||
| self.assertRaises(ValueError, s.__sizeof__) |
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Also, realized this after submitting the approval. This is quite minor, and I still approve of the PR either way. Instead of using s.__sizeof__, I would recommend using sys.getsizeof(s):
| self.assertRaises(ValueError, s.__sizeof__) | |
| self.assertRaises(ValueError, sys.getsizeof(s)) |
In general, it seems to be preferable to use functions instead of directly accessing the special object attributes when possible. If you had a specific reason for not using sys.getsizeof(), let me know. Here's the a link to the function defintion and the docs. I looked over it, but I'm not very experienced with the python c-api. I mostly rely on the docs when it comes to the modules implemented in c.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
Also, this should probably be backported to previous versions. The code sample I used was the same from 3.7 with no noticeable difference in behavior prior to this patch: https://bugs.python.org/msg324498. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Wouldn't it make more sense to ensure that the invalid objects can't be created in the first place, by doing the initialization in |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Superseded by #94532 |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
There was an error while loading. Please reload this page.