Closed
Description
Who manages the char* set by Pointer.set_string_pointer? Is it impossible to set a string to a char* managed by a C++ object?
Test Code 1:
from memory import alloc
string = "string1"
string2 = "string2"
s_p1 = alloc(4, False)
s_p2 = alloc(4, False)
s_p1.set_string_pointer(string)
s_p2.set_string_pointer(string)
print("uint1", s_p1.get_uint())
print("uint2", s_p2.get_uint())
s_p1.set_string_pointer(s_p2.get_string_pointer())
print("uint1", s_p1.get_uint())
print("uint2", s_p2.get_uint())
print("string1", s_p1.get_string_pointer())
print("string2", s_p2.get_string_pointer())
s_p1.get_pointer().dealloc()
Output 1:
uint1 3949688248
uint2 3949688312
uint1 3953894104
uint2 3949688312
string1 12
string2 string2
free(): invalid pointer
First, I don't know why string1 is set to 12
instead of string2
as in string2, but trying to free string1 would result in an illegal pointer deallocation. Who exactly is managing this char*?
There is also a problem with TypeManager.pointer_attribute not being able to set STRING_ARRAY.
Test Code 2:
from memory.manager import CustomType
from memory.manager import Type
from memory.manager import TypeManager
manager = TypeManager()
class Test(CustomType, metaclass=manager):
_size = 4
string = manager.pointer_attribute(Type.STRING_ARRAY, 0)
test = Test()
test.string = "test"
Output 2:
[Source.Python]
[SP] Caught an Exception:
Traceback (most recent call last):
File "../addons/source-python/packages/source-python/plugins/command.py", line 164, in load_plugin
plugin = self.manager.load(plugin_name)
File "../addons/source-python/packages/source-python/plugins/manager.py", line 207, in load
plugin._load()
File "../addons/source-python/packages/source-python/plugins/instance.py", line 74, in _load
self.module = import_module(self.import_name)
File "../addons/source-python/plugins/test/test.py", line 4214, in <module>
test.string = "test"
File "../addons/source-python/packages/source-python/memory/manager.py", line 515, in fset
instance_ptr = alloc(TYPE_SIZES[type_name.upper()])
KeyError: 'STRING_ARRAY'
STRING_ARRAY also allows buffer overrun, and it seems that STRING-related issues are somewhat problematic.