diff options
-rw-r--r-- | debian/changelog | 3 | ||||
-rw-r--r-- | utils/start-stop-daemon.c | 16 |
2 files changed, 15 insertions, 4 deletions
diff --git a/debian/changelog b/debian/changelog index 9b052a1ce..10cf854e3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,6 +14,9 @@ dpkg (1.17.10) UNRELEASED; urgency=low * Fix non-security sensitive TOCTOU race in update-alternative alternative database loading. * Fix non-security sensitive TOCTOU race in update-alternative rename code. + * Add a workaround to start-stop-daemon for bogus OpenVZ Linux kernels that + prepend, instead of appending, the " (deleted)" marker in /proc/PID/exe. + Closes: #731530 [ Updated manpages translations ] * German (Helge Kreutzmann). diff --git a/utils/start-stop-daemon.c b/utils/start-stop-daemon.c index a41534816..07a928064 100644 --- a/utils/start-stop-daemon.c +++ b/utils/start-stop-daemon.c @@ -1166,6 +1166,7 @@ pid_is_exec(pid_t pid, const struct stat *esb) { char lname[32]; char lcontents[_POSIX_PATH_MAX + 1]; + char *filename; const char deleted[] = " (deleted)"; int nread; struct stat sb; @@ -1175,11 +1176,18 @@ pid_is_exec(pid_t pid, const struct stat *esb) if (nread == -1) return false; - lcontents[nread] = '\0'; - if (strcmp(lcontents + nread - strlen(deleted), deleted) == 0) - lcontents[nread - strlen(deleted)] = '\0'; + filename = lcontents; + filename[nread] = '\0'; - if (stat(lcontents, &sb) != 0) + /* OpenVZ kernels contain a bogus patch that instead of appending, + * prepends the deleted marker. Workaround those. Otherwise handle + * the normal appended marker. */ + if (strncmp(filename, deleted, strlen(deleted)) == 0) + filename += strlen(deleted); + else if (strcmp(filename + nread - strlen(deleted), deleted) == 0) + filename[nread - strlen(deleted)] = '\0'; + + if (stat(filename, &sb) != 0) return false; return (sb.st_dev == esb->st_dev && sb.st_ino == esb->st_ino); |