Skip to content

Commit 0d4aa85

Browse files
Thirumalai-Shaktivelcertik
authored andcommitted
Fix heap corruption
1 parent 79ef818 commit 0d4aa85

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

src/runtime/lpython/lpython.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -708,9 +708,9 @@ def get_data_type(t):
708708
variables_decl += " " + get_data_type(self.return_type) \
709709
+ "_" + self.fn_name + "_return_value;\n"
710710
elif self.array_as_return_type:
711-
variables_decl += " " + get_data_type( \
712-
self.array_as_return_type[1][1][:-2]) + "_" + self.fn_name \
713-
+ "_return_value;\n"
711+
variables_decl += " " + self.array_as_return_type[1][1] + "_" \
712+
+ self.fn_name + "_return_value = malloc(sizeof(" \
713+
+ self.array_as_return_type[1][1][:-2] + "));\n"
714714
else:
715715
variables_decl = ""
716716
# ----------------------------------------------------------------------
@@ -780,18 +780,22 @@ def get_data_type(t):
780780
return Py_BuildValue("{self.return_type_format}", _{self.fn_name}_return_value);"""
781781
else:
782782
if self.array_as_return_type:
783-
fill_return_details = f"""
784-
_{self.fn_name}_return_value.data = malloc(sizeof({self.array_as_return_type[1][2][:-2]}));
785-
_{self.fn_name}_return_value.n_dims = 1;
786-
_{self.fn_name}_return_value.dims[0].lower_bound = 0;
787-
_{self.fn_name}_return_value.dims[0].length = {self.array_as_return_type[1][3]};
788-
_{self.fn_name}_return_value.is_allocated = false;
789-
{self.fn_name}({pass_args}, &_{self.fn_name}_return_value);
783+
fill_return_details = f"""\n
784+
_{self.fn_name}_return_value->data = malloc({self.array_as_return_type[1][3]
785+
} * sizeof({self.array_as_return_type[1][2][:-2]}));
786+
_{self.fn_name}_return_value->n_dims = 1;
787+
_{self.fn_name}_return_value->dims[0].lower_bound = 0;
788+
_{self.fn_name}_return_value->dims[0].length = {
789+
self.array_as_return_type[1][3]};
790+
_{self.fn_name}_return_value->is_allocated = false;
791+
792+
// Call the C function
793+
{self.fn_name}({pass_args}, &_{self.fn_name}_return_value[0]);
790794
791795
// Build and return the result as a Python object
792796
PyObject* list_obj = PyList_New({self.array_as_return_type[1][3]});
793797
for (int i = 0; i < {self.array_as_return_type[1][3]}; i++) {{
794-
PyObject* element = PyFloat_FromDouble(_{self.fn_name}_return_value.data[i]);
798+
PyObject* element = PyFloat_FromDouble(_{self.fn_name}_return_value->data[i]);
795799
PyList_SetItem(list_obj, i, element);
796800
}}
797801
return list_obj;"""

0 commit comments

Comments
 (0)