Browse Source

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 12 years ago
parent
commit
90c2e4c9e0
2 changed files with 11 additions and 1 deletions
  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
     - On kFreeBSD systems do not unnecessarily make kvm_openfiles() open
       /dev/mem. This causes issues on FreeBSD jails for example.
       /dev/mem. This causes issues on FreeBSD jails for example.
       Reported by Steven Chamberlain <steven@pyro.eu.org>.
       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 ]
   [ Raphaël Hertzog ]
   * Explain better in deb-triggers(5) why interest/activate-noawait should be
   * 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;
 	*count = 0;
 
 
 	kp = kvm_getprocs(kd, op, arg, count);
 	kp = kvm_getprocs(kd, op, arg, count);
-	if (kp == NULL)
+	if (kp == NULL && errno != ESRCH)
 		errx(1, "%s", kvm_geterr(kd));
 		errx(1, "%s", kvm_geterr(kd));
 
 
 	return kp;
 	return kp;
@@ -1361,6 +1361,8 @@ pid_is_exec(pid_t pid, const struct stat *esb)
 
 
 	kd = ssd_kvm_open();
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
 	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);
 	pid_argv_p = kvm_getargv(kd, kp, argv_len);
 	if (pid_argv_p == NULL)
 	if (pid_argv_p == NULL)
@@ -1445,6 +1447,8 @@ pid_is_child(pid_t pid, pid_t ppid)
 
 
 	kd = ssd_kvm_open();
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
+	if (kp == NULL)
+		return false;
 
 
 #if defined(OSFreeBSD)
 #if defined(OSFreeBSD)
 	proc_ppid = kp->ki_ppid;
 	proc_ppid = kp->ki_ppid;
@@ -1501,6 +1505,8 @@ pid_is_user(pid_t pid, uid_t uid)
 
 
 	kd = ssd_kvm_open();
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
+	if (kp == NULL)
+		return false;
 
 
 #if defined(OSFreeBSD)
 #if defined(OSFreeBSD)
 	proc_uid = kp->ki_ruid;
 	proc_uid = kp->ki_ruid;
@@ -1583,6 +1589,8 @@ pid_is_cmd(pid_t pid, const char *name)
 
 
 	kd = ssd_kvm_open();
 	kd = ssd_kvm_open();
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
 	kp = ssd_kvm_get_procs(kd, KERN_PROC_PID, pid, NULL);
+	if (kp == NULL)
+		return false;
 
 
 #if defined(OSFreeBSD)
 #if defined(OSFreeBSD)
 	process_name = kp->ki_comm;
 	process_name = kp->ki_comm;