From: Nicholas Nethercote Date: Mon, 29 Jun 2009 06:57:30 +0000 (+0000) Subject: Make the Linux launcher more like the Darwin one in how it reads the X-Git-Tag: svn/VALGRIND_3_5_0~462 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=07a1251a207ea0c77c417e3b8ede79b76d3254f1;p=thirdparty%2Fvalgrind.git 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 --- diff --git a/coregrind/launcher-linux.c b/coregrind/launcher-linux.c index 1713434e51..34754d02a4 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 0000000000..139597f9cb --- /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 0000000000..71fef2eda7 --- /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