daemon: before exec'ing ourselves, make sure nobody plays games with /proc/self/exe
authorLennart Poettering <lennart@poettering.net>
Mon, 20 Jul 2009 14:47:57 +0000 (15:47 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 20 Jul 2009 14:48:36 +0000 (15:48 +0100)
src/daemon/main.c
src/tests/mix-test.c

index eb378d2..0743967 100644 (file)
@@ -405,7 +405,8 @@ int main(int argc, char *argv[]) {
     /*
        Disable lazy relocations to make usage of external libraries
        more deterministic for our RT threads. We abuse __OPTIMIZE__ as
-       a check whether we are a debug build or not.
+       a check whether we are a debug build or not. This all is
+       admittedly a bit snake-oilish.
     */
 
     if (!getenv("LD_BIND_NOW")) {
@@ -416,9 +417,16 @@ int main(int argc, char *argv[]) {
 
         pa_set_env("LD_BIND_NOW", "1");
 
-        if ((rp = pa_readlink("/proc/self/exe")))
-            pa_assert_se(execv(rp, argv) == 0);
-        else
+        if ((rp = pa_readlink("/proc/self/exe"))) {
+
+            if (pa_streq(rp, PA_BINARY))
+                pa_assert_se(execv(rp, argv) == 0);
+            else
+                pa_log_warn("/proc/self/exe does not point to " PA_BINARY ", cannot self execute. Are you playing games?");
+
+            pa_xfree(rp);
+
+        } else
             pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
     }
 #endif
index c7a30d6..3f65cba 100644 (file)
@@ -83,8 +83,10 @@ static void dump_block(const pa_sample_spec *ss, const pa_memchunk *chunk) {
         case PA_SAMPLE_S24RE: {
             uint8_t *u = d;
 
-            for (i = 0; i < chunk->length / pa_frame_size(ss); i++)
-               printf("0x%02x%02x%02xx ", *(u++), *(u++), *(u++));
+            for (i = 0; i < chunk->length / pa_frame_size(ss); i++) {
+               printf("0x%02x%02x%02xx ", *u, *(u+1), *(u+2));
+                u += 3;
+            }
 
             break;
         }