117cba40b0
resolves: rhbz#1990720, rhbz#1950627 Fix license files. (cherry picked from commit4c961db464
) Move appliance to separate subpackage resolves: rhbz#1989514 https://bugzilla.redhat.com/show_bug.cgi?id=1989514 Move the appliance to a subpackage (libguestfs-appliance). The main package depends on this new subpackage so in effect nothing changes for most users. However this allows the appliance to be replaced if there exists a package called "libguestfs-noappliance". This package is not provided anywhere, you have to provide the dependency or make the package yourself. But if you do this then libguestfs won't install the appliance and you are free to replace it with (eg) a fixed appliance. (cherry picked from commit941da64078
)
87 lines
3.6 KiB
Diff
87 lines
3.6 KiB
Diff
From e84c63a2ca4bf2366af96eb1a1222cf494e228c9 Mon Sep 17 00:00:00 2001
|
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
Date: Tue, 27 Jul 2021 08:55:27 +0100
|
|
Subject: [PATCH] python: Don't leak fields when creating Python structs
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
When creating and returning a Python struct we were adding fields from
|
|
the C struct, but did not reduce the ref count on the temporary value
|
|
after it had been moved to the struct, resulting in a memory leak.
|
|
|
|
Reported-by: 朱丹 <zhudan24@huawei.com>
|
|
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1985912
|
|
---
|
|
generator/python.ml | 9 +++++++++
|
|
1 file changed, 9 insertions(+)
|
|
|
|
diff --git a/generator/python.ml b/generator/python.ml
|
|
index b3d3a5579..1afd05dd6 100644
|
|
--- a/generator/python.ml
|
|
+++ b/generator/python.ml
|
|
@@ -173,44 +173,52 @@ and generate_python_structs () =
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
| name, FBuffer ->
|
|
pr " value = PyBytes_FromStringAndSize (%s->%s, %s->%s_len);\n"
|
|
typ name typ name;
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
| name, FUUID ->
|
|
pr " value = guestfs_int_py_fromstringsize (%s->%s, 32);\n"
|
|
typ name;
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
| name, (FBytes|FUInt64) ->
|
|
pr " value = PyLong_FromUnsignedLongLong (%s->%s);\n" typ name;
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
| name, FInt64 ->
|
|
pr " value = PyLong_FromLongLong (%s->%s);\n" typ name;
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
| name, FUInt32 ->
|
|
pr " value = PyLong_FromUnsignedLong (%s->%s);\n" typ name;
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
| name, FInt32 ->
|
|
pr " value = PyLong_FromLong (%s->%s);\n" typ name;
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
| name, FOptPercent ->
|
|
pr " if (%s->%s >= 0) {\n" typ name;
|
|
pr " value = PyFloat_FromDouble ((double) %s->%s);\n" typ name;
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n";
|
|
pr " }\n";
|
|
pr " else {\n";
|
|
pr " Py_INCREF (Py_None);\n";
|
|
@@ -222,6 +230,7 @@ and generate_python_structs () =
|
|
pr " if (value == NULL)\n";
|
|
pr " goto err;\n";
|
|
pr " PyDict_SetItemString (dict, \"%s\", value);\n" name;
|
|
+ pr " Py_DECREF (value);\n"
|
|
) cols;
|
|
pr " return dict;\n";
|
|
pr " err:\n";
|
|
--
|
|
2.31.1
|
|
|