mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-09 04:37:30 +02:00
[Awake] Fix lack of process validation for --pid and --use-parent-pid options (#41803)
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request This adds validation for the "PID binding" modes of Awake. Previously, Awake did not validate that a user-supplied process ID actually corresponded to a running process (leading to an infinite keep-awake duration); nor did it validate that the parent process could be found and bound to when using the `--use-parent-pid` option (which left Awake in an unresponsive state without setting a keep-awake mode). This PR fixes those issues by validating that the process exists when using `--pid` (or when the PID comes from PowerToys Runner itself), and also early-exits if the parent process cannot be bound to when using `--use-parent-pid`. This supersedes a prior PR which just fixes the `--use-parent-pid`-related flaw, #41744. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #41709, #41722 - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments For the `--pid` fix, this is validated both when the command line is parsed (by extending the existing `pidOption` validator) and just before the process ID is bound to (in `HandleCommandLineArguments` and a new `HandleProcessScopedKeepAwake` method). These use a new `ProcessExists` method which checks that the process exists (funnily enough) and isn't exiting. I also added a very paranoid check that the process ID isn't Awake's own. This couldn't be done deliberately, but if a user mis-typed their desired PID and it happened to match Awake's, this would lead to an indefinite keep-awake. It's a very remote possibility, but one-in-ten-thousand odds still happen. The fix for the `--use-parent-pid` checks the return value of the `Manager.GetParentProcess` call, which was previously lacking, exiting early if it sees a `0` failure value. Added validation for PID value not being zero or negative. There are new string resources for the general PID-binding failure and the specific parent process binding issue. I don't actually know why these are resources, but I followed the existing convention from the project. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Tested that: - When `null` (`0` when marshalled) is returned from the `GetParentProcess` path that Awake exits early and does not enter its failed state. - When a non-existent PID is input via the `--pid` command line that Awake exits early and does not attempt to bind to a non-existent process. - PID-binding still works without issue when a correct process ID is provided on the command line. - `--use-parent-pid` still works when the parent process can be located and bound to. - New PID-binding parameter checks are caught (0 or negative numbers are rejected). - Other modes still work as expected.
This commit is contained in:
@@ -226,4 +226,13 @@
|
||||
<data name="AWAKE_SCREEN_OFF" xml:space="preserve">
|
||||
<value>Off</value>
|
||||
</data>
|
||||
<data name="AWAKE_EXIT_PARENT_BINDING_FAILURE_MESSAGE" xml:space="preserve">
|
||||
<value>Exiting because the parent process ID could not be found.</value>
|
||||
</data>
|
||||
<data name="AWAKE_EXIT_PROCESS_BINDING_FAILURE_MESSAGE" xml:space="preserve">
|
||||
<value>Exiting because the requested process ID could not be found.</value>
|
||||
</data>
|
||||
<data name="AWAKE_EXIT_BIND_TO_SELF_FAILURE_MESSAGE" xml:space="preserve">
|
||||
<value>Exiting because the provided process ID is Awake's own.</value>
|
||||
</data>
|
||||
</root>
|
||||
Reference in New Issue
Block a user