summaryrefslogtreecommitdiff
path: root/src/analysis/contents
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-01-29 19:16:37 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-01-29 19:16:37 (GMT)
commit8cbc874ef01f3d161d4ca253167d8f80e689c814 (patch)
tree2849e7f5af3915a94d8fb0b766f6b7c8ad1817e7 /src/analysis/contents
parent0507bdb3b56083c8e8b011fc3d4c16fed2700340 (diff)
Do not allocate memory for file mmap()'ed contents.
Diffstat (limited to 'src/analysis/contents')
-rw-r--r--src/analysis/contents/file.c20
-rw-r--r--src/analysis/contents/memory-int.h1
-rw-r--r--src/analysis/contents/memory.c12
3 files changed, 25 insertions, 8 deletions
diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c
index 4f102d8..7497667 100644
--- a/src/analysis/contents/file.c
+++ b/src/analysis/contents/file.c
@@ -49,6 +49,7 @@ struct _GFileContent
GMemoryContent parent; /* A laisser en premier */
char *filename; /* Fichier chargé en mémoire */
+ int fd; /* Flux ouvert en lectureu */
};
@@ -136,6 +137,7 @@ static void g_file_content_class_init(GFileContentClass *klass)
static void g_file_content_init(GFileContent *content)
{
content->filename = NULL;
+ content->fd = -1;
}
@@ -193,8 +195,19 @@ static void g_file_content_dispose(GFileContent *content)
static void g_file_content_finalize(GFileContent *content)
{
+ GMemoryContent *base; /* Structure parente */
+
free(content->filename);
+ if (content->fd != -1)
+ {
+ base = G_MEMORY_CONTENT(content);
+ munmap(base->data, base->length);
+
+ close(content->fd);
+
+ }
+
G_OBJECT_CLASS(g_file_content_parent_class)->finalize(G_OBJECT(content));
}
@@ -254,14 +267,9 @@ GBinContent *g_file_content_new(const char *filename)
base = G_MEMORY_CONTENT(result);
- base->data = malloc(info.st_size);
- memcpy(base->data, content, info.st_size);
-
+ base->data = content;
base->length = info.st_size;
- munmap(content, info.st_size);
- close(fd);
-
return G_BIN_CONTENT(result);
file_error:
diff --git a/src/analysis/contents/memory-int.h b/src/analysis/contents/memory-int.h
index 621e4a6..749e984 100644
--- a/src/analysis/contents/memory-int.h
+++ b/src/analysis/contents/memory-int.h
@@ -38,6 +38,7 @@ struct _GMemoryContent
bin_t *data; /* Contenu binaire représenté */
phys_t length; /* Taille totale du contenu */
+ bool allocated; /* Nature de la zone de données*/
char *full_desc; /* Description de l'ensemble */
char *desc; /* Description de l'ensemble */
diff --git a/src/analysis/contents/memory.c b/src/analysis/contents/memory.c
index 9ddc4fa..f80a01a 100644
--- a/src/analysis/contents/memory.c
+++ b/src/analysis/contents/memory.c
@@ -196,6 +196,7 @@ static void g_memory_content_init(GMemoryContent *content)
content->data = NULL;
content->length = 0;
+ content->allocated = false;
content->full_desc = strdup("In-memory content");
content->desc = strdup("In-memory content");
@@ -302,8 +303,11 @@ static void g_memory_content_dispose(GMemoryContent *content)
static void g_memory_content_finalize(GMemoryContent *content)
{
- if (content->data != NULL)
- free(content->data);
+ if (content->allocated)
+ {
+ if (content->data != NULL)
+ free(content->data);
+ }
if (content->desc != NULL)
free(content->desc);
@@ -347,6 +351,7 @@ GBinContent *g_memory_content_new(const bin_t *data, phys_t size)
result->data = allocated;
result->length = size;
+ result->allocated = true;
return G_BIN_CONTENT(result);
@@ -929,6 +934,9 @@ static bool g_memory_content_load(GMemoryContent *content, GObjectStorage *stora
{
content->data = malloc(length);
result = (content->data != NULL);
+
+ content->allocated = true;
+
}
if (result)