Bladeren bron

s-s-d: Fix FreeBSD KVM code to use current kinfo_proc layout

Guillem Jover 12 jaren geleden
bovenliggende
commit
559895751c
2 gewijzigde bestanden met toevoegingen van 17 en 0 verwijderingen
  1. 1 0
      debian/changelog
  2. 16 0
      utils/start-stop-daemon.c

+ 1 - 0
debian/changelog

@@ -56,6 +56,7 @@ dpkg (1.17.7) UNRELEASED; urgency=low
       /proc/PID/stat to read the process name.
     - Add a generic KVM-based implementation to initialize the entire
       process list.
+    - Fix FreeBSD KVM code to use current kinfo_proc layout.
 
   [ Updated dpkg translations ]
   * German (Sven Joachim).

+ 16 - 0
utils/start-stop-daemon.c

@@ -1293,11 +1293,17 @@ pid_is_user(pid_t pid, uid_t uid)
 	kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &nentries);
 	if (kp == NULL)
 		errx(1, "%s", kvm_geterr(kd));
+
+#if defined(OSFreeBSD)
+	proc_uid = kp->ki_ruid;
+#else
 	if (kp->kp_proc.p_cred)
 		kvm_read(kd, (u_long)&(kp->kp_proc.p_cred->p_ruid),
 		         &proc_uid, sizeof(uid_t));
 	else
 		return false;
+#endif
+
 	return (proc_uid == (uid_t)uid);
 }
 #endif
@@ -1370,7 +1376,13 @@ pid_is_cmd(pid_t pid, const char *name)
 	kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &nentries);
 	if (kp == NULL)
 		errx(1, "%s", kvm_geterr(kd));
+
+#if defined(OSFreeBSD)
+	process_name = kp->ki_comm;
+#else
 	process_name = kp->kp_proc.p_comm;
+#endif
+
 	if (strlen(name) != strlen(process_name))
 		return false;
 	return (strcmp(name, process_name) == 0);
@@ -1538,7 +1550,11 @@ do_procinit(void)
 		enum status_code pid_status;
 		pid_t pid;
 
+#if defined(OSFreeBSD)
+		pid = kp[i].ki_pid;
+#else
 		pid = kp[i].kp_proc.p_pid;
+#endif
 
 		pid_status = pid_check(pid);
 		if (pid_status < prog_status)