]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pam-util: use correct errno
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 21 Nov 2025 00:11:34 +0000 (09:11 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 22 Nov 2025 00:42:41 +0000 (09:42 +0900)
- pam_log_oom() passes ENOMEM rather than -ENOMEM, hence previously
  pam_log_oom() did not return PAM_BUF_ERR.
- We may (mistakenly) pass SYNTHETIC_ERRNO(). Let's gracefully handle that.
- Introduce errno_to_pam_error() helper function.

src/shared/pam-util.c
src/shared/pam-util.h

index 7cc0b5aac7c8c141f104900519ddb17ed0fb238b..711bb227691777ed87afd3898057bb0df388021f 100644 (file)
@@ -69,16 +69,21 @@ void pam_log_setup(void) {
         log_set_target(LOG_TARGET_SYSLOG);
 }
 
+int errno_to_pam_error(int error) {
+        return ERRNO_VALUE(error) == ENOMEM ? PAM_BUF_ERR : PAM_SERVICE_ERR;
+}
+
 int pam_syslog_errno(pam_handle_t *handle, int level, int error, const char *format, ...) {
         va_list ap;
 
+        error = ERRNO_VALUE(error);
         LOCAL_ERRNO(error);
 
         va_start(ap, format);
         sym_pam_vsyslog(handle, level, format, ap);
         va_end(ap);
 
-        return error == -ENOMEM ? PAM_BUF_ERR : PAM_SERVICE_ERR;
+        return errno_to_pam_error(error);
 }
 
 int pam_syslog_pam_error(pam_handle_t *handle, int level, int error, const char *format, ...) {
index 204eab04cade289f0091680a445f27895ba21b32..9c5f2f37995cfc46174746477ad8b2e6e6333380 100644 (file)
@@ -31,6 +31,8 @@ int dlopen_libpam(void);
 
 void pam_log_setup(void);
 
+int errno_to_pam_error(int error) _const_;
+
 int pam_syslog_errno(pam_handle_t *handle, int level, int error, const char *format, ...) _printf_(4,5);
 
 int pam_syslog_pam_error(pam_handle_t *handle, int level, int error, const char *format, ...) _printf_(4,5);