- Convert open() to the new syscall regime.
- Improve scalar regtest;  I will add new syscalls to it as I convert them.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2953 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am
index bc91fdd..3d99c36 100644
--- a/memcheck/tests/Makefile.am
+++ b/memcheck/tests/Makefile.am
@@ -51,8 +51,8 @@
 	realloc1.stderr.exp realloc1.vgtest \
 	realloc2.stderr.exp realloc2.vgtest \
 	realloc3.stderr.exp realloc3.vgtest \
-	scalar.stderr.exp scalar.vgtest \
-	scalar_supp.stderr.exp scalar_supp.vgtest scalar.supp \
+	scalar.stderr.exp scalar.vgtest scalar.supp \
+	scalar_supp.stderr.exp scalar_supp.vgtest scalar_supp.c \
 	sigaltstack.stderr.exp sigaltstack.vgtest \
 	signal2.stderr.exp \
 	signal2.stdout.exp signal2.vgtest \
@@ -81,7 +81,7 @@
 	memalign_test memalign2 memcmptest mempool mmaptest \
 	nanoleak new_nothrow \
 	null_socket overlap \
-	realloc1 realloc2 realloc3 scalar sigaltstack signal2 \
+	realloc1 realloc2 realloc3 scalar scalar_supp sigaltstack signal2 \
 	str_tester supp1 supp2 suppfree \
 	trivialleak weirdioctl	\
 	mismatches new_override metadata threadederrno \
@@ -134,6 +134,7 @@
 realloc2_SOURCES 	= realloc2.c
 realloc3_SOURCES 	= realloc3.c
 scalar_SOURCES 		= scalar.c
+scalar_supp_SOURCES 	= scalar_supp.c
 signal2_SOURCES 	= signal2.c
 supp1_SOURCES 		= supp.c
 supp2_SOURCES 		= supp.c
diff --git a/memcheck/tests/scalar.c b/memcheck/tests/scalar.c
index 440f382..0a795e2 100644
--- a/memcheck/tests/scalar.c
+++ b/memcheck/tests/scalar.c
@@ -1,22 +1,336 @@
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <sys/stat.h>
 #include <sys/syscall.h>
+#include <sys/types.h>
+
+// Thorough syscall scalar arg checking.  Also serves as thorough checking
+// for (very) basic syscall use.  Generally not trying to do anything
+// meaningful with the syscalls.
+
+void GO(char* s) {
+   fprintf(stderr, "---------- %s ----------\n", s);
+}
 
 int main(void)
 {
    // uninitialised, but we know pi[0] is 0x0
    int* pi  = malloc(sizeof(int));
+   int  i0  = pi[0];
 
    // uninitialised, but we know pc[0] points to 0x0
-   char** pc  = malloc(sizeof(char*));
-   
-   // Five errors:  
-   // - the syscall number itself is undefined (but we know it's
-   //   0 + __NR_write :)
-   // - each of the scalar args are undefined
-   // - the 2nd arg points to unaddressable memory.
-   syscall(pi[0]+__NR_write, pi[0], pc[0], pi[0]+1);
+   char** pc = malloc(sizeof(char*));
+   char*  s0 = pc[0];
 
-   return 0;
+   // All __NR_xxx numbers are taken from x86
+   
+   // __NR_exit 1 
+   // (see below)
+
+   // __NR_fork 2
+
+   // __NR_read 3 --> sys_read()
+   // Nb: here we are also getting an error from the syscall arg itself.
+   GO("__NR_read, 1+3 scalar errors");
+   syscall(i0+__NR_read, i0, s0, i0);
+
+   // __NR_write 4 --> sys_write()
+   GO("__NR_write, 3 scalar errors, 1 memory error");
+   syscall(__NR_write, i0, s0, i0+1);
+
+   // __NR_open 5
+   GO("__NR_open(2), 2 scalar errors, 1 memory error");
+   syscall(__NR_open, s0, i0, i0+1);
+
+   GO("__NR_open(3), 1 scalar error");
+   syscall(__NR_open, "tmp_write_file_foo", O_CREAT, i0);
+
+   // __NR_close 6
+   // __NR_waitpid 7
+   // __NR_creat 8
+   // __NR_link 9
+   // __NR_unlink 10
+   // __NR_execve 11
+   // __NR_chdir 12
+   // __NR_time 13
+   // __NR_mknod 14
+   // __NR_chmod 15
+   // __NR_lchown 16
+   // __NR_break 17
+   // __NR_oldstat 18
+   // __NR_lseek 19
+   // __NR_getpid 20
+   // __NR_mount 21
+   // __NR_umount 22
+   // __NR_setuid 23
+   // __NR_getuid 24
+   // __NR_stime 25
+   // __NR_ptrace 26
+   // __NR_alarm 27
+   // __NR_oldfstat 28
+   // __NR_pause 29
+   // __NR_utime 30
+   // __NR_stty 31
+   // __NR_gtty 32
+   // __NR_access 33
+   // __NR_nice 34
+   // __NR_ftime 35
+   // __NR_sync 36
+   // __NR_kill 37
+   // __NR_rename 38
+   // __NR_mkdir 39
+   // __NR_rmdir 40
+   // __NR_dup 41
+   // __NR_pipe 42
+   // __NR_times 43
+   // __NR_prof 44
+   // __NR_brk 45
+   // __NR_setgid 46
+   // __NR_getgid 47
+   // __NR_signal 48
+   // __NR_geteuid 49
+   // __NR_getegid 50
+   // __NR_acct 51
+   // __NR_umount2 52
+   // __NR_lock 53
+   // __NR_ioctl 54
+   // __NR_fcntl 55
+   // __NR_mpx 56
+   // __NR_setpgid 57
+   // __NR_ulimit 58
+   // __NR_oldolduname 59
+   // __NR_umask 60
+   // __NR_chroot 61
+   // __NR_ustat 62
+   // __NR_dup2 63
+   // __NR_getppid 64
+   // __NR_getpgrp 65
+   // __NR_setsid 66
+   // __NR_sigaction 67
+   // __NR_sgetmask 68
+   // __NR_ssetmask 69
+   // __NR_setreuid 70
+   // __NR_setregid 71
+   // __NR_sigsuspend 72
+   // __NR_sigpending 73
+   // __NR_sethostname 74
+   // __NR_setrlimit 75
+   // __NR_getrlimit 76	/* Back compatible 2Gig limited rlimit */
+   // __NR_getrusage 77
+   // __NR_gettimeofday 78
+   // __NR_settimeofday 79
+   // __NR_getgroups 80
+   // __NR_setgroups 81
+   // __NR_select 82
+   // __NR_symlink 83
+   // __NR_oldlstat 84
+   // __NR_readlink 85
+   // __NR_uselib 86
+   // __NR_swapon 87
+   // __NR_reboot 88
+   // __NR_readdir 89
+   // __NR_mmap 90
+   // __NR_munmap 91
+   // __NR_truncate 92
+   // __NR_ftruncate 93
+   // __NR_fchmod 94
+   // __NR_fchown 95
+   // __NR_getpriority 96
+   // __NR_setpriority 97
+   // __NR_profil 98
+   // __NR_statfs 99
+   // __NR_fstatfs 100
+   // __NR_ioperm 101
+   // __NR_socketcall 102
+   // __NR_syslog 103
+   // __NR_setitimer 104
+   // __NR_getitimer 105
+   // __NR_stat 106
+   // __NR_lstat 107
+   // __NR_fstat 108
+   // __NR_olduname 109
+   // __NR_iopl 110
+   // __NR_vhangup 111
+   // __NR_idle 112
+   // __NR_vm86old 113
+   // __NR_wait4 114
+   // __NR_swapoff 115
+   // __NR_sysinfo 116
+   // __NR_ipc 117
+   // __NR_fsync 118
+   // __NR_sigreturn 119
+   // __NR_clone 120
+   // __NR_setdomainname 121
+   // __NR_uname 122
+   // __NR_modify_ldt 123
+   // __NR_adjtimex 124
+   // __NR_mprotect 125
+   // __NR_sigprocmask 126
+   // __NR_create_module 127
+   // __NR_init_module 128
+   // __NR_delete_module 129
+   // __NR_get_kernel_syms 130
+   // __NR_quotactl 131
+   // __NR_getpgid 132
+   // __NR_fchdir 133
+   // __NR_bdflush 134
+   // __NR_sysfs 135
+   // __NR_personality 136
+   // __NR_afs_syscall 137 /* Syscall for Andrew File System */
+   // __NR_setfsuid 138
+   // __NR_setfsgid 139
+   // __NR__llseek 140
+   // __NR_getdents 141
+   // __NR__newselect 142
+   // __NR_flock 143
+   // __NR_msync 144
+   // __NR_readv 145
+   // __NR_writev 146
+   // __NR_getsid 147
+   // __NR_fdatasync 148
+   // __NR__sysctl 149
+   // __NR_mlock 150
+   // __NR_munlock 151
+   // __NR_mlockall 152
+   // __NR_munlockall 153
+   // __NR_sched_setparam 154
+   // __NR_sched_getparam 155
+   // __NR_sched_setscheduler 156
+   // __NR_sched_getscheduler 157
+   // __NR_sched_yield 158
+   // __NR_sched_get_priority_max 159
+   // __NR_sched_get_priority_min 160
+   // __NR_sched_rr_get_interval 161
+   // __NR_nanosleep 162
+   // __NR_mremap 163
+   // __NR_setresuid 164
+   // __NR_getresuid 165
+   // __NR_vm86 166
+   // __NR_query_module 167
+   // __NR_poll 168
+   // __NR_nfsservctl 169
+   // __NR_setresgid 170
+   // __NR_getresgid 171
+   // __NR_prctl              172
+   // __NR_rt_sigreturn 173
+   // __NR_rt_sigaction 174
+   // __NR_rt_sigprocmask 175
+   // __NR_rt_sigpending 176
+   // __NR_rt_sigtimedwait 177
+   // __NR_rt_sigqueueinfo 178
+   // __NR_rt_sigsuspend 179
+   // __NR_pread64 180
+   // __NR_pwrite64 181
+   // __NR_chown 182
+   // __NR_getcwd 183
+   // __NR_capget 184
+   // __NR_capset 185
+   // __NR_sigaltstack 186
+   // __NR_sendfile 187
+   // __NR_getpmsg 188 /* some people actually want streams */
+   // __NR_putpmsg 189 /* some people actually want streams */
+   // __NR_vfork 190
+   // __NR_ugetrlimit 191 /* SuS compliant getrlimit */
+   // __NR_mmap2 192
+   // __NR_truncate64 193
+   // __NR_ftruncate64 194
+   // __NR_stat64 195
+   // __NR_lstat64 196
+   // __NR_fstat64 197
+   // __NR_lchown32 198
+   // __NR_getuid32 199
+   // __NR_getgid32 200
+   // __NR_geteuid32 201
+   // __NR_getegid32 202
+   // __NR_setreuid32 203
+   // __NR_setregid32 204
+   // __NR_getgroups32 205
+   // __NR_setgroups32 206
+   // __NR_fchown32 207
+   // __NR_setresuid32 208
+   // __NR_getresuid32 209
+   // __NR_setresgid32 210
+   // __NR_getresgid32 211
+   // __NR_chown32 212
+   // __NR_setuid32 213
+   // __NR_setgid32 214
+   // __NR_setfsuid32 215
+   // __NR_setfsgid32 216
+   // __NR_pivot_root 217
+   // __NR_mincore 218
+   // __NR_madvise 219
+   // __NR_madvise1 219 /* delete when C lib stub is removed */
+   // __NR_getdents64 220
+   // __NR_fcntl64 221
+/* 223 is unused */
+   // __NR_gettid 224
+   // __NR_readahead 225
+   // __NR_setxattr 226
+   // __NR_lsetxattr 227
+   // __NR_fsetxattr 228
+   // __NR_getxattr 229
+   // __NR_lgetxattr 230
+   // __NR_fgetxattr 231
+   // __NR_listxattr 232
+   // __NR_llistxattr 233
+   // __NR_flistxattr 234
+   // __NR_removexattr 235
+   // __NR_lremovexattr 236
+   // __NR_fremovexattr 237
+   // __NR_tkill 238
+   // __NR_sendfile64 239
+   // __NR_futex 240
+   // __NR_sched_setaffinity 241
+   // __NR_sched_getaffinity 242
+   // __NR_set_thread_area 243
+   // __NR_get_thread_area 244
+   // __NR_io_setup 245
+   // __NR_io_destroy 246
+   // __NR_io_getevents 247
+   // __NR_io_submit 248
+   // __NR_io_cancel 249
+   // __NR_fadvise64 250
+
+   // __NR_exit_group 252
+   // __NR_lookup_dcookie 253
+   // __NR_epoll_create 254
+   // __NR_epoll_ctl 255
+   // __NR_epoll_wait 256
+   // __NR_remap_file_pages 257
+   // __NR_set_tid_address 258
+   // __NR_timer_create 259
+   // __NR_timer_settime (__NR_timer_create+1)
+   // __NR_timer_gettime (__NR_timer_create+2)
+   // __NR_timer_getoverrun (__NR_timer_create+3)
+   // __NR_timer_delete (__NR_timer_create+4)
+   // __NR_clock_settime (__NR_timer_create+5)
+   // __NR_clock_gettime (__NR_timer_create+6)
+   // __NR_clock_getres (__NR_timer_create+7)
+   // __NR_clock_nanosleep (__NR_timer_create+8)
+   // __NR_statfs64 268
+   // __NR_fstatfs64 269
+   // __NR_tgkill 270
+   // __NR_utimes 271
+   // __NR_fadvise64_64 272
+   // __NR_vserver 273
+   // __NR_mbind 274
+   // __NR_get_mempolicy 275
+   // __NR_set_mempolicy 276
+   // __NR_mq_open  277
+   // __NR_mq_unlink (__NR_mq_open+1)
+   // __NR_mq_timedsend (__NR_mq_open+2)
+   // __NR_mq_timedreceive (__NR_mq_open+3)
+   // __NR_mq_notify (__NR_mq_open+4)
+   // __NR_mq_getsetattr (__NR_mq_open+5)
+   // __NR_sys_kexec_load 283
+
+   // __NR_exit 1 --> sys_exit() 
+   GO("__NR_exit, 1 scalar error");
+   syscall(__NR_exit, i0);
+
+   assert(0);
 }
 
