|
|
@@ -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
|
|
|
}
|
|
|
|
|
|
|