From 9b2b7832c19b4b3aa0e89532ebaf3d49a7d88454 Mon Sep 17 00:00:00 2001 From: "Heiko Schlittermann (HS12-RIPE)" Date: Tue, 29 Jan 2019 20:55:35 +0100 Subject: [PATCH] Add NFSv4 spool file patch Do not complain about a failed fchown() if the file has the proper ownership. --- src/src/receive.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/src/receive.c b/src/src/receive.c index cba53c20d..bda0f79bf 100644 --- a/src/src/receive.c +++ b/src/src/receive.c @@ -3039,9 +3039,22 @@ if ((data_fd = Uopen(spool_name, O_RDWR|O_CREAT|O_EXCL, SPOOL_MODE)) < 0) because the group setting doesn't always get set automatically. */ if (fchown(data_fd, exim_uid, exim_gid)) - log_write(0, LOG_MAIN|LOG_PANIC_DIE, - "Failed setting ownership on spool file %s: %s", - spool_name, strerror(errno)); +{ + int chown_errno = errno; + struct stat buf; + + /* On NFSv4 with UID mapping the above fchown() might fail. If the + file is owned by the proper uid and gid, we won't report this failure. */ + if (fstat(data_fd, &buf)) + log_write(0, LOG_MAIN|LOG_PANIC_DIE, + "Failed to stat on spool file %s: %s", + spool_name, strerror(errno)); + + if (buf.st_uid != exim_uid || buf.st_gid != exim_gid) + log_write(0, LOG_MAIN|LOG_PANIC_DIE, + "Failed setting ownership on spool file %s: %s", + spool_name, strerror(chown_errno)); +} (void)fchmod(data_fd, SPOOL_MODE); /* We now have data file open. Build a stream for it and lock it. We lock only @@ -4188,7 +4201,7 @@ if(!smtp_reply) if (deliver_freeze) log_write(0, LOG_MAIN, "frozen by %s", frozen_by); if (queue_only_policy) log_write(L_delay_delivery, LOG_MAIN, "no immediate delivery: queued%s%s by %s", - *queue_name ? " in " : "", *queue_name ? CS queue_name : "", + *queue_name ? " in " : "", *queue_name ? CS queue_name : "", queued_by); } receive_call_bombout = FALSE; -- 2.30.2