浏览代码

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
     - 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;