[python] Fix getting section contents.
authorAnders Waldenborg <anders@0x63.nu>
Fri, 25 Apr 2014 06:25:15 +0000 (06:25 +0000)
committerAnders Waldenborg <anders@0x63.nu>
Fri, 25 Apr 2014 06:25:15 +0000 (06:25 +0000)
The returnvalue was handled as c_char_p which ment that ctypes
handled it as a NUL-terminated string making it cut the contents
at first NUL (or even worse - overrunning the buffer if it doesn't
contain a NUL).

Differential Revision: http://reviews.llvm.org/D3474

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207199 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/python/llvm/object.py
bindings/python/llvm/tests/test_object.py

index bba20d28b1ec86acbeff4b4af62f004f64e3d8d2..4e912ed5da9d605a316148594e25d6487c05de5a 100644 (file)
@@ -78,7 +78,10 @@ Here are some examples on how to perform iteration:
 """
 
 from ctypes import c_char_p
 """
 
 from ctypes import c_char_p
+from ctypes import c_char
+from ctypes import POINTER
 from ctypes import c_uint64
 from ctypes import c_uint64
+from ctypes import string_at
 
 from .common import CachedProperty
 from .common import LLVMObject
 
 from .common import CachedProperty
 from .common import LLVMObject
@@ -211,7 +214,12 @@ class Section(LLVMObject):
         if self.expired:
             raise Exception('Section instance has expired.')
 
         if self.expired:
             raise Exception('Section instance has expired.')
 
-        return lib.LLVMGetSectionContents(self)
+        siz = self.size
+
+        r = lib.LLVMGetSectionContents(self)
+        if r:
+            return string_at(r, siz)
+        return None
 
     @CachedProperty
     def address(self):
 
     @CachedProperty
     def address(self):
@@ -462,7 +470,8 @@ def register_library(library):
     library.LLVMGetSectionSize.restype = c_uint64
 
     library.LLVMGetSectionContents.argtypes = [c_object_p]
     library.LLVMGetSectionSize.restype = c_uint64
 
     library.LLVMGetSectionContents.argtypes = [c_object_p]
-    library.LLVMGetSectionContents.restype = c_char_p
+    # Can't use c_char_p here as it isn't a NUL-terminated string.
+    library.LLVMGetSectionContents.restype = POINTER(c_char)
 
     library.LLVMGetSectionAddress.argtypes = [c_object_p]
     library.LLVMGetSectionAddress.restype = c_uint64
 
     library.LLVMGetSectionAddress.argtypes = [c_object_p]
     library.LLVMGetSectionAddress.restype = c_uint64
index 5662d2240e0a9692980861d42b97a870f1fd54a5..3f92d8155b61337cf2b8fd1845e9521608a001da 100644 (file)
@@ -23,6 +23,7 @@ class TestObjectFile(TestBase):
             assert isinstance(section.size, long)
             assert isinstance(section.contents, str)
             assert isinstance(section.address, long)
             assert isinstance(section.size, long)
             assert isinstance(section.contents, str)
             assert isinstance(section.address, long)
+            assert len(section.contents) == section.size
 
         self.assertGreater(count, 0)
 
 
         self.assertGreater(count, 0)