Skip to content
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

bpo-39068 guard _b85chars2 initialization #17627

Open
wants to merge 2 commits into
base: master
from

Conversation

@drmonkeysee
Copy link

drmonkeysee commented Dec 16, 2019

Under multi-threading scenarios a race condition may occur where a thread sees an initialized _b85chars table but an uninitialized _b85chars2 table due to the guard only checking the first table.

This causes an exception like:

  File "/usr/lib/python3.6/base64.py", line 434, in b85encode
    return _85encode(b, _b85chars, _b85chars2, pad),
  File "/usr/lib/python3.6/base64.py", line 294, in _85encode
    for word in words],
  File "/usr/lib/python3.6/base64.py", line 294, in <listcomp>
    for word in words],
 "TypeError: 'NoneType' object is not subscriptable

https://bugs.python.org/issue39068

@the-knights-who-say-ni

This comment has been minimized.

Copy link

the-knights-who-say-ni commented Dec 16, 2019

Hello, and thanks for your contribution!

I'm a bot set up to make sure that the project can legally accept this contribution by verifying everyone involved has signed the PSF contributor agreement (CLA).

Recognized GitHub username

We couldn't find a bugs.python.org (b.p.o) account corresponding to the following GitHub usernames:

@drmonkeysee

This might be simply due to a missing "GitHub Name" entry in one's b.p.o account settings. This is necessary for legal reasons before we can look at this contribution. Please follow the steps outlined in the CPython devguide to rectify this issue.

You can check yourself to see if the CLA has been received.

Thanks again for the contribution, we look forward to reviewing it!

@drmonkeysee drmonkeysee changed the title guard _b85chars2 table bpo-39068 guard _b85chars2 table Dec 16, 2019
@drmonkeysee drmonkeysee changed the title bpo-39068 guard _b85chars2 table bpo-39068 guard _b85chars2 initialization Dec 16, 2019
@IEarle
IEarle approved these changes Dec 16, 2019
@@ -430,6 +430,7 @@ def b85encode(b, pad=False):
# if the function is never called
if _b85chars is None:

This comment has been minimized.

Copy link
@serhiy-storchaka

serhiy-storchaka Dec 16, 2019

Member

It is enough to check if _b85chars2 is None here.

These checks are cheap, but they are performed at every b85encode() call. Lesser checks is better.

a85encode() should be updated too. And may be other functions if they initialize two or more globals.

This comment has been minimized.

Copy link
@drmonkeysee

drmonkeysee Dec 16, 2019

Author

done. visually scanned the file for other cases but only found the additional one in a85encode().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
7 participants
You can’t perform that action at this time.