From 5ace3305073a7ebaafdf95f8043b720f63aa3876 Mon Sep 17 00:00:00 2001 From: lihaoxiang Date: Thu, 1 Dec 2022 02:27:04 +0000 Subject: [PATCH] fix systemd read PID file failed Signed-off-by: lihaoxiang --- ...en-PID-file-failed-when-systemd-read.patch | 105 ++++++++++++++++++ quota.spec | 9 +- 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 0004-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch diff --git a/0004-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch b/0004-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch new file mode 100644 index 0000000..a60758d --- /dev/null +++ b/0004-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch @@ -0,0 +1,105 @@ +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 diff --git a/quota.spec b/quota.spec index ec923f6..c1eae99 100644 --- a/quota.spec +++ b/quota.spec @@ -1,7 +1,7 @@ Name: quota Version: 4.06 Epoch: 1 -Release: 5 +Release: 6 Summary: Linux Diskquota system as part of the Linux kernel License: BSD and GPLv2 and GPLv2+ and LGPLv2+ URL: http://sourceforge.net/projects/linuxquota/ @@ -16,6 +16,7 @@ Patch0: 0000-Limit-number-of-comparison-characters-to-4.patch Patch1: 0001-Limit-maximum-of-RPC-port.patch Patch2: 0002-quotaio_xfs-Warn-when-large-kernel-timestamps-cannot.patch Patch3: 0003-quota-Add-sw64-architecture.patch +Patch4: 0004-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch BuildRequires: autoconf, automake, coreutils, rpcgen, systemd, gcc BuildRequires: e2fsprogs-devel, gettext-devel, openldap-devel @@ -124,6 +125,12 @@ make check %{_mandir}/man*/* %changelog +* Thu Dec 1 2022 lihaoxiang - 1:4.06-6 +- Type:bugfix +- ID:NA +- SUG:NA +- DESC:fix systemd read PID file failed + * Wed Oct 26 2022 wuzx - 1:4.06-5 - Type:feature - CVE:NA