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

gh-64490: Fix bugs in argument clinic varargs processing #32092

Merged
merged 28 commits into from Nov 24, 2022

Conversation

colorfulappl
Copy link
Contributor

@colorfulappl colorfulappl commented Mar 24, 2022

Fix 3 bugs introduced in #18609.

Bug reason lists in each commit's commit message.

https://bugs.python.org/issue20291

Python allows at most *one* vararg in one function.
Remove the improper varargs check which allows function definition like
```
    *vararg1: object
    *vararg2: object
```
in argument clinic.
Variable `vararg` indicates the index of vararg in parameter list.
While copying kwargs to `buf`, the index `i` should not add `vararg`, which leads to an out-of-bound bug.

When there are positional args, vararg and keyword args in a function definition, in which case `vararg` > 1, this bug can be triggered.

e.g.
```
    pos: object
    *args: object
    kw: object
```
The calculation of noptargs is incorrect when there is a vararg.
This bug prevents parsed arguments passing to XXXX_impl function.

e.g.
Define function
```
    *args: object
    kw: object
```
and pass kw=1 to the function, the `kw` parameter won't receive the pass in value.
Tools/clinic/clinic.py Outdated Show resolved Hide resolved
@erlend-aasland
Copy link
Contributor

erlend-aasland commented Jul 20, 2022

Could you also add a NEWS entry?

@erlend-aasland erlend-aasland self-assigned this Jul 20, 2022
@bedevere-bot
Copy link

bedevere-bot commented Aug 11, 2022

Most changes to Python require a NEWS entry.

Please add it using the blurb_it web app or the blurb command-line tool.

@erlend-aasland
Copy link
Contributor

erlend-aasland commented Aug 11, 2022

Thanks; still missing the NEWS entry, though.

@colorfulappl
Copy link
Contributor Author

colorfulappl commented Aug 11, 2022

NEWS added :)

@erlend-aasland erlend-aasland changed the title bpo-20291: Fix bugs in argument clinic varargs processing gh-64490: Fix bugs in argument clinic varargs processing Aug 11, 2022
@erlend-aasland
Copy link
Contributor

erlend-aasland commented Aug 11, 2022

NEWS added :)

Thanks; that's some entry! :) Could you narrow it down to a couple of concise sentences that describe the actual changes only?

@erlend-aasland
Copy link
Contributor

erlend-aasland commented Aug 11, 2022

Also, could you please add tests for each case?

@colorfulappl
Copy link
Contributor Author

colorfulappl commented Aug 12, 2022

Also, could you please add tests for each case?

Do you mean put the test cases into test_linic.py?

To see if the OOB bug is fixed in commit 6203962 , I should write some code snippet calling function _PyArg_UnpackKeywordsWithVararg, compile it and ensure that it does not crash.

I'm not sure how can I do this without touching the Python vm or library,
though I have wrote a proof-of-concept by adding a built-in function and test it manually:
https://github.com/colorfulappl/cpython/tree/unpack_keywords_oob_bug_poc .

As for commit 6793f38, I'm looking at test_linic.py and will have a try later.

Copy link
Sponsor Member

@isidentical isidentical left a comment

Thanks for the ping @erlend-aasland, and thanks for the PR @colorfulappl. I've gone through the changes, and they all look good to me. Quick question below:

Python/getargs.c Outdated Show resolved Hide resolved
@smontanaro
Copy link
Contributor

smontanaro commented Nov 22, 2022

(I'm working my way through some PRs which have been approved and are labeled "awaiting merge", hence my seemingly bolt from the blue comment. Why? Read here.)

I looked through the comments. Is it still waiting for further changes?

@erlend-aasland
Copy link
Contributor

erlend-aasland commented Nov 22, 2022

Is it still waiting for further changes?

Since gh-96178 has recently been merged, we finally have a test framework for functional clinic tests, so I'd say this PR should add some tests before we are ready to land.

@colorfulappl
Copy link
Contributor Author

colorfulappl commented Nov 24, 2022

I added some test cases and did another change in a48971d, so this PR may be necessary to be reviewed again. @erlend-aasland @isidentical @kumaraditya303

@kumaraditya303 kumaraditya303 self-requested a review Nov 24, 2022
@colorfulappl
Copy link
Contributor Author

colorfulappl commented Nov 24, 2022

Another change in e6a4e13:
Argument Clinic does not generate noptargs when there is a vararg and no optional argument.

Copy link
Contributor

@erlend-aasland erlend-aasland left a comment

LGTM, thanks! Kumar, Batuhan, do you have further remarks?

Copy link
Contributor

@kumaraditya303 kumaraditya303 left a comment

LGTM

@erlend-aasland
Copy link
Contributor

erlend-aasland commented Nov 24, 2022

@colorfulappl, please fix the merge conflicts

# Conflicts:
#	Lib/test/test_clinic.py
#	Modules/_testclinic.c
#	Modules/clinic/_testclinic.c.h
@erlend-aasland erlend-aasland merged commit 0da7283 into python:main Nov 24, 2022
15 checks passed
@miss-islington
Copy link
Contributor

miss-islington commented Nov 24, 2022

Thanks @colorfulappl for the PR, and @erlend-aasland for merging it 🌮🎉.. I'm working now to backport this PR to: 3.10, 3.11.
🐍🍒🤖

@miss-islington
Copy link
Contributor

miss-islington commented Nov 24, 2022

Sorry, @colorfulappl and @erlend-aasland, I could not cleanly backport this to 3.11 due to a conflict.
Please backport using cherry_picker on command line.
cherry_picker 0da728387c99fe6c127b070f2d250dc5bdd62ee5 3.11

@miss-islington
Copy link
Contributor

miss-islington commented Nov 24, 2022

Sorry @colorfulappl and @erlend-aasland, I had trouble checking out the 3.10 backport branch.
Please retry by removing and re-adding the "needs backport to 3.10" label.
Alternatively, you can backport using cherry_picker on the command line.
cherry_picker 0da728387c99fe6c127b070f2d250dc5bdd62ee5 3.10

@erlend-aasland
Copy link
Contributor

erlend-aasland commented Nov 24, 2022

@kumaraditya303 I'm inclined to backport the functional tests for AC to 3.11 and 3.10. What do you think? We've backported tests to increase coverage in the maintained branches before; it would help backporting the AC fixes (and by the way, we should backport the AC bug fixes that we landed earlier today)

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

Successfully merging this pull request may close these issues.

None yet

10 participants