about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2019-03-26 15:46:07 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2019-03-27 12:30:46 +0100
commit31d03710ab858a2b1023c1fc372d08076256e301 (patch)
tree290762625a2ff131a05ae9a0a49863108816cb2b
parent89a31947780bb584d8d082817fc77be5c30097af (diff)
downloadfocaccia-miasm-31d03710ab858a2b1023c1fc372d08076256e301.tar.gz
focaccia-miasm-31d03710ab858a2b1023c1fc372d08076256e301.zip
Jitter: size_t for mem read/write
-rw-r--r--miasm/jitter/JitCore.c2
-rw-r--r--miasm/jitter/arch/JitCore_aarch64.c13
-rw-r--r--miasm/jitter/arch/JitCore_arm.c13
-rw-r--r--miasm/jitter/arch/JitCore_mep.c13
-rw-r--r--miasm/jitter/arch/JitCore_mips32.c16
-rw-r--r--miasm/jitter/arch/JitCore_msp430.c14
-rw-r--r--miasm/jitter/arch/JitCore_ppc32.c13
-rw-r--r--miasm/jitter/arch/JitCore_x86.c9
-rw-r--r--miasm/jitter/vm_mngr.c19
-rw-r--r--miasm/jitter/vm_mngr.h4
-rw-r--r--miasm/jitter/vm_mngr_py.c11
11 files changed, 73 insertions, 54 deletions
diff --git a/miasm/jitter/JitCore.c b/miasm/jitter/JitCore.c
index 012a53c4..37b69aa3 100644
--- a/miasm/jitter/JitCore.c
+++ b/miasm/jitter/JitCore.c
@@ -254,7 +254,7 @@ PyObject* vm_get_mem(JitCpu *self, PyObject* args)
        }
        size_st = (size_t)size;
 
-       ret = vm_read_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, &buf_out, size);
+       ret = vm_read_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, &buf_out, size_st);
        if (ret < 0) {
 	       PyErr_SetString(PyExc_RuntimeError, "cannot find address");
 	       return NULL;
diff --git a/miasm/jitter/arch/JitCore_aarch64.c b/miasm/jitter/arch/JitCore_aarch64.c
index 2edca4e2..98090cd0 100644
--- a/miasm/jitter/arch/JitCore_aarch64.c
+++ b/miasm/jitter/arch/JitCore_aarch64.c
@@ -234,7 +234,7 @@ PyObject* cpu_get_exception(JitCpu* self, PyObject* args)
 
 
 
-void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size)
+void check_automod(JitCpu* jitcpu, uint64_t addr, size_t size)
 {
 	PyObject *result;
 
@@ -277,7 +277,7 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        Py_ssize_t py_length;
 
        char * buffer;
-       uint64_t size;
+       Py_ssize_t pysize;
        uint64_t addr;
        int ret;
 
@@ -289,13 +289,16 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        if(!PyBytes_Check(py_buffer))
 	       RAISE(PyExc_TypeError,"arg must be bytes");
 
-       size = PyBytes_Size(py_buffer);
+       pysize = PyBytes_Size(py_buffer);
+       if (pysize < 0) {
+	       RAISE(PyExc_TypeError,"Python error");
+       }
        PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size);
+       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, pysize);
        if (ret < 0)
 	       RAISE(PyExc_TypeError,"arg must be str");
-       check_automod(self, addr, size*8);
+       check_automod(self, addr, (size_t)pysize);
 
        Py_INCREF(Py_None);
        return Py_None;
diff --git a/miasm/jitter/arch/JitCore_arm.c b/miasm/jitter/arch/JitCore_arm.c
index 1ce1cf47..90c95352 100644
--- a/miasm/jitter/arch/JitCore_arm.c
+++ b/miasm/jitter/arch/JitCore_arm.c
@@ -188,7 +188,7 @@ PyObject* cpu_get_exception(JitCpu* self, PyObject* args)
 
 
 
