summaryrefslogtreecommitdiff
path: root/src/analysis/contents/file.c
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/file.c
parent0507bdb3b56083c8e8b011fc3d4c16fed2700340 (diff)
Do not allocate memory for file mmap()'ed contents.
Diffstat (limited to 'src/analysis/contents/file.c')
-rw-r--r--src/analysis/contents/file.c20
1 files changed, 14 insertions, 6 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: