Преглед изворни кода

s-s-d: Do not fail when kvm_getprocs() cannot find any process

Return NULL, and let the call sites return false themselves. This fixes
the code failing on retries when the process has disappeared.
Guillem Jover пре 11 година
родитељ
комит
90c2e4c9e0
2 измењених фајлова са 11 додато и 1 уклоњено
  1. 2 0
      debian/changelog
  2. 9 1
      utils/start-stop-daemon.c

+ 2 - 0
debian/changelog

@@ -65,6 +65,8 @@ dpkg (1.17.14) UNRELEASED; urgency=low
     - On kFreeBSD systems do not unnecessarily make kvm_openfiles() open
       /dev/mem. This causes issues on FreeBSD jails for example.
       Reported by Steven Chamberlain <steven@pyro.eu.org>.
+    - On systems using libkvm, do not fail when kvm_getprocs() cannot find
+      any process.
 
   [ Raphaël Hertzog ]
   * Explain better in deb-triggers(5) why interest/activate-noawait should be

+ 9 - 1
utils/start-stop-daemon.c

@@ -1252,7 +1252,7 @@ ssd_kvm_get_procs(kvm_t *kd, int op, int arg, int *count)
 	*count = 0;
 
 	kp = kvm_getprocs(kd, op, arg, count);
-	if (kp == NULL)
+	if (kp == NULL && errno != ESRCH)
 		errx(1, "%s", kvm_geterr(kd));
 
 	return kp;
@@ -1361,6 +1361,8 @@ pid_is_exec(pid_t pid, const struct stat *esb)
 
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
+	if (kp == NULL)
+		return false;
 
 	pid_argv_p = kvm_getargv(kd, kp, argv_len);
 	if (pid_argv_p == NULL)
@@ -1445,6 +1447,8 @@ pid_is_child(pid_t pid, pid_t ppid)
 
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
+	if (kp == NULL)
+		return false;
 
 #if defined(OSFreeBSD)
 	proc_ppid = kp->ki_ppid;
@@ -1501,6 +1505,8 @@ pid_is_user(pid_t pid, uid_t uid)
 
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
+	if (kp == NULL)
+		return false;
 
 #if defined(OSFreeBSD)
 	proc_uid = kp->ki_ruid;
@@ -1583,6 +1589,8 @@ pid_is_cmd(pid_t pid, const char *name)
 
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
+	if (kp == NULL)
+		return false;
 
 #if defined(OSFreeBSD)
 	process_name = kp->ki_comm;