[ 
https://issues.apache.org/jira/browse/HADOOP-20022?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18127443#comment-18127443
 ] 

ASF GitHub Bot commented on HADOOP-20022:
-----------------------------------------

joseluisll opened a new pull request, #8826:
URL: https://github.com/apache/hadoop/pull/8826

   ### Description of PR
   
   JIRA: https://issues.apache.org/jira/browse/HADOOP-20022
   
   `SecurityUtil.doAsLoginUserOrFatal()` called `Runtime.getRuntime().exit(-1)` 
when `UserGroupInformation.getLoginUser()` threw an `IOException` with security 
enabled. That bypasses `ExitUtil`, so tests that call 
`ExitUtil.disableSystemExit()` cannot intercept it and the JVM is killed 
instead. Callers include `ZKFailoverController`, `SecondaryNameNode`, 
`BootstrapStandby`, `EditLogTailer` and `StandbyCheckpointer`.
   
   Changes:
   - Call `ExitUtil.terminate(-1, e)` instead of 
`Runtime.getRuntime().exit(-1)`. Production behaviour is unchanged: with exits 
enabled, `ExitUtil.terminate` ends in `System.exit(-1)`.
   - Drop the redundant `e.printStackTrace()`; the exception is already logged.
   - Throw after `terminate()`. SpotBugs cannot tell that 
`ExitUtil.terminate()` never returns, and without this it reports 
`NP_NULL_ON_SOME_PATH_EXCEPTION` on `ugi.doAs(action)`.
   - Add `TestSecurityUtil#testDoAsLoginUserOrFatalTerminatesOnLoginFailure`, 
which statically mocks `UserGroupInformation` so `isSecurityEnabled()` is true 
and `getLoginUser()` throws, then checks for an `ExitException` with exit code 
-1, the original `IOException` as its cause, and that the action never runs.
   
   Note: `ZKFailoverController.run()` catches `RuntimeException` and rethrows 
its cause, so a ZKFC test with exits disabled sees the original `IOException` 
rather than the `ExitException`. `ExitUtil.terminateCalled()` still reports the 
exit. That is existing ZKFC behaviour and is left unchanged here.
   
   Related: HADOOP-20010 (same issue in 
`AbstractDelegationTokenSecretManager.ExpiredTokenRemover`) and YARN-12028 
(same issue in `DelegationTokenRenewer.DelegationTokenCancelThread`).
   
   ### How was this patch tested?
   
   Run on the host (pure Java, no native profile), on the branch's previous 
base `86e6c203` (YARN-12012):
   - `mvn test -Dtest=TestSecurityUtil -Dmaven.test.failure.ignore=false` in 
`hadoop-common`: 27 tests run, 0 failures, 0 errors.
   - The new test run against the original code kills the surefire fork ("The 
forked VM terminated without properly saying goodbye. VM crash or System.exit 
called?"), so it reproduces the problem.
   - SpotBugs on `hadoop-common`: 0 bugs (the first version of the fix reported 
`NP_NULL_ON_SOME_PATH_EXCEPTION`, fixed in the second commit).
   - Checkstyle: no violations on the changed lines.
   
   The branch was then rebuilt on `apache/hadoop` trunk `df8e2a77` 
(HADOOP-20020). None of the 5 commits in between touch `SecurityUtil.java` or 
`TestSecurityUtil.java`, and the diff is identical, but the tests have not been 
re-run on the new base.
   
   ### For code changes:
   
   - [x] Does the title of this PR start with the corresponding JIRA issue id 
(e.g. 'HADOOP-17799. Your PR title ...')?
   - [ ] Object storage: Have the integration tests been executed and the 
endpoint
         declared according to the connector-specific documentation? *Note: 
Automated CI
         testing doesn't cover all cases so manual testing with cloud storage 
is still
         required.* (N/A: no object storage changes)
   - [ ] If adding new dependencies to the code, are these dependencies 
licensed in a way that is compatible for inclusion under [ASF 
2.0](http://www.apache.org/legal/resolved.html#category-a)? (N/A: no new 
dependencies)
   - [ ] If applicable, have you updated the `LICENSE`, `LICENSE-binary`, 
`NOTICE-binary` files? (N/A)
   
   ### AI Tooling
   
   If an AI tool was used:
   
   - [x] The PR includes the phrase "Contains content generated by <tool>"
         where <tool> is the name of the AI tool used.
   - [ X] My use of AI contributions follows the ASF legal policy
         https://www.apache.org/legal/generative-tooling.html
   
   Contains content generated by Claude Code.




> SecurityUtil.doAsLoginUserOrFatal should use ExitUtil instead of Runtime.exit
> -----------------------------------------------------------------------------
>
>                 Key: HADOOP-20022
>                 URL: https://issues.apache.org/jira/browse/HADOOP-20022
>             Project: Hadoop Common
>          Issue Type: Improvement
>          Components: security
>            Reporter: Jose Luis López
>            Priority: Minor
>
> {{SecurityUtil.doAsLoginUserOrFatal()}} calls 
> {{Runtime.getRuntime().exit(-1)}} when 
> {{UserGroupInformation.getLoginUser()}} throws an {{IOException}}:
> {code:java}
> try {
>   ugi = UserGroupInformation.getLoginUser();
> } catch (IOException e) {
>   LOG.error("Exception while getting login user", e);
>   e.printStackTrace();
>   Runtime.getRuntime().exit(-1);
> }
> {code}
> After HADOOP-20010 this is the only non-test caller of 
> {{Runtime.getRuntime().exit(-1)}} in hadoop-common. It bypasses {{ExitUtil}}, 
> so tests that call {{ExitUtil.disableSystemExit()}} can't intercept it and 
> the JVM is killed instead.
> Callers include {{ZKFailoverController}}, {{SecondaryNameNode}}, 
> {{BootstrapStandby}}, {{EditLogTailer}} and {{StandbyCheckpointer}}.
> *Proposed fix:*
> * Call {{ExitUtil.terminate(-1, e)}} instead of 
> {{Runtime.getRuntime().exit(-1)}}.
> * Drop the redundant {{e.printStackTrace()}}; the exception is already logged.
> * Add a test that a {{getLoginUser()}} failure with security enabled calls 
> {{ExitUtil.terminate(-1, ...)}}.
> Raised in review of HADOOP-20010 (https://github.com/apache/hadoop/pull/8805).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to