-void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size)
+void check_automod(JitCpu* jitcpu, uint64_t addr, size_t size)
 {
 	PyObject *result;
 
@@ -230,7 +230,7 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        Py_ssize_t py_length;
 
        char * buffer;
-       uint64_t size;
+       Py_ssize_t pysize;
        uint64_t addr;
        int ret;
 
@@ -242,13 +242,16 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        if(!PyBytes_Check(py_buffer))
 	       RAISE(PyExc_TypeError,"arg must be bytes");
 
-       size = PyBytes_Size(py_buffer);
+       pysize = PyBytes_Size(py_buffer);
+       if (pysize < 0) {
+	       RAISE(PyExc_TypeError,"Python error");
+       }
        PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size);
+       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, pysize);
        if (ret < 0)
 	       RAISE(PyExc_TypeError,"arg must be str");
-       check_automod(self, addr, size*8);
+       check_automod(self, addr, (size_t)pysize);
 
        Py_INCREF(Py_None);
        return Py_None;
diff --git a/miasm/jitter/arch/JitCore_mep.c b/miasm/jitter/arch/JitCore_mep.c
index a572f3e9..3c98f2dc 100644
--- a/miasm/jitter/arch/JitCore_mep.c
+++ b/miasm/jitter/arch/JitCore_mep.c
@@ -248,7 +248,7 @@ PyObject* cpu_get_exception(JitCpu* self, PyObject* args)
     return PyLong_FromUnsignedLongLong((uint64_t)(((struct vm_cpu*)self->cpu)->exception_flags));
 }
 
-void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size)
+void check_automod(JitCpu* jitcpu, uint64_t addr, size_t size)
 {
     PyObject *result;
 
@@ -291,7 +291,7 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        Py_ssize_t py_length;
 
        char * buffer;
-       uint64_t size;
+       Py_ssize_t pysize;
        uint64_t addr;
        int ret = 0x1337;
 
@@ -303,13 +303,16 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        if(!PyBytes_Check(py_buffer))
 	   RAISE(PyExc_TypeError,"arg must be bytes");
 
-       size = PyBytes_Size(py_buffer);
+       pysize = PyBytes_Size(py_buffer);
+       if (pysize < 0) {
+	       RAISE(PyExc_TypeError,"Python error");
+       }
        PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size);
+       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, pysize);
        if (ret < 0)
 	   RAISE(PyExc_TypeError,"arg must be str");
-       check_automod(self, addr, size*8);
+       check_automod(self, addr, (size_t)pysize);
 
        Py_INCREF(Py_None);
        return Py_None;
diff --git a/miasm/jitter/arch/JitCore_mips32.c b/miasm/jitter/arch/JitCore_mips32.c
index 9bb3ab99..e8f95e5f 100644
--- a/miasm/jitter/arch/JitCore_mips32.c
+++ b/miasm/jitter/arch/JitCore_mips32.c
@@ -211,7 +211,7 @@ PyObject* cpu_get_exception(JitCpu* self, PyObject* args)
 
 
 
-void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size)
+void check_automod(JitCpu* jitcpu, uint64_t addr, size_t size)
 {
 	PyObject *result;
 
@@ -255,7 +255,7 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        Py_ssize_t py_length;
 
        char * buffer;
-       uint64_t size;
+       Py_ssize_t pysize;
        uint64_t addr;
        int ret;
 
@@ -264,16 +264,20 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
 
        PyGetInt_uint64_t(py_addr, addr);
 
-       if(!PyBytes_Check(py_buffer))
+       if (!PyBytes_Check(py_buffer))
 	       RAISE(PyExc_TypeError,"arg must be bytes");
 
-       size = PyBytes_Size(py_buffer);
+       pysize = PyBytes_Size(py_buffer);
+       if (pysize < 0) {
+	       RAISE(PyExc_TypeError,"Python error");
+       }
+
        PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size);
+       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, pysize);
        if (ret < 0)
 	       RAISE(PyExc_TypeError,"arg must be str");
-       check_automod(self, addr, size*8);
+       check_automod(self, addr, (size_t)pysize);
 
        Py_INCREF(Py_None);
        return Py_None;
diff --git a/miasm/jitter/arch/JitCore_msp430.c b/miasm/jitter/arch/JitCore_msp430.c
index 5279c69b..b9b690ae 100644
--- a/miasm/jitter/arch/JitCore_msp430.c
+++ b/miasm/jitter/arch/JitCore_msp430.c
@@ -187,7 +187,7 @@ PyObject* cpu_get_exception(JitCpu* self, PyObject* args)
 
 
 
