good for merge On Thu, 2010-02-25 at 19:28 +1100, Angus Salkeld wrote: > 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;
_______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
