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
