New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
secrets.randbelow(-1) hangs #73247
Comments
secrets.randbelow(-1) causes the interpreter to hang. It should presumably raise an exception like secrets.randbelow(0) does. This is on Mac OS X 10.11.6, shell transcript below. ========================================================= $ python3
Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import secrets
>>> secrets.randbelow(1)
0
>>> secrets.randbelow(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/secrets.py", line 29, in randbelow
return _sysrand._randbelow(exclusive_upper_bound)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/random.py", line 232, in _randbelow
r = getrandbits(k) # 0 <= r < 2**k
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/random.py", line 678, in getrandbits
raise ValueError('number of bits must be greater than zero')
ValueError: number of bits must be greater than zero
>>> secrets.randbelow(-1) (hangs using 100% CPU until aborted) |
Reproducible on Linux as well, I think I know where the issue is and will try to submit a patch soon. |
Ok, here it is. My first code patch in Python. Basically the existing code was depending on bit_length to DTRT and raise a ValueError, but negative numbers have a positive bit length. Then when it hits: 234 while r >= n: It just spins on that as r is always going to be greater than a negative number. I tried not to be too clever so just put a guard early in the function. This has the added advantage of giving us a clearer error message. |
Brendan, would you please submit a contributor agreement. |
Hi Raymond, I have done that when creating the patch and have confirmation in my inbox
On Tue, 27 Dec 2016 at 14:43 Raymond Hettinger <report@bugs.python.org>
|
Ok, here's a second version of the patch. Normally I don't like testing multiple things in one test but I've gone with what seems to be the convention here in test_secrets.py |
SystemRandom._randbelow has this problem, perhaps it should be fixed there, not in one of many possible wrappers for it? |
If I'm not mistaken, _randbelow is defined in Random, which SystemRandom On Tue, 27 Dec 2016 at 22:08 Josh Rosenberg <report@bugs.python.org> wrote:
|
_randbelow is a private api and it is not broken, it is just being misused by the secrets module. All of the other calls to it are already range checked and it would be inefficient and unnecessary to repeat this the check. Brendan, thank you for the updated patch. It looks correct. I will apply shortly. Please do follow-up with Ewa so we can get the asterisk to appear by your name :-) |
New changeset 0509844f38df by Raymond Hettinger in branch '3.6': |
Thanks for the bug report and for the patch. |
"Misused" seems a bit strong. Should I understand that you dislike the https://www.python.org/dev/peps/pep-0506/#id81 Thanks for the patch Brendan, and thanks Raymond for applying it. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: