浏览代码

[bugfix] Use of REGISTER_TYPE in override_write tests and intptr_t in sslist tests

B Thibault 9 年之前
父节点
当前提交
613a28126f
共有 3 个文件被更改,包括 36 次插入43 次删除
  1. 5 5
      test/common.h
  2. 1 1
      test/sllist/main.c
  3. 30 37
      test/write/main.c

+ 5 - 5
test/common.h

@@ -5,15 +5,15 @@
 #include <stdio.h>
 #include "sandbox.h"
 
-#define _assertTrue(a) { int _a = (int) a; if(!_a) { fprintf(stderr, "File %s, line %d: fail asserting %d as true\n", __FILE__, __LINE__, _a); return -1; }}
+#define _assertTrue(a) { REGISTER_TYPE _a = (REGISTER_TYPE) a; if(!_a) { fprintf(stderr, "File %s, line %d: fail asserting %lld as true\n", __FILE__, __LINE__, (long long int) _a); return -1; }}
 
-#define _assertNotNull(a) { unsigned long long int _a = (unsigned long long int) a; if(!_a) { fprintf(stderr, "File %s, line %d: fail asserting 0x%llx not null\n", __FILE__, __LINE__, _a); return -1; }}
+#define _assertNotNull(a) { REGISTER_TYPE _a = (REGISTER_TYPE) a; if(!_a) { fprintf(stderr, "File %s, line %d: fail asserting 0x%llx not null\n", __FILE__, __LINE__, (long long int)_a); return -1; }}
 
-#define _assertNull(a) { unsigned long long int _a = (unsigned long long int) a; if(_a) { fprintf(stderr, "File %s, line %d: fail asserting 0x%llx null\n", __FILE__, __LINE__, _a); return -1; }}
+#define _assertNull(a) { REGISTER_TYPE _a = (REGISTER_TYPE) a; if(_a) { fprintf(stderr, "File %s, line %d: fail asserting 0x%llx null\n", __FILE__, __LINE__, (long long int) _a); return -1; }}
 
-#define _assertEqual(a, b) { long long int _a = (long long int) a; long long int _b = (long long int) b; if(_a != _b) { fprintf(stderr, "File %s, line %d: fail asserting %lld equals %lld\n", __FILE__, __LINE__, _a, _b); return -1; }}
+#define _assertEqual(a, b) { REGISTER_TYPE _a = (REGISTER_TYPE) a; REGISTER_TYPE _b = (REGISTER_TYPE) b; if(_a != _b) { fprintf(stderr, "File %s, line %d: fail asserting %lld equals %lld\n", __FILE__, __LINE__, (long long int) _a, (long long int) _b); return -1; }}
 
-#define _assertDiff(a, b) { long long int _a = (long long int) a; long long int _b = (long long int) b; if(_a == _b) { fprintf(stderr, "File %s, line %d: fail asserting %lld is different than %lld\n", __FILE__, __LINE__, _a, _b); return -1; }}
+#define _assertDiff(a, b) { REGISTER_TYPE _a = (REGISTER_TYPE) a; REGISTER_TYPE _b = (REGISTER_TYPE) b; if(_a == _b) { fprintf(stderr, "File %s, line %d: fail asserting %lld is different than %lld\n", __FILE__, __LINE__, (long long int) _a, (long long int )_b); return -1; }}
 
 void tests_init_env(struct s_sandboxenv *env, t_param *params);
 void tests_release_env(struct s_sandboxenv *env, t_param *params);

+ 1 - 1
test/sllist/main.c

@@ -21,7 +21,7 @@ static inline int add1_fnc(void **_i, void *nullable)
 
 static inline int test_add()
 {
-	unsigned long long i;
+	intptr_t i;
 
 	sl_list *a = sllist_create();
 	_assertNotNull(a);

+ 30 - 37
test/write/main.c

@@ -9,30 +9,36 @@
     _assertEqual(sllist_count(a), 0);
 */
 
-int fakeread(int fd, char *buf, int buflen, struct s_sandboxenv *env)
+void setArgs(struct s_sandboxenv *env, REGISTER_TYPE sysno, REGISTER_TYPE p1, REGISTER_TYPE p2, REGISTER_TYPE p3)
 {
 #ifdef __x86_64__
-    env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_read;
-    env->syscall_args[0] = env->registers.rdi = (REGISTER_TYPE) fd;
-    env->syscall_args[1] = env->registers.rsi = (REGISTER_TYPE) buf;
-    env->syscall_args[2] = env->registers.rdx = (REGISTER_TYPE) buflen;
+    env->syscall_no.syscall_no = env->registers.orig_rax = sysno;
+    env->syscall_args[0] = env->registers.rdi = p1;
+    env->syscall_args[1] = env->registers.rsi = p2;
+    env->syscall_args[2] = env->registers.rdx = p3;
 #else
-# error "non-x86 unsupported"
+    env->syscall_no.syscall_no = env->registers.orig_eax = sysno;
+    env->syscall_args[0] = env->registers.ebx = p1;
+    env->syscall_args[1] = env->registers.ecx = p2;
+    env->syscall_args[2] = env->registers.edx = p3;
 #endif
+}
+
+void setResult(struct s_sandboxenv *env, REGISTER_TYPE result)
+{
+    env->syscall_no.syscall_return = result;
+}
+
+int fakeread(int fd, char *buf, int buflen, struct s_sandboxenv *env)
+{
+    setArgs(env, (REGISTER_TYPE) __NR_read, (REGISTER_TYPE) fd, (REGISTER_TYPE) buf, (REGISTER_TYPE) buflen);
     ovr_read(env);
     return fd;
 }
 
 int fakelseek(int fd, off_t offset, int whence, struct s_sandboxenv *env)
 {
-#ifdef __x86_64__
-    env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_lseek;
-    env->syscall_args[0] = env->registers.rdi = (REGISTER_TYPE) fd;
-    env->syscall_args[1] = env->registers.rsi = (REGISTER_TYPE) offset;
-    env->syscall_args[2] = env->registers.rdx = (REGISTER_TYPE) whence;
-#else
-# error "non-x86 unsupported"
-#endif
+    setArgs(env, (REGISTER_TYPE) __NR_lseek, (REGISTER_TYPE) fd, (REGISTER_TYPE) offset, (REGISTER_TYPE) whence);
     ovr_lseek(env);
     return fd;
 }
@@ -40,45 +46,32 @@ int fakelseek(int fd, off_t offset, int whence, struct s_sandboxenv *env)
 int fakeopen(const char *path, int flags, int mod, struct s_sandboxenv *env)
 {
     int fd;
-#ifdef __x86_64__
-    env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_open;
-    env->syscall_no.syscall_return = fd = open(path, flags, mod);
-    env->syscall_args[0] = env->registers.rdi = (REGISTER_TYPE) path;
-    env->syscall_args[1] = env->registers.rsi = flags;
-    env->syscall_args[2] = env->registers.rdx = mod;
-#else
-# error "non-x86 unsupported"
-#endif
+    setArgs(env, (REGISTER_TYPE) __NR_open, (REGISTER_TYPE) path, (REGISTER_TYPE) flags, (REGISTER_TYPE) mod);
+    setResult(env, (fd = open(path, flags, mod)));
     ovr_open(env);
     return fd;
 }
 
 int fakeclose(int fd, struct s_sandboxenv *env)
 {
-#ifdef __x86_64__
-    env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_close;
-    env->syscall_args[0] = env->registers.rdi = fd;
-#else
-# error "non-x86 unsupported"
-#endif
+    setArgs(env, (REGISTER_TYPE) __NR_close, (REGISTER_TYPE) fd, 0, 0);
     ovr_close(env);
     return fd;
 }
 
 int fakewrite(int fd, char *buf, int len, struct s_sandboxenv *env)
 {
-#ifdef __x86_64__
-    env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_write;
-    env->syscall_args[0] = env->registers.rdi = fd;
-    env->syscall_args[1] = env->registers.rsi = (REGISTER_TYPE) buf;
-    env->syscall_args[2] = env->registers.rdx = len;
-#else
-# error "non-x86 unsupported"
-#endif
+    setArgs(env, (REGISTER_TYPE) __NR_write, (REGISTER_TYPE) fd, (REGISTER_TYPE) buf, (REGISTER_TYPE) len);
     ovr_write(env);
+#ifdef __x86_64__
     if (env->registers.orig_rax == __NR_write)
         env->registers.rax = write(fd, buf, len);
     return env->registers.rax;
+#else
+    if (env->registers.orig_eax == __NR_write)
+        env->registers.eax = write(fd, buf, len);
+    return env->registers.eax;
+#endif
 }