The following commit has been merged in the master branch:
commit 89fe6c069aba567649ed43fc9ab36f6e42840781
Author: Guillem Jover <guil...@debian.org>
Date:   Fri Apr 6 06:42:00 2012 +0200

    s-s-d: Make all pid_is_exec() implementations get a struct stat
    
    This unifies the API across ports, simplifying the code and making it
    safer against changes in pid_is_cmd(), and makes it resilient against
    symlinks.
    
    This implies removing the generic fallback function that was only being
    used on the Hurd, replacing it with an explicit implementation, and
    modifying the KVM implementation to match on device and inode numbers
    instead of the filenames.

diff --git a/debian/changelog b/debian/changelog
index 6e216bf..0f6bd31 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -16,6 +16,9 @@ dpkg (1.16.3) UNRELEASED; urgency=low
     Suggested by Peter Eisentraut <pet...@debian.org>.
   * Document in dpkg-query(1) that commands producing multiple paragraphs
     will preserve the order of the packages specified on the argument list.
+  * Change start-stop-daemon --exec on GNU/Hurd, FreeBSD, NetBSD, OpenBSD
+    and Solaris to check for executables matching device and inode numbers
+    instead of filenames.
 
   [ Helge Kreutzmann ]
   * Fix a typo in man/dpkg-buildflags.1.
diff --git a/utils/start-stop-daemon.c b/utils/start-stop-daemon.c
index c2766f6..0c5a32d 100644
--- a/utils/start-stop-daemon.c
+++ b/utils/start-stop-daemon.c
@@ -1002,6 +1002,25 @@ pid_is_exec(pid_t pid, const struct stat *esb)
 
        return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
 }
+#elif defined(OSHurd)
+static bool
+pid_is_exec(pid_t pid, const struct stat *esb)
+{
+       struct proc_stat *ps;
+       struct stat sb;
+       const char *filename;
+
+       ps = get_proc_stat(pid, PSTAT_ARGS);
+       if (ps == NULL)
+               return false;
+
+       filename = proc_stat_args(ps);
+
+       if (stat(filename, &sb) != 0)
+               return false;
+
+       return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
+}
 #elif defined(OShpux)
 static bool
 pid_is_exec(pid_t pid, const struct stat *esb)
@@ -1015,11 +1034,12 @@ pid_is_exec(pid_t pid, const struct stat *esb)
 }
 #elif defined(HAVE_KVM_H)
 static bool
-pid_is_exec(pid_t pid, const char *name)
+pid_is_exec(pid_t pid, const struct stat *esb)
 {
        kvm_t *kd;
        int nentries, argv_len = 0;
        struct kinfo_proc *kp;
+       struct stat sb;
        char errbuf[_POSIX2_LINE_MAX], buf[_POSIX2_LINE_MAX];
        char **pid_argv_p;
        char *start_argv_0_p, *end_argv_0_p;
@@ -1052,27 +1072,10 @@ pid_is_exec(pid_t pid, const char *name)
                start_argv_0_p = buf;
        }
 
-       if (strlen(name) != strlen(start_argv_0_p))
+       if (stat(start_argv_0_p, &sb) != 0)
                return false;
-       return (strcmp(name, start_argv_0_p) == 0);
-}
-#else
-/* XXX: Fallback implementation that uses pid_is_cmd(). We should use more
- * reliable native implementations instead. */
-static bool pid_is_cmd(pid_t pid, const char *name);
-
-static bool
-pid_is_exec(pid_t pid, const char *name)
-{
-       char *filename;
-       bool ret;
 
-       filename = xstrdup(name);
-       basename(filename);
-       ret = pid_is_cmd(pid, filename);
-       free(filename);
-
-       return ret;
+       return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino);
 }
 #endif
 
@@ -1225,13 +1228,8 @@ pid_is_running(pid_t pid)
 static enum status_code
 pid_check(pid_t pid)
 {
-#if defined(OSLinux) || defined(OShpux)
        if (execname && !pid_is_exec(pid, &exec_stat))
                return status_dead;
-#else
-       if (execname && !pid_is_exec(pid, execname))
-               return status_dead;
-#endif
        if (userspec && !pid_is_user(pid, user_id))
                return status_dead;
        if (cmdname && !pid_is_cmd(pid, cmdname))

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to debian-dpkg-cvs-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to