libcomps/fix-fromxml_str-segfault.patch
2023-09-05 16:55:46 +02:00

92 lines
3.5 KiB
Diff

From 9023f90c3640c795efc8a1ae083c931f5316e448 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
Date: Tue, 22 Aug 2023 12:01:35 +0200
Subject: [PATCH 1/2] Move return value check before parsed values are used
It is not sufficient to check the return value after the function output
is used. We need check it sooner to avoid a Segmentation fault.
For: https://github.com/rpm-software-management/libcomps/issues/103
---
libcomps/src/python/src/pycomps.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libcomps/src/python/src/pycomps.c b/libcomps/src/python/src/pycomps.c
index ee6f691..ffc9e71 100644
--- a/libcomps/src/python/src/pycomps.c
+++ b/libcomps/src/python/src/pycomps.c
@@ -347,6 +347,11 @@ PyObject* PyCOMPS_fromxml_str(PyObject *self, PyObject *args, PyObject *kwds) {
parsed_ret = comps_parse_str(parsed, tmps, options);
if (options)
free(options);
+ if (parsed_ret == -1) {
+ comps_parse_parsed_destroy(parsed);
+ PyErr_SetString(PyCOMPSExc_ParserError, "Fatal parser error");
+ return NULL;
+ }
Py_CLEAR(self_comps->p_groups);
Py_CLEAR(self_comps->p_categories);
Py_CLEAR(self_comps->p_environments);
@@ -361,10 +366,6 @@ PyObject* PyCOMPS_fromxml_str(PyObject *self, PyObject *args, PyObject *kwds) {
parsed->log = NULL;
parsed->comps_doc = NULL;
comps_parse_parsed_destroy(parsed);
- if (parsed_ret == -1) {
- PyErr_SetString(PyCOMPSExc_ParserError, "Fatal parser error");
- return NULL;
- }
return PyLong_FromLong((long)parsed_ret);
}
From 15091c2ae0e70dfd5b92ea6631d323d76273175b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= <amatej@redhat.com>
Date: Tue, 22 Aug 2023 12:18:02 +0200
Subject: [PATCH 2/2] Update unittests for `fromxml_str()`
Remove output checks after the parsing raises and exception.
It also adds one more test with completely invalid xml input.
---
libcomps/src/python/tests/__test.py | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/libcomps/src/python/tests/__test.py b/libcomps/src/python/tests/__test.py
index 4152c7d..63a30e2 100644
--- a/libcomps/src/python/tests/__test.py
+++ b/libcomps/src/python/tests/__test.py
@@ -718,24 +718,25 @@ def test_xml(self):
ret = comps2.fromxml_f(fname)
self.assertTrue(ret == 0, comps2.get_last_errors())
- compsdoc = comps2.xml_str()
- compsdoc = compsdoc[0:-5] # make some error
self.assertTrue(len(comps2.groups) == 3)
self.assertTrue(len(comps2.categories) == 2)
self.assertTrue(len(comps2.environments) == 0)
- comps3 = libcomps.Comps()
- self.assertRaises(libcomps.ParserError, comps3.fromxml_str, compsdoc)
-
- self.assertTrue(len(comps3.groups) == 3)
- self.assertTrue(len(comps3.categories) == 2)
- self.assertTrue(len(comps3.environments) == 0)
x = self.comps.xml_str(xml_options={})
y = comps2.xml_str()
self.assertTrue(x == y)
os.remove(fname)
+ compsdoc = comps2.xml_str()
+ compsdoc = compsdoc[0:-5] # make some error
+ comps3 = libcomps.Comps()
+ self.assertRaises(libcomps.ParserError, comps3.fromxml_str, compsdoc)
+
+ INVALID_COMPS_XML = "invalid xml"
+ comps4 = libcomps.Comps()
+ self.assertRaises(libcomps.ParserError, comps4.fromxml_str, str(INVALID_COMPS_XML))
+
#@unittest.skip("")
def test_fedora(self):
comps = libcomps.Comps()