From eda1e364f479f70214c57c133572d8422e3a9be7 Mon Sep 17 00:00:00 2001 From: Jan Friesse Date: Wed, 23 Jun 2010 08:39:49 +0000 Subject: [PATCH] Remove pathconf which may fall Corosync has problem with readdir_r if pathconf function fails. Main problem is hidden in calling pathconf (internally calls statfs) which may fail. After this fail, newly allocated memory for readdir_r was smaller than expected and memory was overwritten by readdir_r. Patch removes calling of pathconf and rather use NAME_MAX constant which is always large enough for all file systems. Also return value of malloc SHOULD be checked. git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2962 fd59a12c-fef9-0310-b244-a6a79926bd2f --- exec/coroparse.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/exec/coroparse.c b/exec/coroparse.c index f3a26ee3..677c5c09 100644 --- a/exec/coroparse.c +++ b/exec/coroparse.c @@ -278,9 +278,12 @@ static int read_uidgid_files_into_objdb( if (dp == NULL) return 0; - len = offsetof(struct dirent, d_name) + - pathconf(dirname, _PC_NAME_MAX) + 1; + len = offsetof(struct dirent, d_name) + NAME_MAX + 1; + entry = malloc(len); + if (entry == NULL) { + return 0; + } for (return_code = readdir_r(dp, entry, &dirent); dirent != NULL && return_code == 0; @@ -331,9 +334,12 @@ static int read_service_files_into_objdb( if (dp == NULL) return 0; - len = offsetof(struct dirent, d_name) + - pathconf(dirname, _PC_NAME_MAX) + 1; + len = offsetof(struct dirent, d_name) + NAME_MAX + 1; + entry = malloc(len); + if (entry == NULL) { + return 0; + } for (return_code = readdir_r(dp, entry, &dirent); dirent != NULL && return_code == 0;