Просмотр исходного кода

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
Родитель
Сommit
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;