-void check_automod(JitCpu* jitcpu, uint64_t addr, uint64_t size)
+void check_automod(JitCpu* jitcpu, uint64_t addr, size_t size)
 {
 	PyObject *result;
 
@@ -230,7 +230,7 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        Py_ssize_t py_length;
 
        char * buffer;
-       uint64_t size;
+       Py_ssize_t pysize;
        uint64_t addr;
        int ret;
 
@@ -242,13 +242,17 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        if(!PyBytes_Check(py_buffer))
 	       RAISE(PyExc_TypeError,"arg must be bytes");
 
-       size = PyBytes_Size(py_buffer);
+       pysize = PyBytes_Size(py_buffer);
+       if (pysize < 0) {
+	       RAISE(PyExc_TypeError,"Python error");
+       }
+
        PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size);
+       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, pysize);
        if (ret < 0)
 	       RAISE(PyExc_TypeError,"arg must be str");
-       check_automod(self, addr, size*8);
+       check_automod(self, addr, (size_t)pysize);
 
        Py_INCREF(Py_None);
        return Py_None;
diff --git a/miasm/jitter/arch/JitCore_ppc32.c b/miasm/jitter/arch/JitCore_ppc32.c
index 8710bef5..4514de34 100644
--- a/miasm/jitter/arch/JitCore_ppc32.c
+++ b/miasm/jitter/arch/JitCore_ppc32.c
@@ -140,7 +140,7 @@ cpu_get_spr_access(JitCpu *self, PyObject *args) {
 }
 
 void
-check_automod(JitCpu *jitcpu, uint64_t addr, uint64_t size) {
+check_automod(JitCpu *jitcpu, uint64_t addr, size_t size) {
     PyObject *result;
 
     if (!(((VmMngr*)jitcpu->pyvm)->vm_mngr.exception_flags & EXCEPT_CODE_AUTOMOD))
@@ -182,7 +182,7 @@ vm_set_mem(JitCpu *self, PyObject *args) {
    Py_ssize_t py_length;
 
    char *buffer;
-   uint64_t size;
+   Py_ssize_t pysize;
    uint64_t addr;
    int ret = 0x1337;
 
@@ -194,13 +194,16 @@ vm_set_mem(JitCpu *self, PyObject *args) {
    if(!PyBytes_Check(py_buffer))
        RAISE(PyExc_TypeError,"arg must be bytes");
 
-   size = PyBytes_Size(py_buffer);
+   pysize = PyBytes_Size(py_buffer);
+   if (pysize < 0) {
+	   RAISE(PyExc_TypeError,"Python error");
+   }
    PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-   ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size);
+   ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, pysize);
    if (ret < 0)
        RAISE(PyExc_TypeError,"arg must be str");
-   check_automod(self, addr, size*8);
+   check_automod(self, addr, (size_t)pysize);
 
    Py_INCREF(Py_None);
    return Py_None;
diff --git a/miasm/jitter/arch/JitCore_x86.c b/miasm/jitter/arch/JitCore_x86.c
index f6e2d6d0..d32f4d17 100644
--- a/miasm/jitter/arch/JitCore_x86.c
+++ b/miasm/jitter/arch/JitCore_x86.c
@@ -489,7 +489,7 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        Py_ssize_t py_length;
 
        char * buffer;
-       uint64_t size;
+       Py_ssize_t pysize;
        uint64_t addr;
        int ret;
 
@@ -501,10 +501,13 @@ PyObject* vm_set_mem(JitCpu *self, PyObject* args)
        if(!PyBytes_Check(py_buffer))
 	       RAISE(PyExc_TypeError,"arg must be bytes");
 
-       size = PyBytes_Size(py_buffer);
+       pysize = PyBytes_Size(py_buffer);
+       if (pysize < 0) {
+	       RAISE(PyExc_TypeError,"Python error");
+       }
        PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, size);
+       ret = vm_write_mem(&(((VmMngr*)self->pyvm)->vm_mngr), addr, buffer, pysize);
        if (ret < 0)
 	       RAISE(PyExc_TypeError,"arg must be str");
 
diff --git a/miasm/jitter/vm_mngr.c b/miasm/jitter/vm_mngr.c
index a767b366..d27dd135 100644
--- a/miasm/jitter/vm_mngr.c
+++ b/miasm/jitter/vm_mngr.c
@@ -513,30 +513,23 @@ uint64_t vm_MEM_LOOKUP_64(vm_mngr_t* vm_mngr, uint64_t addr)
 }
 
 
