297
297
sudo_pam_verify (const struct sudoers_context * ctx , struct passwd * pw ,
298
298
const char * prompt , sudo_auth * auth , struct sudo_conv_callback * callback )
299
299
{
300
- const char * envccname ;
301
- const char * s ;
302
- int * pam_status = (int * )auth -> data ;
300
+ const char * envccname , * pam_user ;
301
+ int rc , * pam_status = (int * )auth -> data ;
303
302
debug_decl (sudo_pam_verify , SUDOERS_DEBUG_AUTH );
304
303
305
304
def_prompt = prompt ; /* for converse */
@@ -332,25 +331,22 @@ sudo_pam_verify(const struct sudoers_context *ctx, struct passwd *pw,
332
331
debug_return_int (AUTH_FAILURE );
333
332
}
334
333
335
- if (* pam_status == PAM_SUCCESS ) {
336
- const char * pam_user = NULL ;
337
-
338
- * pam_status = pam_get_item (pamh , PAM_USER , (const void * * ) & pam_user );
339
- if (* pam_status == PAM_SUCCESS &&
340
- (pam_user == NULL || strcmp (pam_user , pw -> pw_name ) != 0 )) {
341
- sudo_debug_printf (SUDO_DEBUG_WARN |SUDO_DEBUG_LINENO ,
342
- "unable to authenticate '%s' as user '%s'" ,
343
- pw -> pw_name , pam_user );
344
- debug_return_int (AUTH_FAILURE );
345
- }
346
- }
347
-
348
334
if (getpass_error ) {
349
335
/* error or ^C from tgetpass() or running non-interactive */
350
336
debug_return_int (noninteractive ? AUTH_NONINTERACTIVE : AUTH_INTR );
351
337
}
338
+
352
339
switch (* pam_status ) {
353
340
case PAM_SUCCESS :
341
+ /* Verify user did not change during PAM transaction. */
342
+ rc = pam_get_item (pamh , PAM_USER , (const void * * )& pam_user );
343
+ if (rc == PAM_SUCCESS &&
344
+ (pam_user == NULL || strcmp (pam_user , pw -> pw_name ) != 0 )) {
345
+ sudo_debug_printf (SUDO_DEBUG_WARN |SUDO_DEBUG_LINENO ,
346
+ "unable to authenticate '%s' as user '%s'" ,
347
+ pw -> pw_name , pam_user );
348
+ debug_return_int (AUTH_FAILURE );
349
+ }
354
350
debug_return_int (AUTH_SUCCESS );
355
351
case PAM_AUTH_ERR :
356
352
case PAM_AUTHINFO_UNAVAIL :
@@ -360,8 +356,8 @@ sudo_pam_verify(const struct sudoers_context *ctx, struct passwd *pw,
360
356
"pam_authenticate: %d" , * pam_status );
361
357
debug_return_int (AUTH_FAILURE );
362
358
default :
363
- s = sudo_pam_strerror ( pamh , * pam_status );
364
- log_warningx ( ctx , 0 , N_ ( "PAM authentication error: %s" ), s );
359
+ log_warningx ( ctx , 0 , N_ ( "PAM authentication error: %s" ),
360
+ sudo_pam_strerror ( pamh , * pam_status ) );
365
361
debug_return_int (AUTH_ERROR );
366
362
}
367
363
}
0 commit comments