summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog3
-rw-r--r--utils/start-stop-daemon.c16
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);