diff options
author | Moritz Schulte <moritz@duesseldorf.ccc.de> | 2002-12-08 14:21:50 +0000 |
---|---|---|
committer | Moritz Schulte <moritz@duesseldorf.ccc.de> | 2002-12-08 14:21:50 +0000 |
commit | 93267e151da643a633c9716fe7d33bb405ce75f0 (patch) | |
tree | 66078f9ed270ba40beb4b0025bef933c5bc35567 | |
parent | ac65bb8782302c08cb93f89a669244ef432051e5 (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-- | ChangeLog | 10 | ||||
-rw-r--r-- | lib.c | 16 | ||||
-rw-r--r-- | lib.h | 9 | ||||
-rw-r--r-- | node.c | 7 |
4 files changed, 31 insertions, 11 deletions
@@ -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. @@ -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; } @@ -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 @@ -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); } } } |