From 980de6a6f1892bcc581b2224c8ee86baeb2fe076 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Thu, 19 Dec 2024 09:48:12 +0100 Subject: [PATCH 1/3] Revert "refactor(iast): simplify ``__mod__`` aspect (#11601)" This reverts commit 59c068fcaa8841ea1d9389b90f72dffed654cb26. --- .../_taint_tracking/Aspects/AspectModulo.cpp | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/ddtrace/appsec/_iast/_taint_tracking/Aspects/AspectModulo.cpp b/ddtrace/appsec/_iast/_taint_tracking/Aspects/AspectModulo.cpp index b7454de26f..a08f76d9f3 100644 --- a/ddtrace/appsec/_iast/_taint_tracking/Aspects/AspectModulo.cpp +++ b/ddtrace/appsec/_iast/_taint_tracking/Aspects/AspectModulo.cpp @@ -2,7 +2,7 @@ #include "Helpers.h" static PyObject* -do_modulo(PyObject* text, PyObject* insert_tuple_or_obj, py::object py_candidate_text, py::object py_candidate_tuple) +do_modulo(PyObject* text, PyObject* insert_tuple_or_obj) { PyObject* result = nullptr; @@ -13,22 +13,18 @@ do_modulo(PyObject* text, PyObject* insert_tuple_or_obj, py::object py_candidate Py_INCREF(insert_tuple); } else { insert_tuple = PyTuple_Pack(1, insert_tuple_or_obj); + if (insert_tuple == nullptr) { + return nullptr; + } } - if (PyUnicode_Check(text) && insert_tuple != nullptr) { + if (PyUnicode_Check(text)) { result = PyUnicode_Format(text, insert_tuple); + } else if (PyBytes_Check(text) or PyByteArray_Check(text)) { + auto method_name = PyUnicode_FromString("__mod__"); + result = PyObject_CallMethodObjArgs(text, method_name, insert_tuple, nullptr); + Py_DECREF(method_name); } else { - try { - py::object res_py = py_candidate_text.attr("__mod__")(py_candidate_tuple); - PyObject* res_pyo = res_py.ptr(); - if (res_pyo != nullptr) { - Py_INCREF(res_pyo); - } - return res_pyo; - } catch (py::error_already_set& e) { - e.restore(); - return nullptr; - } } Py_DECREF(insert_tuple); if (has_pyerr()) { @@ -53,7 +49,21 @@ api_modulo_aspect(PyObject* self, PyObject* const* args, const Py_ssize_t nargs) // Lambda to get the result of the modulo operation auto get_result = [&]() -> PyObject* { - return do_modulo(candidate_text, candidate_tuple, py_candidate_text, py_candidate_tuple); + PyObject* res = do_modulo(candidate_text, candidate_tuple); + if (res == nullptr) { + try { + py::object res_py = py_candidate_text.attr("__mod__")(py_candidate_tuple); + PyObject* res_pyo = res_py.ptr(); + if (res_pyo != nullptr) { + Py_INCREF(res_pyo); + } + return res_pyo; + } catch (py::error_already_set& e) { + e.restore(); + return nullptr; + } + } + return res; }; TRY_CATCH_ASPECT("modulo_aspect", return get_result(), , { @@ -97,10 +107,7 @@ api_modulo_aspect(PyObject* self, PyObject* const* args, const Py_ssize_t nargs) } py::tuple formatted_parameters(list_formatted_parameters); - PyObject* applied_params = do_modulo(StringToPyObject(fmttext, py_str_type).ptr(), - formatted_parameters.ptr(), - StringToPyObject(fmttext, py_str_type), - formatted_parameters); + PyObject* applied_params = do_modulo(StringToPyObject(fmttext, py_str_type).ptr(), formatted_parameters.ptr()); if (applied_params == nullptr) { return get_result(); } From 3f9529fb7c06d72cd446144d68eec9b8c20cbbb2 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Thu, 19 Dec 2024 09:51:58 +0100 Subject: [PATCH 2/3] release note --- .../notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml diff --git a/releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml b/releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml new file mode 100644 index 0000000000..86de7cb0cd --- /dev/null +++ b/releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Code Security: fix two small memory leaks in modulo operator. \ No newline at end of file From 5150ff94850e64501a680d72b987a6c59704c053 Mon Sep 17 00:00:00 2001 From: Alberto Vara Date: Thu, 19 Dec 2024 10:16:58 +0100 Subject: [PATCH 3/3] remove release note --- .../notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml diff --git a/releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml b/releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml deleted file mode 100644 index 86de7cb0cd..0000000000 --- a/releasenotes/notes/iast-fix-modulo-aspect-fdfa09dabb828b50.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -fixes: - - | - Code Security: fix two small memory leaks in modulo operator. \ No newline at end of file