513522 m_libcassert.c: 'ordered comparison of pointer with integer zero'
compiler warning
513475 Add SSE4.1 PMULLD instruction for x86 32 bit
+514094 readlink("/proc/self/exe") overwrites buffer beyond its return value
To see details of a given bug, visit
https://bugs.kde.org/show_bug.cgi?id=XXXXXX
PRE(sys_readlink)
{
- FUSE_COMPATIBLE_MAY_BLOCK();
PRINT("sys_readlink ( %#" FMT_REGWORD "x(%s), %#" FMT_REGWORD "x, %llu )",
ARG1, (char*)(Addr)ARG1, ARG2, (ULong)ARG3);
PRE_REG_READ3(long, "readlink",
const char *, path, char *, buf, int, bufsiz);
PRE_MEM_RASCIIZ( "readlink(path)", ARG1 );
PRE_MEM_WRITE( "readlink(buf)", ARG2,ARG3 );
-}
-POST(sys_readlink)
-{
+ Bool fuse_may_block = True;
#if defined(VGO_linux) || defined(VGO_solaris)
{
- Word saved = SYSNO;
#if defined(VGO_linux)
#define PID_EXEPATH "/proc/%d/exe"
#define SELF_EXEPATH "/proc/self/exe"
VG_(sprintf)(name, PID_EXEPATH, VG_(getpid)());
if (ML_(safe_to_deref)(arg1s, 1)
&& (VG_STREQ(arg1s, name) || VG_STREQ(arg1s, SELF_EXEPATH))) {
- VG_(sprintf)(name, SELF_EXEFD, VG_(cl_exec_fd));
- SET_STATUS_from_SysRes( VG_(do_syscall3)(saved, (UWord)name,
- ARG2, ARG3));
+ HChar* out_name = (HChar*)ARG2;
+ SizeT res = VG_(strlen)(VG_(resolved_exename));
+ VG_(strncpy)(out_name, VG_(resolved_exename), res);
+ SET_STATUS_Success(res);
+ fuse_may_block = False;
}
}
#endif
- if (SUCCESS && RES > 0)
- POST_MEM_WRITE( ARG2, RES );
+
+ if (fuse_may_block)
+ FUSE_COMPATIBLE_MAY_BLOCK();
+}
+
+POST(sys_readlink)
+{
+ POST_MEM_WRITE( ARG2, RES );
}
PRE(sys_readv)
bug290061.vgtest bug290061.stderr.exp \
bug491394.vgtest bug491394.stderr.exp \
bug492678.vgtest bug492678.stderr.exp \
+ bug514094,vgtest bug514094.stderr.exp \
closeall.stderr.exp closeall.vgtest \
cmdline0.stderr.exp cmdline0.stdout.exp cmdline0.vgtest \
cmdline1.stderr.exp cmdline1.stdout.exp cmdline1.vgtest \
bug129866 bug234814 \
bug290061 \
bug492678 \
+ bug514094 \
closeall coolo_strlen \
discard exec-sigmask execve faultstatus fcntl_setown \
fdleak_cmsg fdleak_creat fdleak_doubleclose0 fdleak_dup fdleak_dup2 \
--- /dev/null
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <limits.h>
+#include "../../config.h"
+
+int main(int argc, char** argv)
+{
+ char buf[PATH_MAX];
+ memset(buf, 0, PATH_MAX);
+#if defined(VGO_solaris)
+ int ret = readlink("/proc/self/path/a.out", buf, PATH_MAX);
+#else
+ // Linux, and maybe one day NetBSD
+ // other platforms excluded by .vgtest prereq
+ int ret = readlink("/proc/self/exe", buf, PATH_MAX);
+#endif
+ if (argc > 1) {
+ printf("ret = %d, buf = %.64s\n", ret, buf);
+ }
+ char resolved[PATH_MAX];
+ realpath(argv[0], resolved);
+ assert(strcmp(resolved, buf) == 0);
+}
+