summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2021-10-14 06:47:29 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2021-10-14 06:47:29 (GMT)
commit810bce688d9b0e271d86886e182b62aa7166319f (patch)
tree33f9e4751616784fa1f97ea152f063d00c8509b6
parentd405d93f41f9376c55ac8af7acde62eec80386ec (diff)
Improve some reference counters inside binary contents.
-rw-r--r--plugins/pychrysalide/analysis/content.c46
-rw-r--r--src/analysis/content.c2
-rw-r--r--src/analysis/contents/memory.c10
-rw-r--r--src/main.c5
4 files changed, 58 insertions, 5 deletions
diff --git a/plugins/pychrysalide/analysis/content.c b/plugins/pychrysalide/analysis/content.c
index 68ecba2..f94e3f7 100644
--- a/plugins/pychrysalide/analysis/content.c
+++ b/plugins/pychrysalide/analysis/content.c
@@ -99,6 +99,9 @@ static int py_binary_content_set_attributes(PyObject *, PyObject *, void *);
/* Fournit l'ensemble des attributs associés à un contenu. */
static PyObject *py_binary_content_get_attributes(PyObject *, void *);
+/* Donne l'origine d'un contenu binaire. */
+static PyObject *py_binary_content_get_root(PyObject *, void *);
+
/* Fournit une empreinte unique (SHA256) pour les données. */
static PyObject *py_binary_content_get_checksum(PyObject *, void *);
@@ -1133,6 +1136,48 @@ static PyObject *py_binary_content_get_attributes(PyObject *self, void *closure)
* Paramètres : self = contenu binaire à manipuler. *
* closure = adresse non utilisée ici. *
* *
+* Description : Donne l'origine d'un contenu binaire. *
+* *
+* Retour : Contenu à l'origine du contenu courant. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_binary_content_get_root(PyObject *self, void *closure)
+{
+ PyObject *result; /* Instance à retourner */
+ GBinContent *content; /* Version GLib du format */
+ GContentAttributes *attribs; /* Attributs à transmettre */
+
+#define BINARY_CONTENT_ROOT_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ root, py_binary_content, \
+ "Provide, as a pychrysalide.analysis.BinContent instance, the root" \
+ " content leading to the current content." \
+ "\n" \
+ "This property is relevant only for" \
+ " pychrysalide.analysis.contents.EncapsulatedContent objects." \
+)
+
+ content = G_BIN_CONTENT(pygobject_get(self));
+
+ attribs = g_binary_content_get_attributes(content);
+
+ result = pygobject_new(G_OBJECT(attribs));
+
+ g_object_unref(attribs);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = contenu binaire à manipuler. *
+* closure = adresse non utilisée ici. *
+* *
* Description : Fournit une empreinte unique (SHA256) pour les données. *
* *
* Retour : Bilan de l'opération. *
@@ -1347,6 +1392,7 @@ PyTypeObject *get_python_binary_content_type(void)
static PyGetSetDef py_binary_content_getseters[] = {
BINARY_CONTENT_ATTRIBUTES_ATTRIB,
+ BINARY_CONTENT_ROOT_ATTRIB,
BINARY_CONTENT_CHECKSUM_ATTRIB,
BINARY_CONTENT_SIZE_ATTRIB,
BINARY_CONTENT_START_POS_ATTRIB,
diff --git a/src/analysis/content.c b/src/analysis/content.c
index 626497e..7208f94 100644
--- a/src/analysis/content.c
+++ b/src/analysis/content.c
@@ -143,8 +143,6 @@ GBinContent *g_binary_content_get_root(GBinContent *content)
result = iface->get_root(content);
- g_object_ref(G_OBJECT(result));
-
return result;
}
diff --git a/src/analysis/contents/memory.c b/src/analysis/contents/memory.c
index e28d31c..0b14a48 100644
--- a/src/analysis/contents/memory.c
+++ b/src/analysis/contents/memory.c
@@ -192,6 +192,8 @@ static void g_memory_content_init(GMemoryContent *content)
g_binary_content_set_attributes(G_BIN_CONTENT(content), empty);
+ g_object_unref(G_OBJECT(empty));
+
content->data = NULL;
content->length = 0;
@@ -372,7 +374,10 @@ GBinContent *g_memory_content_new(const bin_t *data, phys_t size)
static void g_memory_content_set_attributes(GMemoryContent *content, GContentAttributes *attribs)
{
+ g_clear_object(&content->attribs);
+
content->attribs = attribs;
+ g_object_unref(G_OBJECT(attribs));
}
@@ -395,6 +400,9 @@ static GContentAttributes *g_memory_content_get_attributes(const GMemoryContent
result = content->attribs;
+ if (result != NULL)
+ g_object_ref(G_OBJECT(result));
+
return result;
}
@@ -418,6 +426,8 @@ static GBinContent *g_memory_content_get_root(GMemoryContent *content)
result = G_BIN_CONTENT(content);
+ g_object_ref(G_OBJECT(result));
+
return result;
}
diff --git a/src/main.c b/src/main.c
index 434c861..356e796 100644
--- a/src/main.c
+++ b/src/main.c
@@ -540,10 +540,9 @@ static int open_binaries(char **files, int count)
}
else
- {
- g_object_unref(G_OBJECT(attribs));
result = EXIT_FAILURE;
- }
+
+ g_object_unref(G_OBJECT(attribs));
}