diff mbox

[[PATCH,v2,1/2] libfsimage: replace deprecated readdir_r() with readdir()

Message ID 1464805178-8989-1-git-send-email-cjp256@gmail.com
State New, archived
Headers show

Commit Message

Chris Patterson June 1, 2016, 6:19 p.m. UTC
From: Chris Patterson <pattersonc@ainfosec.com>

Replace the usage of readdir_r() with readdir() to address a
compilation error under glibc due to the deprecation of readdir_r
for their next release (2.24) [1, 2].

--

From the GNU libc manual [3]:
"
 It is expected that future versions of POSIX will obsolete readdir_r and
 mandate the level of thread safety for readdir which is provided by the
 GNU C Library and other implementations today.
"

There is a filed bug in the Austin Group Defect Tracker [4]  in which 'dalias'
proposes (in comment 0001632) that:
"
   I would like to propose an alternate solution. For readdir, replace the text:
    "The readdir() function need not be thread-safe."
   with:
    "If multiple threads call the readdir() function with the same directory
    stream argument and without synchronization to preclude simultaneous
    access, then the behavior is undefined."

   With this change, the clunky readdir_r function is no longer needed or
   useful, and should probably be deprecated. As the only reasonable way
   to meet the implementation requirements for readdir is to have the dirent
   buffer in the DIR structure, this change should not require any change to
   existing implementations.
"

[1] https://sourceware.org/ml/libc-alpha/2016-02/msg00093.html
[2] https://sourceware.org/bugzilla/show_bug.cgi?id=19056
[3] https://www.gnu.org/software/libc/manual/html_node/Reading_002fClosing-Directory.html
[4] http://austingroupbugs.net/view.php?id=696

--

v2:
- Additional detail in commit message
- Cleanup additional related (no longer used) code

Signed-off-by: Chris Patterson <pattersonc@ainfosec.com>
---
 tools/libfsimage/common/fsimage_plugin.c | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)
diff mbox

Patch

diff --git a/tools/libfsimage/common/fsimage_plugin.c b/tools/libfsimage/common/fsimage_plugin.c
index 3fa06c7..5ab8d93 100644
--- a/tools/libfsimage/common/fsimage_plugin.c
+++ b/tools/libfsimage/common/fsimage_plugin.c
@@ -122,8 +122,7 @@  fail:
 static int load_plugins(void)
 {
 	const char *fsdir = getenv("FSIMAGE_FSDIR");
-	struct dirent *dp = NULL;
-	struct dirent *dpp;
+	struct dirent *de;
 	DIR *dir = NULL;
 	char *tmp = NULL;
 	size_t name_max;
@@ -139,22 +138,17 @@  static int load_plugins(void)
 	if ((tmp = malloc(name_max + 1)) == NULL)
 		goto fail;
 
-	if ((dp = malloc(sizeof (struct dirent) + name_max + 1)) == NULL)
-		goto fail;
-
 	if ((dir = opendir(fsdir)) == NULL)
 		goto fail;
 
-	bzero(dp, sizeof (struct dirent) + name_max + 1);
-
-	while (readdir_r(dir, dp, &dpp) == 0 && dpp != NULL) {
-		if (strcmp(dpp->d_name, ".") == 0)
+	while ((de = readdir(dir)) != NULL) {
+		if (strcmp(de->d_name, ".") == 0)
 			continue;
-		if (strcmp(dpp->d_name, "..") == 0)
+		if (strcmp(de->d_name, "..") == 0)
 			continue;
 
 		(void) snprintf(tmp, name_max, "%s/%s/fsimage.so", fsdir,
-			dpp->d_name);
+			de->d_name);
 
 		if (init_plugin(tmp) != 0)
 			goto fail;
@@ -167,7 +161,6 @@  fail:
 	if (dir != NULL)
 		(void) closedir(dir);
 	free(tmp);
-	free(dp);
 	errno = err;
 	return (ret);
 }