From a2b207e38ac35ffc048351f76d83f7f9db37bb6c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 20 Jul 2009 15:47:57 +0100 Subject: daemon: before exec'ing ourselves, make sure nobody plays games with /proc/self/exe --- src/daemon/main.c | 16 ++++++++++++---- src/tests/mix-test.c | 6 ++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/daemon/main.c b/src/daemon/main.c index eb378d24..07439675 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -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 diff --git a/src/tests/mix-test.c b/src/tests/mix-test.c index c7a30d67..3f65cbac 100644 --- a/src/tests/mix-test.c +++ b/src/tests/mix-test.c @@ -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; } -- cgit