diff --git a/memcheck/tests/scalar.stderr.exp b/memcheck/tests/scalar.stderr.exp
index b5ea4c8..8824d19 100644
--- a/memcheck/tests/scalar.stderr.exp
+++ b/memcheck/tests/scalar.stderr.exp
@@ -1,8 +1,25 @@
+---------- __NR_read, 1+3 scalar errors ----------
 Syscall param (syscallno) contains uninitialised byte(s)
    at 0x........: syscall (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
 
+Syscall param read(fd) contains uninitialised byte(s)
+   at 0x........: syscall (in /...libc...)
+   by 0x........: __libc_start_main (...libc...)
+   by 0x........: ...
+
+Syscall param read(buf) contains uninitialised byte(s)
+   at 0x........: syscall (in /...libc...)
+   by 0x........: __libc_start_main (...libc...)
+   by 0x........: ...
+
+Syscall param read(count) contains uninitialised byte(s)
+   at 0x........: syscall (in /...libc...)
+   by 0x........: __libc_start_main (...libc...)
+   by 0x........: ...
+---------- __NR_write, 3 scalar errors, 1 memory error ----------
+
 Syscall param write(fd) contains uninitialised byte(s)
    at 0x........: syscall (in /...libc...)
    by 0x........: __libc_start_main (...libc...)
@@ -23,3 +40,32 @@
    by 0x........: __libc_start_main (...libc...)
    by 0x........: ...
  Address 0x........ is not stack'd, malloc'd or (recently) free'd
+---------- __NR_open(2), 2 scalar errors, 1 memory error ----------
+
+Syscall param open(filename) contains uninitialised byte(s)
+   at 0x........: syscall (in /...libc...)
+   by 0x........: __libc_start_main (...libc...)
+   by 0x........: ...
+
+Syscall param open(flags) contains uninitialised byte(s)
+   at 0x........: syscall (in /...libc...)
+   by 0x........: __libc_start_main (...libc...)
+   by 0x........: ...
+
+Syscall param open(filename) 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
+---------- __NR_open(3), 1 scalar error ----------
+
+Syscall param open(mode) contains uninitialised byte(s)
+   at 0x........: syscall (in /...libc...)
+   by 0x........: __libc_start_main (...libc...)
+   by 0x........: ...
+---------- __NR_exit, 1 scalar error ----------
+
+Syscall param exit(error_code) contains uninitialised byte(s)
+   at 0x........: syscall (in /...libc...)
+   by 0x........: __libc_start_main (...libc...)
+   by 0x........: ...
diff --git a/memcheck/tests/scalar.vgtest b/memcheck/tests/scalar.vgtest
index c1e0088..964ef59 100644
--- a/memcheck/tests/scalar.vgtest
+++ b/memcheck/tests/scalar.vgtest
@@ -1,2 +1,3 @@
 prog: scalar
 vgopts: -q
+delete: tmp_write_file_foo
diff --git a/memcheck/tests/scalar_supp.c b/memcheck/tests/scalar_supp.c
new file mode 100644
index 0000000..440f382
--- /dev/null
+++ b/memcheck/tests/scalar_supp.c
@@ -0,0 +1,22 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+int main(void)
+{
+   // uninitialised, but we know pi[0] is 0x0
+   int* pi  = malloc(sizeof(int));
+
+   // uninitialised, but we know pc[0] points to 0x0
+   char** pc  = malloc(sizeof(char*));
+   
+   // Five errors:  
+   // - the syscall number itself is undefined (but we know it's
+   //   0 + __NR_write :)
+   // - each of the scalar args are undefined
+   // - the 2nd arg points to unaddressable memory.
+   syscall(pi[0]+__NR_write, pi[0], pc[0], pi[0]+1);
+
+   return 0;
+}
+
diff --git a/memcheck/tests/scalar_supp.vgtest b/memcheck/tests/scalar_supp.vgtest
index d3d85a7..c060275 100644
--- a/memcheck/tests/scalar_supp.vgtest
+++ b/memcheck/tests/scalar_supp.vgtest
@@ -1,2 +1,2 @@
-prog: scalar
+prog: scalar_supp
 vgopts: -q --suppressions=scalar.supp