Pārlūkot izejas kodu

[add] write 32b opturation
[wip] override write

isundil 9 gadi atpakaļ
vecāks
revīzija
afb3dd1d50
6 mainītis faili ar 43 papildinājumiem un 22 dzēšanām
  1. 2 2
      CMakeLists.txt
  2. 5 1
      README.md
  3. 7 11
      src/ovr_syscall/ovr_write.c
  4. 22 0
      src/registers.c
  5. 2 8
      src/sandbox.c
  6. 5 0
      src/sandbox.h

+ 2 - 2
CMakeLists.txt

@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 2.8)
 
 add_library(sllist STATIC lib/sllist/src/create.c lib/sllist/src/add.c lib/sllist/src/at.c lib/sllist/src/del.c lib/sllist/src/find.c lib/sllist/src/remove.c)
-add_executable(sandbox src/main.c src/mem.c src/apply.c src/apply_fs.c src/exec.c src/param.c src/sandbox.c src/environment.c src/pathutil.c
+add_executable(sandbox src/main.c src/mem.c src/apply.c src/apply_fs.c src/exec.c src/param.c src/registers.c src/sandbox.c src/environment.c src/pathutil.c
 	src/ovr_syscall/ovr_write.c src/ovr_syscall/ovr_open.c src/ovr_syscall/ovr_close.c src/ovr_syscall/ovr_lseek.c src/ovr_syscall/ovr_read.c)
 
 set_property(TARGET sandbox PROPERTY RUNTIME_OUTPUT_DIRECTORY bin)
@@ -18,7 +18,7 @@ add_executable(test_sllist test/sllist/main.c)
 set_property(TARGET test_sllist PROPERTY RUNTIME_OUTPUT_DIRECTORY test/bin)
 target_link_libraries(test_sllist sllist)
 
-add_executable(test_write test/write/main.c test/write/functions.c src/ovr_syscall/ovr_close.c src/ovr_syscall/ovr_open.c src/ovr_syscall/ovr_write.c src/ovr_syscall/ovr_lseek.c src/ovr_syscall/ovr_read.c src/pathutil.c)
+add_executable(test_write test/write/main.c test/write/functions.c src/ovr_syscall/ovr_close.c src/ovr_syscall/ovr_open.c src/ovr_syscall/ovr_write.c src/ovr_syscall/ovr_lseek.c src/ovr_syscall/ovr_read.c src/pathutil.c src/registers.c)
 set_property(TARGET test_write PROPERTY RUNTIME_OUTPUT_DIRECTORY test/bin)
 target_link_libraries(test_write sllist)
 

+ 5 - 1
README.md

@@ -1,6 +1,10 @@
 | 64 bits build | 32 bits build |
 | :---: | :---: |
-| [![Build Status](http://b64.jenkins.knacki.info/job/sandbox/badge/icon)](http://b64.jenkins.knacki.info/job/sandbox/) | [![Build Status](http://b32.jenkins.knacki.info/job/sandbox/badge/icon)](http://b32.jenkins.knacki.info/job/sandbox/) |
+| [![Build Status](http://b64.jenkins.knacki.info/job/sandbox/badge/icon)](http://b64.jenkins.knacki.info/job/sandbox/)
+[Build](http://b64.jenkins.knacki.info/job/sandbox/lastBuild/console)
+| [![Build Status](http://b32.jenkins.knacki.info/job/sandbox/badge/icon)](http://b32.jenkins.knacki.info/job/sandbox/)
+[Build](http://b32.jenkins.knacki.info/job/sandbox/lastBuild/console)
+|
 
 # sandbox
 

+ 7 - 11
src/ovr_syscall/ovr_write.c

@@ -23,23 +23,19 @@ int ovr_write(struct s_sandboxenv *env)
     printf("DO WRITE ! ([%s], [%s], [%d])\n", file->filename, buf, buflen);
     fflush(stdout);
     result = write(file->local_fd, buf, buflen);
-#ifdef __x86_64__
-    env->registers.orig_rax = -1;
-    env->syscall_no.syscall_return = env->registers.rax = (REGISTER_TYPE) result;
-#else
-# error 32B
-#endif
-    if (result == -1)
+    registerSetResult(env, result);
+    page = malloc(sizeof(*page));
+    free(buf);
+    if (result == -1 || page == NULL)
     {
-        fprintf(stderr, "Cannot write: %s\n", strerror(errno));
-        return;
+        if (env->errorOutput)
+            fprintf(env->errorOutput, "Cannot write: %s\n", strerror(errno));
+        return 0;
     }
-    page = malloc(sizeof(*page));
     page->len = result;
     page->offset_start = _fd->offset;
     _fd->offset += result;
     sllist_pushback(file->modif_write, page);
-    free(buf);
     return 0;
 }
 

+ 22 - 0
src/registers.c

@@ -0,0 +1,22 @@
+#include <strings.h>
+#include "sandbox.h"
+
+void init_syscalls(struct s_sandboxenv *env)
+{
+	bzero(env->functions, sizeof(*(env->functions)) * NR_syscalls);
+	env->functions[__NR_write] = ovr_write;
+	env->functions[__NR_open] = ovr_open;
+	env->functions[__NR_close] = ovr_close;
+}
+
+void registerSetResult(struct s_sandboxenv *env, REGISTER_TYPE result)
+{
+#ifdef __x86_64__
+    env->registers.orig_rax = -1;
+    env->syscall_no.syscall_return = env->registers.rax = (REGISTER_TYPE) result;
+#else
+    env->registers.orig_eax = -1;
+    env->syscall_no.syscall_return = env->registers.eax = (REGISTER_TYPE) result;
+#endif
+}
+

+ 2 - 8
src/sandbox.c

@@ -12,14 +12,6 @@ static inline void get_args(struct s_sandboxenv *env)
 {
 }
 
-static inline void init_syscalls(struct s_sandboxenv *env)
-{
-	bzero(env->functions, sizeof(*(env->functions)) * NR_syscalls);
-	env->functions[__NR_write] = ovr_write;
-	env->functions[__NR_open] = ovr_open;
-	env->functions[__NR_close] = ovr_close;
-}
-
 int waitForSyscall(const int pid, int _status)
 {
 	int status;
@@ -78,6 +70,8 @@ void doTrace(int pid, const t_param *params)
 	waitpid(pid, &status, 0);
 	sandbox_env.params = params;
 	sandbox_env.child_pid = pid;
+    //TODO get error output from command-line
+    sandbox_env.errorOutput = stderr;
 	sandbox_env.filetable = sllist_create();
 	init_syscalls(&sandbox_env);
 

+ 5 - 0
src/sandbox.h

@@ -62,6 +62,7 @@ struct s_sandboxenv {
     struct { REGISTER_TYPE syscall_no; REGISTER_TYPE syscall_return; } syscall_no; 
     sl_list *filetable;
     REGISTER_TYPE syscall_args[6];
+    FILE *errorOutput;
 };
 
 /* params.c */
@@ -103,6 +104,10 @@ int release_file(void **t_fileinfo, void *env);
 void prompt_sandbox(struct s_sandboxenv *env);
 void apply_fs(struct s_sandboxenv *env);
 
+/* registers.c */
+void init_syscalls(struct s_sandboxenv *);
+void registerSetResult(struct s_sandboxenv *, REGISTER_TYPE);
+
 # include "sandbox_syscall.h"
 
 #endif /* SANDBOX_H__ */