|
From: Nicholas N. <nj...@ca...> - 2004-11-16 17:13:27
|
CVS commit by nethercote:
Converted the last syscalls. Phew. Still some cleaning up to do, esp. with
socketcall() and ipc() which are done too simplistically.
Also, VG_([gs]et_thread_area)() both now return -VKI_EFAULT if they are given a
NULL pointer.
M +14 -10 coregrind/Makefile.am 1.103
M +42 -38 coregrind/vg_syscalls.c 1.217
M +12 -2 coregrind/x86-linux/ldt.c 1.5
M +25 -10 memcheck/tests/scalar.c 1.48
M +111 -0 memcheck/tests/scalar.stderr.exp 1.40
--- valgrind/coregrind/Makefile.am #1.102:1.103
@@ -77,9 +77,17 @@
vg_translate.c \
vg_transtab.c
+
+stage2_extra= \
+ demangle/libdemangle.a \
+ ${VG_ARCH}/libarch.a \
+ ${VG_PLATFORM}/libplatform.a
+
## Test repeated in both arms of the if-then-else because older versions of
## automake don't seem to like having += within an if-then-else.
if USE_PIE
stage2_CFLAGS = $(AM_CFLAGS) -fpie
-stage2_DEPENDENCIES = $(srcdir)/valgrind.vs
+stage2_DEPENDENCIES = \
+ $(srcdir)/valgrind.vs \
+ $(stage2_extra)
stage2_LDFLAGS = -Wl,--export-dynamic -g \
-Wl,-version-script $(srcdir)/valgrind.vs \
@@ -87,5 +95,7 @@
else
stage2_CFLAGS = $(AM_CFLAGS)
-stage2_DEPENDENCIES = $(srcdir)/valgrind.vs ${VG_ARCH}/stage2.lds
+stage2_DEPENDENCIES = \
+ $(srcdir)/valgrind.vs ${VG_ARCH}/stage2.lds \
+ $(stage2_extra)
stage2_LDFLAGS = -Wl,--export-dynamic -g \
-Wl,-version-script $(srcdir)/valgrind.vs \
@@ -93,12 +103,6 @@
endif
-stage2_LDADD= \
- demangle/cp-demangle.o \
- demangle/cplus-dem.o \
- demangle/dyn-string.o \
- demangle/safe-ctype.o \
- ${VG_ARCH}/libarch.a \
- ${VG_PLATFORM}/libplatform.a \
- -ldl
+stage2_LDADD= $(stage2_extra) -ldl
+
vg_intercept.c: $(srcdir)/gen_intercepts.pl $(srcdir)/vg_intercept.c.base
--- valgrind/coregrind/vg_syscalls.c #1.216:1.217
@@ -1246,10 +1246,9 @@ PREx(sys_modify_ldt, Special)
}
-PRE(set_thread_area)
+PREx(sys_set_thread_area, Special)
{
- PRINT("set_thread_area ( %p )", arg1);
-
- PRE_MEM_READ( "set_thread_area(ptr)", arg1,
- sizeof(vki_modify_ldt_t) );
+ PRINT("sys_set_thread_area ( %p )", arg1);
+ PRE_REG_READ1(int, "set_thread_area", struct user_desc *, u_info)
+ PRE_MEM_READ( "set_thread_area(u_info)", arg1, sizeof(vki_modify_ldt_t) );
/* "do" the syscall ourselves; the kernel never sees it */
@@ -1257,9 +1256,9 @@ PRE(set_thread_area)
}
-PRE(get_thread_area)
+PREx(sys_get_thread_area, Special)
{
- PRINT("get_thread_area ( %p )", arg1);
- PRE_MEM_WRITE( "get_thread_area(ptr)", arg1,
- sizeof(vki_modify_ldt_t) );
+ PRINT("sys_get_thread_area ( %p )", arg1);
+ PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
+ PRE_MEM_WRITE( "get_thread_area(u_info)", arg1, sizeof(vki_modify_ldt_t) );
/* "do" the syscall ourselves; the kernel never sees it */
@@ -1503,5 +1502,5 @@ PREx(sys_msync, MayBlock)
// Therefore, we have to provide this type ourself, rather than getting it
// from the kernel sources.
-struct pmsg_strbuf {
+struct vki_pmsg_strbuf {
int maxlen; /* no. of bytes in buffer */
int len; /* no. of bytes returned */
@@ -1509,14 +1508,15 @@ struct pmsg_strbuf {
};
-PRE(getpmsg)
+PREx(sys_getpmsg, MayBlock)
{
/* LiS getpmsg from http://www.gcom.com/home/linux/lis/ */
- /* int getpmsg(int fd, struct strbuf *ctrl, struct strbuf *data,
- int *bandp, int *flagsp); */
- struct pmsg_strbuf *ctrl;
- struct pmsg_strbuf *data;
- PRINT("getpmsg ( %d, %p, %p, %p, %p )", arg1,arg2,arg3,arg4,arg5);
- ctrl = (struct pmsg_strbuf *)arg2;
- data = (struct pmsg_strbuf *)arg3;
+ struct vki_pmsg_strbuf *ctrl;
+ struct vki_pmsg_strbuf *data;
+ PRINT("sys_getpmsg ( %d, %p, %p, %p, %p )", arg1,arg2,arg3,arg4,arg5);
+ PRE_REG_READ5(int, "getpmsg",
+ int, fd, struct strbuf *, ctrl, struct strbuf *, data,
+ int *, bandp, int *, flagsp);
+ ctrl = (struct vki_pmsg_strbuf *)arg2;
+ data = (struct vki_pmsg_strbuf *)arg3;
if (ctrl && ctrl->maxlen > 0)
PRE_MEM_WRITE( "getpmsg(ctrl)", (Addr)ctrl->buf, ctrl->maxlen);
@@ -1529,11 +1529,11 @@ PRE(getpmsg)
}
-POST(getpmsg)
+POSTx(sys_getpmsg)
{
- struct pmsg_strbuf *ctrl;
- struct pmsg_strbuf *data;
+ struct vki_pmsg_strbuf *ctrl;
+ struct vki_pmsg_strbuf *data;
- ctrl = (struct pmsg_strbuf *)arg2;
- data = (struct pmsg_strbuf *)arg3;
+ ctrl = (struct vki_pmsg_strbuf *)arg2;
+ data = (struct vki_pmsg_strbuf *)arg3;
if (res == 0 && ctrl && ctrl->len > 0) {
POST_MEM_WRITE( (Addr)ctrl->buf, ctrl->len);
@@ -1544,14 +1544,15 @@ POST(getpmsg)
}
-PRE(putpmsg)
+PREx(sys_putpmsg, MayBlock)
{
/* LiS putpmsg from http://www.gcom.com/home/linux/lis/ */
- /* int putpmsg(int fd, struct strbuf *ctrl, struct strbuf *data,
- int band, int flags); */
- struct pmsg_strbuf *ctrl;
- struct pmsg_strbuf *data;
- PRINT("putpmsg ( %d, %p, %p, %d, %d )", arg1,arg2,arg3,arg4,arg5);
- ctrl = (struct pmsg_strbuf *)arg2;
- data = (struct pmsg_strbuf *)arg3;
+ struct vki_pmsg_strbuf *ctrl;
+ struct vki_pmsg_strbuf *data;
+ PRINT("sys_putpmsg ( %d, %p, %p, %d, %d )", arg1,arg2,arg3,arg4,arg5);
+ PRE_REG_READ5(int, "putpmsg",
+ int, fd, struct strbuf *, ctrl, struct strbuf *, data,
+ int, band, int, flags);
+ ctrl = (struct vki_pmsg_strbuf *)arg2;
+ data = (struct vki_pmsg_strbuf *)arg3;
if (ctrl && ctrl->len > 0)
PRE_MEM_READ( "putpmsg(ctrl)", (Addr)ctrl->buf, ctrl->len);
@@ -5859,8 +5860,11 @@ POSTx(sys_rt_sigqueueinfo)
#endif
-PRE(sigaltstack)
+// XXX: x86-specific
+PREx(sys_sigaltstack, SIG_SIM)
{
/* int sigaltstack(const stack_t *ss, stack_t *oss); */
PRINT("sigaltstack ( %p, %p )",arg1,arg2);
+ PRE_REG_READ2(int, "sigaltstack",
+ const vki_stack_t *, ss, vki_stack_t *, oss);
if (arg1 != (UWord)NULL) {
PRE_MEM_READ( "sigaltstack(ss)", arg1, sizeof(vki_stack_t) );
@@ -5874,5 +5878,5 @@ PRE(sigaltstack)
}
-POST(sigaltstack)
+POSTx(sys_sigaltstack)
{
if (res == 0 && arg2 != (UWord)NULL)
@@ -6681,8 +6685,8 @@ static const struct sys_info sys_info[]
SYSX_(__NR_capset, sys_capset), // 185 * L?
- SYSBA(__NR_sigaltstack, sys_sigaltstack, SIG_SIM), // 186
+ SYSXY(__NR_sigaltstack, sys_sigaltstack), // 186 (x86) (XPG4-UNIX)
SYSXY(__NR_sendfile, sys_sendfile), // 187 * L
- SYSBA(__NR_getpmsg, sys_ni_syscall, MayBlock), // 188 ...
- SYSB_(__NR_putpmsg, sys_ni_syscall, MayBlock), // 189 ...
+ SYSXY(__NR_getpmsg, sys_getpmsg), // 188 (?) (?)
+ SYSX_(__NR_putpmsg, sys_putpmsg), // 189 (?) (?)
// Nb: we convert vfork() to fork() in VG_(pre_syscall)().
@@ -6753,6 +6757,6 @@ static const struct sys_info sys_info[]
SYSX_(__NR_sched_setaffinity,sys_sched_setaffinity), // 241 * L?
SYSXY(__NR_sched_getaffinity,sys_sched_getaffinity), // 242 * L?
- SYSB_(__NR_set_thread_area, sys_set_thread_area, Special), // 243
- SYSB_(__NR_get_thread_area, sys_get_thread_area, Special), // 244
+ SYSX_(__NR_set_thread_area, sys_set_thread_area), // 243 (x86-only) L
+ SYSX_(__NR_get_thread_area, sys_get_thread_area), // 244 (x86-only) L
SYSX_(__NR_io_setup, sys_io_setup), // 245 * L
--- valgrind/coregrind/x86-linux/ldt.c #1.4:1.5
@@ -421,5 +421,10 @@ Int VG_(sys_set_thread_area) ( ThreadId
vki_modify_ldt_t* info )
{
- Int idx = info->entry_number;
+ Int idx;
+
+ if (info == NULL)
+ return -VKI_EFAULT;
+
+ idx = info->entry_number;
if (idx == -1) {
@@ -455,7 +460,12 @@ Int VG_(sys_get_thread_area) ( ThreadId
vki_modify_ldt_t* info )
{
- Int idx = info->entry_number;
+ Int idx;
VgLdtEntry* tls;
+ if (info == NULL)
+ return -VKI_EFAULT;
+
+ idx = info->entry_number;
+
if (idx < VKI_GDT_ENTRY_TLS_MIN || idx > VKI_GDT_ENTRY_TLS_MAX)
return -VKI_EINVAL;
--- valgrind/memcheck/tests/scalar.c #1.47:1.48
@@ -799,6 +799,17 @@ int main(void)
// __NR_sigaltstack 186
- //GO(__NR_sigaltstack, ".s .m");
- //SY(__NR_sigaltstack); FAIL;
+ {
+ struct our_sigaltstack {
+ void *ss_sp;
+ int ss_flags;
+ size_t ss_size;
+ } ss;
+ ss.ss_sp = NULL;
+ ss.ss_flags = 0;
+ ss.ss_size = 0;
+ VALGRIND_MAKE_NOACCESS(& ss, sizeof(struct our_sigaltstack));
+ GO(__NR_sigaltstack, "2s 2m");
+ SY(__NR_sigaltstack, x0+&ss, x0+&ss); SUCC;
+ }
// __NR_sendfile 187
@@ -807,10 +818,14 @@ int main(void)
// __NR_getpmsg 188
- //GO(__NR_getpmsg, ".s .m");
- //SY(__NR_getpmsg); FAIL;
+ // Could do 5s 4m with more effort, but I can't be bothered for this
+ // crappy non-standard syscall.
+ GO(__NR_getpmsg, "5s 0m");
+ SY(__NR_getpmsg, x0, x0, x0, x0); FAIL;
// __NR_putpmsg 189
- //GO(__NR_putpmsg, ".s .m");
- //SY(__NR_putpmsg); FAIL;
+ // Could do 5s 2m with more effort, but I can't be bothered for this
+ // crappy non-standard syscall.
+ GO(__NR_putpmsg, "5s 0m");
+ SY(__NR_putpmsg, x0, x0, x0, x0, x0); FAIL;
// __NR_vfork 190
@@ -1031,10 +1046,10 @@ int main(void)
// __NR_set_thread_area 243
- //GO(__NR_set_thread_area, ".s .m");
- //SY(__NR_set_thread_area); FAIL;
+ GO(__NR_set_thread_area, "1s 1m");
+ SY(__NR_set_thread_area, x0); FAILx(EFAULT);
// __NR_get_thread_area 244
- //GO(__NR_get_thread_area, ".s .m");
- //SY(__NR_get_thread_area); FAIL;
+ GO(__NR_get_thread_area, "1s 1m");
+ SY(__NR_get_thread_area, x0); FAILx(EFAULT);
// __NR_io_setup 245
--- valgrind/memcheck/tests/scalar.stderr.exp #1.39:1.40
@@ -2616,4 +2616,31 @@
Address 0x........ is not stack'd, malloc'd or (recently) free'd
-----------------------------------------------------
+186: __NR_sigaltstack 2s 2m
+-----------------------------------------------------
+
+Syscall param sigaltstack(ss) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param sigaltstack(oss) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param sigaltstack(ss) points to unaddressable byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+ Address 0x........ is 0 bytes inside a block of size 12 client-defined
+ at 0x........: main (scalar.c:810)
+
+Syscall param sigaltstack(oss) points to unaddressable byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+ Address 0x........ is 0 bytes inside a block of size 12 client-defined
+ at 0x........: main (scalar.c:810)
+-----------------------------------------------------
187: __NR_sendfile 4s 1m
-----------------------------------------------------
@@ -2645,4 +2672,60 @@
Address 0x........ is not stack'd, malloc'd or (recently) free'd
-----------------------------------------------------
+188: __NR_getpmsg 5s 0m
+-----------------------------------------------------
+
+Syscall param getpmsg(fd) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param getpmsg(ctrl) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param getpmsg(data) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param getpmsg(bandp) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param getpmsg(flagsp) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+-----------------------------------------------------
+189: __NR_putpmsg 5s 0m
+-----------------------------------------------------
+
+Syscall param putpmsg(fd) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param putpmsg(ctrl) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param putpmsg(data) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param putpmsg(band) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param putpmsg(flags) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+-----------------------------------------------------
190: __NR_vfork other
-----------------------------------------------------
@@ -3709,4 +3792,32 @@
Address 0x........ is not stack'd, malloc'd or (recently) free'd
-----------------------------------------------------
+243:__NR_set_thread_area 1s 1m
+-----------------------------------------------------
+
+Syscall param set_thread_area(u_info) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param set_thread_area(u_info) points to unaddressable byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+-----------------------------------------------------
+244:__NR_get_thread_area 1s 1m
+-----------------------------------------------------
+
+Syscall param get_thread_area(u_info) contains uninitialised byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+
+Syscall param get_thread_area(u_info) points to unaddressable byte(s)
+ at 0x........: syscall (in /...libc...)
+ by 0x........: __libc_start_main (...libc...)
+ by 0x........: ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+-----------------------------------------------------
245: __NR_io_setup 2s 1m
-----------------------------------------------------
|