diff --git a/9002-quota_nld-Initialize-sa_mask-when-registering-PID-fi.patch b/9002-quota_nld-Initialize-sa_mask-when-registering-PID-fi.patch new file mode 100644 index 0000000000000000000000000000000000000000..3730797782d77394289aa2762c3b8f6928161c18 --- /dev/null +++ b/9002-quota_nld-Initialize-sa_mask-when-registering-PID-fi.patch @@ -0,0 +1,34 @@ +From 25f16b1de313ce0d411f754572f94f051bfbe3c8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Tue, 16 Mar 2021 17:28:15 +0100 +Subject: [PATCH] quota_nld: Initialize sa_mask when registering PID file + removal +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +term_action.sa_mask is an automatic variable and and thus unitialized. +This patch empties the signal mask. + +Signed-off-by: Petr Písař +Signed-off-by: Jan Kara +--- + quota_nld.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/quota_nld.c b/quota_nld.c +index 72d99a9..09c4775 100644 +--- a/quota_nld.c ++++ b/quota_nld.c +@@ -466,7 +466,7 @@ static void use_pid_file(void) + + term_action.sa_handler = remove_pid; + term_action.sa_flags = 0; +- if (sigaction(SIGTERM, &term_action, NULL)) ++ if (sigemptyset(&term_action.sa_mask) || sigaction(SIGTERM, &term_action, NULL)) + errstr(_("Could not register PID file removal on SIGTERM.\n")); + if (store_pid()) + errstr(_("Could not store my PID %jd.\n"), (intmax_t )getpid()); +-- +1.8.3.1 + diff --git a/9002-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch b/9003-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch similarity index 63% rename from 9002-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch rename to 9003-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch index a60758d9518762aec404ac6ab75d29a57e84a155..54c07115ef7dc0de48cbd48b298e6168e1b8215e 100644 --- a/9002-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch +++ b/9003-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch @@ -1,105 +1,110 @@ -From 09b60c7787dfd31c17bfc2c2560bc561b141c207 Mon Sep 17 00:00:00 2001 -From: lihaoxiang -Date: Thu, 1 Dec 2022 09:32:09 +0800 -Subject: [PATCH] quota-nld: fix open PID file failed when systemd read it - -Running quota_nld by systemd might cause the problem that systemd -couldn't open the PID file generated by quota_nld. In fact, the PID -file hasn't existed yet because it originates from the child process -of quota_nld which is a daemon process. As the main process exit, -systemd try to access the PID file but the daemon hadn't create it -that time. - -In this situation, we move the procedure of creating PID file into the -parent process to ensure the PID file must existed when quota_nld exit. -After that, the above problem would never occur again. - -Signed-off-by: lihaoxiang ---- - quota_nld.c | 43 +++++++++++++++++++++++++++++++++---------- - 1 file changed, 33 insertions(+), 10 deletions(-) - -diff --git a/quota_nld.c b/quota_nld.c -index 72d99a9..ae90bd0 100644 ---- a/quota_nld.c -+++ b/quota_nld.c -@@ -413,7 +413,7 @@ static char *build_pid_file_name(void) - } - - /* Store daemon's PID to file */ --static int store_pid(void) -+static int store_pid(pid_t pid) - { - FILE *pid_file; - char *pid_name; -@@ -429,7 +429,7 @@ static int store_pid(void) - free(pid_name); - return -1; - } -- if (fprintf(pid_file, "%jd\n", (intmax_t)getpid()) < 0) { -+ if (fprintf(pid_file, "%jd\n", pid) < 0) { - errstr(_("Could not write daemon's PID into '%s'.\n"), - pid_name); - fclose(pid_file); -@@ -460,7 +460,7 @@ static void remove_pid(int signal) - } - - /* Store daemon's PID into file and register its removal on SIGTERM */ --static void use_pid_file(void) -+static void use_pid_file(pid_t pid) - { - struct sigaction term_action; - -@@ -468,8 +468,35 @@ static void use_pid_file(void) - term_action.sa_flags = 0; - if (sigaction(SIGTERM, &term_action, NULL)) - errstr(_("Could not register PID file removal on SIGTERM.\n")); -- if (store_pid()) -- errstr(_("Could not store my PID %jd.\n"), (intmax_t )getpid()); -+ if (store_pid(pid)) -+ errstr(_("Could not store my PID %jd.\n"), pid); -+} -+ -+static void fork_daemon() -+{ -+ pid_t pid = fork(); -+ if (pid < 0) { -+ errstr(_("Failed to daemonize: fork error with %s\n"), strerror(errno)); -+ exit(1); -+ } else if (pid != 0) { -+ use_pid_file(pid); -+ exit(0); -+ } -+ -+ if (setsid() == -1) { -+ errstr(_("Failed to daemonize: setsid error with %s\n"), strerror(errno)); -+ exit(1); -+ } -+ if (chdir("/")) -+ errstr(_("Failed to chdir in daemonize \n")); -+ int fd = open("/dev/null", O_RDWR, 0); -+ if (fd >= 0) { -+ (void)dup2(fd, STDIN_FILENO); -+ (void)dup2(fd, STDOUT_FILENO); -+ (void)dup2(fd, STDERR_FILENO); -+ -+ (void)close(fd); -+ } - } - - int main(int argc, char **argv) -@@ -485,11 +512,7 @@ int main(int argc, char **argv) - dhandle = init_dbus(); - if (!(flags & FL_NODAEMON)) { - use_syslog(); -- if (daemon(0, 0)) { -- errstr(_("Failed to daemonize: %s\n"), strerror(errno)); -- exit(1); -- }; -- use_pid_file(); -+ fork_daemon(); - } - run(nsock); - return 0; --- -2.37.0.windows.1 \ No newline at end of file +From 06b93e5c1caf5d36d51132cb85c11a96cbdae023 Mon Sep 17 00:00:00 2001 +From: "lihaoxiang (F)" +Date: Thu, 1 Dec 2022 12:10:49 +0800 +Subject: [PATCH] quota-nld: fix open PID file failed when systemd read it + +Running quota_nld by systemd might cause the problem that systemd +couldn't open the PID file generated by quota_nld. In fact, the PID +file hasn't existed yet because it originates from the child process +of quota_nld which is a daemon process. As the main process exit, +systemd try to access the PID file but the daemon hadn't create it +that time. + +In this situation, we move the procedure of creating PID file into the +parent process to ensure the PID file must existed when quota_nld exit. +After that, the above problem would never occur again. + +[JK: Fixed up SIGTERM handling and format strings] + +Signed-off-by: lihaoxiang +Signed-off-by: Jan Kara +--- + quota_nld.c | 44 ++++++++++++++++++++++++++++++++++---------- + 1 file changed, 34 insertions(+), 10 deletions(-) + +diff --git a/quota_nld.c b/quota_nld.c +index 09c4775..82e60c2 100644 +--- a/quota_nld.c ++++ b/quota_nld.c +@@ -413,7 +413,7 @@ static char *build_pid_file_name(void) + } + + /* Store daemon's PID to file */ +-static int store_pid(void) ++static int store_pid(pid_t pid) + { + FILE *pid_file; + char *pid_name; +@@ -429,7 +429,7 @@ static int store_pid(void) + free(pid_name); + return -1; + } +- if (fprintf(pid_file, "%jd\n", (intmax_t)getpid()) < 0) { ++ if (fprintf(pid_file, "%d\n", (int)pid) < 0) { + errstr(_("Could not write daemon's PID into '%s'.\n"), + pid_name); + fclose(pid_file); +@@ -460,7 +460,7 @@ static void remove_pid(int signal) + } + + /* Store daemon's PID into file and register its removal on SIGTERM */ +-static void use_pid_file(void) ++static void setup_sigterm_handler(void) + { + struct sigaction term_action; + +@@ -468,8 +468,36 @@ static void use_pid_file(void) + term_action.sa_flags = 0; + if (sigemptyset(&term_action.sa_mask) || sigaction(SIGTERM, &term_action, NULL)) + errstr(_("Could not register PID file removal on SIGTERM.\n")); +- if (store_pid()) +- errstr(_("Could not store my PID %jd.\n"), (intmax_t )getpid()); ++} ++ ++static void fork_daemon(void) ++{ ++ pid_t pid = fork(); ++ if (pid < 0) { ++ errstr(_("Failed to daemonize: fork: %s\n"), strerror(errno)); ++ exit(1); ++ } else if (pid != 0) { ++ if (store_pid(pid)) { ++ errstr(_("Could not store my PID %d.\n"), (int)pid); ++ kill(pid, SIGKILL); ++ } ++ exit(0); ++ } ++ ++ setup_sigterm_handler(); ++ if (setsid() < 0) { ++ errstr(_("Failed to daemonize: setsid: %s\n"), strerror(errno)); ++ exit(1); ++ } ++ if (chdir("/") < 0) ++ errstr(_("Failed to chdir in daemonize\n")); ++ int fd = open("/dev/null", O_RDWR, 0); ++ if (fd >= 0) { ++ dup2(fd, STDIN_FILENO); ++ dup2(fd, STDOUT_FILENO); ++ dup2(fd, STDERR_FILENO); ++ close(fd); ++ } + } + + int main(int argc, char **argv) +@@ -485,11 +513,7 @@ int main(int argc, char **argv) + dhandle = init_dbus(); + if (!(flags & FL_NODAEMON)) { + use_syslog(); +- if (daemon(0, 0)) { +- errstr(_("Failed to daemonize: %s\n"), strerror(errno)); +- exit(1); +- }; +- use_pid_file(); ++ fork_daemon(); + } + run(nsock); + return 0; +-- +1.8.3.1 + diff --git a/quota.spec b/quota.spec index 0bea8dd2f5a05823c275d15edd3ac0dc5c15da63..e3b08a3d7841ffa918fac26a0d12da9057da605d 100644 --- a/quota.spec +++ b/quota.spec @@ -1,7 +1,7 @@ Name: quota Version: 4.05 Epoch: 1 -Release: 2 +Release: 3 Summary: Linux Diskquota system as part of the Linux kernel License: BSD and GPLv2 and GPLv2+ and LGPLv2+ URL: http://sourceforge.net/projects/linuxquota/ @@ -14,7 +14,8 @@ Source4: rpc-rquotad.sysconfig Patch9000: 9000-Limit-number-of-comparison-characters-to-4.patch Patch9001: 9001-Limit-maximum-of-RPC-port.patch -Patch9002: 9002-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch +Patch9002: 9002-quota_nld-Initialize-sa_mask-when-registering-PID-fi.patch +Patch9003: 9003-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch BuildRequires: autoconf, automake, coreutils, rpcgen, systemd BuildRequires: e2fsprogs-devel, gettext-devel, openldap-devel @@ -123,6 +124,9 @@ make check %{_mandir}/man*/* %changelog +* Tue Dec 6 2022 lihaoxiang - 1:4.05-3 +- rebase upstream patch about fix systemd read PID file failed + * Thu Dec 1 2022 lihaoxiang - 1:4.05-2 - fix systemd read pid file failed