-int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t size)
+int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, size_t size)
 {
        char* buffer;
        size_t len;
-       size_t size_st;
        uint64_t addr_diff;
        size_t addr_diff_st;
        struct memory_page_node * mpn;
 
-       if (size > SIZE_MAX) {
-	       fprintf(stderr, "Size too big\n");
-	       exit(EXIT_FAILURE);
-       }
-
-       buffer = malloc((size_t)size);
+       buffer = malloc(size);
        *buffer_ptr = buffer;
        if (!buffer){
 	      fprintf(stderr, "Error: cannot alloc read\n");
 	      exit(EXIT_FAILURE);
        }
-       size_st = (size_t)size;
 
        /* read is multiple page wide */
-       while (size_st){
+       while (size){
 	      mpn = get_memory_page_from_address(vm_mngr, addr, 1);
 	      if (!mpn){
 		      free(*buffer_ptr);
@@ -550,17 +543,17 @@ int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t s
 		      exit(EXIT_FAILURE);
 	      }
 	      addr_diff_st = (size_t) addr_diff;
-	      len = MIN(size_st, mpn->size - addr_diff_st);
+	      len = MIN(size, mpn->size - addr_diff_st);
 	      memcpy(buffer, (char*)mpn->ad_hp + (addr_diff_st), len);
 	      buffer += len;
 	      addr += len;
-	      size_st -= len;
+	      size -= len;
        }
 
        return 0;
 }
 
-int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size)
+int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, size_t size)
 {
        size_t len;
        size_t size_st;
diff --git a/miasm/jitter/vm_mngr.h b/miasm/jitter/vm_mngr.h
index 1fa8d9ae..44f369a6 100644
--- a/miasm/jitter/vm_mngr.h
+++ b/miasm/jitter/vm_mngr.h
@@ -207,8 +207,8 @@ unsigned short MEM_LOOKUP_16_PASSTHROUGH(uint64_t addr);
 unsigned int MEM_LOOKUP_32_PASSTHROUGH(uint64_t addr);
 uint64_t MEM_LOOKUP_64_PASSTHROUGH(uint64_t addr);
 
-int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t size);
-int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size);
+int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, size_t size);
+int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, size_t size);
 
 void memory_access_list_init(struct memory_access_list * access);
 void memory_access_list_reset(struct memory_access_list * access);
diff --git a/miasm/jitter/vm_mngr_py.c b/miasm/jitter/vm_mngr_py.c
index 57494655..d2e1d97f 100644
--- a/miasm/jitter/vm_mngr_py.c
+++ b/miasm/jitter/vm_mngr_py.c
@@ -162,7 +162,7 @@ PyObject* vm_set_mem(VmMngr* self, PyObject* args)
        Py_ssize_t py_length;
 
        char * buffer;
-       uint64_t size;
+       Py_ssize_t pysize;
        uint64_t addr;
        int ret;
 
@@ -174,14 +174,17 @@ PyObject* vm_set_mem(VmMngr* self, PyObject* args)
        if (!PyBytes_Check(py_buffer))
 	       RAISE(PyExc_TypeError,"arg must be bytes");
 
-       size = PyBytes_Size(py_buffer);
+       pysize = PyBytes_Size(py_buffer);
+       if (pysize < 0) {
+	       RAISE(PyExc_TypeError,"Python error");
+       }
        PyBytes_AsStringAndSize(py_buffer, &buffer, &py_length);
 
-       ret = vm_write_mem(&self->vm_mngr, addr, buffer, size);
+       ret = vm_write_mem(&self->vm_mngr, addr, buffer, pysize);
        if (ret < 0)
 	      RAISE(PyExc_TypeError, "Error in set_mem");
 
-       add_mem_write(&self->vm_mngr, addr, size);
+       add_mem_write(&self->vm_mngr, addr, (size_t)pysize);
        check_invalid_code_blocs(&self->vm_mngr);
 
        Py_INCREF(Py_None);