This just to convert non thread safe calls to thread safe ones.

-Angus

Signed-off-by: Angus Salkeld <[email protected]>
---
 exec/coroparse.c |   27 +++++++++++++++++++++++++--
 lcr/lcr_ifact.c  |   23 ++++++++++++++++++-----
 2 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/exec/coroparse.c b/exec/coroparse.c
index 29e18a9..ab2ecb6 100644
--- a/exec/coroparse.c
+++ b/exec/coroparse.c
@@ -49,6 +49,7 @@
 #include <string.h>
 #include <dirent.h>
 #include <limits.h>
+#include <stddef.h>
 
 #include <corosync/lcr/lcr_comp.h>
 #include <corosync/engine/objdb.h>
@@ -264,8 +265,11 @@ static int read_uidgid_files_into_objdb(
        const char *dirname;
        DIR *dp;
        struct dirent *dirent;
+       struct dirent *entry;
        char filename[PATH_MAX + FILENAME_MAX + 1];
        int res = 0;
+       size_t len;
+       int return_code;
        struct stat stat_buf;
 
        dirname = COROSYSCONFDIR "/uidgid.d";
@@ -274,7 +278,14 @@ static int read_uidgid_files_into_objdb(
        if (dp == NULL)
                return 0;
 
-       while ((dirent = readdir (dp))) {
+       len = offsetof(struct dirent, d_name) +
+                     pathconf(dirname, _PC_NAME_MAX) + 1;
+       entry = malloc(len);
+
+       for (return_code = readdir_r(dp, entry, &dirent);
+               dirent != NULL && return_code == 0;
+               return_code = readdir_r(dp, entry, &dirent)) {
+
                snprintf(filename, sizeof (filename), "%s/%s", dirname, 
dirent->d_name);
                stat (filename, &stat_buf);
                if (S_ISREG(stat_buf.st_mode)) {
@@ -293,6 +304,7 @@ static int read_uidgid_files_into_objdb(
        }
 
 error_exit:
+       free (entry);
        closedir(dp);
 
        return res;
@@ -306,9 +318,12 @@ static int read_service_files_into_objdb(
        const char *dirname;
        DIR *dp;
        struct dirent *dirent;
+       struct dirent *entry;
        char filename[PATH_MAX + FILENAME_MAX + 1];
        int res = 0;
        struct stat stat_buf;
+       size_t len;
+       int return_code;
 
        dirname = COROSYSCONFDIR "/service.d";
        dp = opendir (dirname);
@@ -316,7 +331,14 @@ static int read_service_files_into_objdb(
        if (dp == NULL)
                return 0;
 
-       while ((dirent = readdir (dp))) {
+       len = offsetof(struct dirent, d_name) +
+                     pathconf(dirname, _PC_NAME_MAX) + 1;
+       entry = malloc(len);
+
+       for (return_code = readdir_r(dp, entry, &dirent);
+               dirent != NULL && return_code == 0;
+               return_code = readdir_r(dp, entry, &dirent)) {
+
                snprintf(filename, sizeof (filename), "%s/%s", dirname, 
dirent->d_name);
                stat (filename, &stat_buf);
                if (S_ISREG(stat_buf.st_mode)) {
@@ -335,6 +357,7 @@ static int read_service_files_into_objdb(
        }
 
 error_exit:
+       free (entry);
        closedir(dp);
 
        return res;
diff --git a/lcr/lcr_ifact.c b/lcr/lcr_ifact.c
index 6c8c912..f114296 100644
--- a/lcr/lcr_ifact.c
+++ b/lcr/lcr_ifact.c
@@ -285,17 +285,29 @@ static int scandir (
        int (*compar)(const struct dirent **, const struct dirent **))
 {
        DIR *d;
-       struct dirent *entry, **names = NULL;
+       struct dirent *entry;
+       struct dirent *result;
+       struct dirent **names = NULL;
        int namelist_items = 0, namelist_size = 0;
+       size_t len;
+       int return_code;
 
        d = opendir(dir);
        if (d == NULL)
                return -1;
 
        names = NULL;
-       while ((entry = readdir (d)) != NULL) {
+
+       len = offsetof(struct dirent, d_name) +
+                     pathconf(dir, _PC_NAME_MAX) + 1;
+       entry = malloc(len);
+
+       for (return_code = readdir_r (d, entry, &result);
+               dirent != NULL && return_code == 0;
+               return_code = readdir_r(d, entry, &result)) {
+
                struct dirent *tmpentry;
-               if ((filter != NULL) && ((*filter)(entry) == 0)) {
+               if ((filter != NULL) && ((*filter)(result) == 0)) {
                        continue;
                }
                if (namelist_items >= namelist_size) {
@@ -312,11 +324,11 @@ static int scandir (
                        }
                        names = tmp;
                }
-               tmpentry = malloc (entry->d_reclen);
+               tmpentry = malloc (result->d_reclen);
                if (tmpentry == NULL) {
                        goto fail;
                }
-               (void) memcpy (tmpentry, entry, entry->d_reclen);
+               (void) memcpy (tmpentry, result, result->d_reclen);
                names[namelist_items++] = tmpentry;
        }
        (void) closedir (d);
@@ -337,6 +349,7 @@ fail:
                namelist_items--;
                free (*namelist[namelist_items]);
        }
+       free (entry);
        free (names);
        *namelist = NULL;
        errno = err;
-- 
1.6.6.1


_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to