From 07a1251a207ea0c77c417e3b8ede79b76d3254f1 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Mon, 29 Jun 2009 06:57:30 +0000 Subject: [PATCH] Make the Linux launcher more like the Darwin one in how it reads the executable headers. This means it no longer crashes on an empty executable. Fixes bug 156065. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10384 --- coregrind/launcher-linux.c | 11 ++++++----- none/tests/empty-exe.stderr.exp | 2 ++ none/tests/empty-exe.vgtest | 9 +++++++++ 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 none/tests/empty-exe.stderr.exp create mode 100644 none/tests/empty-exe.vgtest diff --git a/coregrind/launcher-linux.c b/coregrind/launcher-linux.c index 1713434e5..34754d02a 100644 --- a/coregrind/launcher-linux.c +++ b/coregrind/launcher-linux.c @@ -112,7 +112,8 @@ static const char *find_client(const char *clientname) static const char *select_platform(const char *clientname) { int fd; - unsigned char *header; + uint8_t header[4096]; + ssize_t bytes; const char *platform = NULL; long pagesize = sysconf(_SC_PAGESIZE); @@ -123,11 +124,11 @@ static const char *select_platform(const char *clientname) return NULL; // barf("open(%s): %s", clientname, strerror(errno)); - if ((header = mmap(NULL, pagesize, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0)) == MAP_FAILED) - return NULL; - // barf("mmap(%s): %s", clientname, strerror(errno)); - + bytes = read(fd, header, sizeof(header)); close(fd); + if (bytes != sizeof(header)) { + return NULL; + } if (header[0] == '#' && header[1] == '!') { char *interp = (char *)header + 2; diff --git a/none/tests/empty-exe.stderr.exp b/none/tests/empty-exe.stderr.exp new file mode 100644 index 000000000..139597f9c --- /dev/null +++ b/none/tests/empty-exe.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/empty-exe.vgtest b/none/tests/empty-exe.vgtest new file mode 100644 index 000000000..71fef2eda --- /dev/null +++ b/none/tests/empty-exe.vgtest @@ -0,0 +1,9 @@ +# Bug 162020: running an empty executable used to crash Valgrind. Note that +# the (old) crash message gets filtered out, so it's the presence of the +# blank two lines in the .stderr.exp file that are important -- they +# indicate it ran to completion. If the crash occurs, the .stderr.out file +# is empty. +prereq: touch empty-exe && chmod u+x empty-exe +prog: empty-exe +vgopts: +cleanup: rm -f empty-exe