summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoritz Schulte <moritz@duesseldorf.ccc.de>2002-12-08 14:21:50 +0000
committerMoritz Schulte <moritz@duesseldorf.ccc.de>2002-12-08 14:21:50 +0000
commit93267e151da643a633c9716fe7d33bb405ce75f0 (patch)
tree66078f9ed270ba40beb4b0025bef933c5bc35567
parentac65bb8782302c08cb93f89a669244ef432051e5 (diff)
2002-12-08 Moritz Schulte <moritz@duesseldorf.ccc.de>
* lib.c: Include <sys/mman.h>. * node.c: Include <sys/mman.h>. (node_entries_get): munmap dirent_data as returned by dir_entries_get. (node_entries_get): New variable: int dirent_data_size. * lib.c (dir_entries_get): New argument: int *dirent_data_size. (dir_entries_get): Do not forget to munmap DATA if something goes wrong. * lib.h: Update dir_entries_get declaration.
-rw-r--r--ChangeLog10
-rw-r--r--lib.c16
-rw-r--r--lib.h9
-rw-r--r--node.c7
4 files changed, 31 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 6341d3e..443f6f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,14 @@
2002-12-08 Moritz Schulte <moritz@duesseldorf.ccc.de>
+ * lib.c: Include <sys/mman.h>.
+ * node.c: Include <sys/mman.h>.
+ (node_entries_get): munmap dirent_data as returned by
+ dir_entries_get.
+ (node_entries_get): New variable: int dirent_data_size.
+ * lib.c (dir_entries_get): New argument: int *dirent_data_size.
+ (dir_entries_get): Do not forget to munmap DATA if something goes
+ wrong.
+ * lib.h: Update dir_entries_get declaration.
+
* node.c (node_create_root): call lnode_destroy, if node_create
failed, not if lnode_create failed. Reported by Richard Smith.
diff --git a/lib.c b/lib.c
index 29af81f..dfb90fd 100644
--- a/lib.c
+++ b/lib.c
@@ -23,6 +23,7 @@
#include <error.h>
#include <dirent.h>
#include <errno.h>
+#include <sys/mman.h>
#include "lib.h"
@@ -31,11 +32,12 @@
struct mutex debug_msg_lock = MUTEX_INITIALIZER;
/* Fetch directory entries for DIR; store the raw data as returned by
- the dir_readdir RPC in *DIRENT_DATA and a list of pointers to the
- dirent structures in *DIRENT_LIST. */
+ the dir_readdir RPC in *DIRENT_DATA, the size of *DIRENT_DATA in
+ *DIRENT_DATA_SIZE and a list of pointers to the dirent structures
+ in *DIRENT_LIST. */
error_t
-dir_entries_get (file_t dir,
- char **dirent_data, struct dirent ***dirent_list)
+dir_entries_get (file_t dir, char **dirent_data,
+ int *dirent_data_size, struct dirent **dirent_list)
{
error_t err;
size_t data_size;
@@ -60,10 +62,14 @@ dir_entries_get (file_t dir,
*(list + i) = NULL;
*dirent_data = data;
+ *dirent_data_size = data_size;
*dirent_list = list;
}
else
- err = ENOMEM;
+ {
+ munmap (data, date_size);
+ err = ENOMEM;
+ }
}
return err;
}
diff --git a/lib.h b/lib.h
index c81900e..c3dfbbd 100644
--- a/lib.h
+++ b/lib.h
@@ -42,10 +42,11 @@
#define port_valid(p) ((p) != port_null)
/* Fetch directory entries for DIR; store the raw data as returned by
- the dir_readdir RPC in *DIRENT_DATA and a list of pointers to the
- dirent structures in *DIRENT_LIST. */
-error_t dir_entries_get (file_t dir,
- char **dirent_data, struct dirent ***dirent_list);
+ the dir_readdir RPC in *DIRENT_DATA, the size of *DIRENT_DATA in
+ *DIRENT_DATA_SIZE and a list of pointers to the dirent structures
+ in *DIRENT_LIST. */
+error_t dir_entries_get (file_t dir, char **dirent_data,
+ int *dirent_data_size, struct dirent **dirent_list);
/* Lookup the file named NAME beneath DIR (or the cwd, if DIR is not a
valid port. Try to open with FLAGS0 first, and if that fails with
diff --git a/node.c b/node.c
index 1eaee58..a4825b9 100644
--- a/node.c
+++ b/node.c
@@ -26,6 +26,7 @@
#include <error.h>
#include <fcntl.h>
#include <sys/stat.h>
+#include <sys/mman.h>
#include <stdio.h>
#include "unionfs.h"
@@ -248,6 +249,7 @@ node_entries_get (node_t *node, node_dirent_t **dirents)
{
struct dirent **dirent_list, **dirent;
node_dirent_t *node_dirent_list = NULL;
+ int dirent_data_size;
char *dirent_data;
error_t err = 0;
@@ -313,8 +315,8 @@ node_entries_get (node_t *node, node_dirent_t **dirents)
{
if (port_valid (node_ulfs->port))
{
- err = dir_entries_get (node_ulfs->port,
- &dirent_data, &dirent_list);
+ err = dir_entries_get (node_ulfs->port, &dirent_data,
+ &dirent_data_size, &dirent_list);
if (! err)
{
for (dirent = dirent_list; (! err) && *dirent; dirent++)
@@ -324,6 +326,7 @@ node_entries_get (node_t *node, node_dirent_t **dirents)
(*dirent)->d_fileno,
(*dirent)->d_type);
free (dirent_list);
+ munmap (dirent_data, dirent_data_size);
}
}
}