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

Reply via email to