From b6e24839f4467534be899fdfd14653255ebf4ac4 Mon Sep 17 00:00:00 2001 From: Nelson Ferreira Date: Fri, 9 Dec 2011 14:20:15 -0500 Subject: [PATCH] Enhance realpath and dirname checking. * m4/sxe-fs-funs.m4 (_SXE_CHECK_REALPATH_RETVAL): Do the checking in a function so that any core will show which test cored. * m4/sxe-fs-funs.m4 (_SXE_CHECK_REALPATH_RETVAL_OWNER): Ditto. * m4/sxe-fs-funs.m4 (_SXE_CHECK_REALPATH_ON_PROTECTED_MEMORY): Ditto. * m4/sxe-fs-funs.m4 (_SXE_CHECK_REALPATH_SANE_ON_NON_EXISTENT): Ditto. * m4/sxe-fs-funs.m4 (_SXE_CHECK_DIRNAME_SIDE_EFFECT): Ditto. * m4/sxe-fs-funs.m4 (_SXE_CHECK_DIRNAME_RETVAL_OWNER): Ditto. * m4/sxe-fs-funs.m4 (_SXE_CHECK_DIRNAME_RETVAL_OWNER): Avoid a core in MacOS X by pre-choosing sys as the result. Signed-off-by: Nelson Ferreira --- m4/sxe-fs-funs.m4 | 61 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/m4/sxe-fs-funs.m4 b/m4/sxe-fs-funs.m4 index 77f2ce3..99ee02a 100644 --- a/m4/sxe-fs-funs.m4 +++ b/m4/sxe-fs-funs.m4 @@ -48,8 +48,7 @@ AC_DEFUN([_SXE_CHECK_REALPATH_RETVAL], [dnl #define PATH_MAX 4096 #endif -int main() -{ +int realpath_returns_]]ret_t[[() { ]]ret_t[[ r; char p[8] = "/bin/sh\000"; char resv[PATH_MAX]; @@ -64,6 +63,11 @@ int main() } return res; } + +int main() +{ + return realpath_returns_]]ret_t[[(); +} ]])], resvar[=yes], resvar[=no], @@ -109,7 +113,7 @@ AC_DEFUN([_SXE_CHECK_REALPATH_RETVAL_OWNER], [dnl #define FOLLOW_FREE_STRATEGY 1 #define FOLLOW_REALLOC_STRATEGY 1 -int main() +int owner_of_object_returned_by_realpath() { void *r; /* any pointer is just fine */ char p[8] = "/bin/sh\000"; @@ -128,6 +132,11 @@ int main() #else return 1; #endif +} + +int main() +{ + return owner_of_object_returned_by_realpath(); } ]])], resvar[=user], @@ -164,13 +173,18 @@ AC_DEFUN([_SXE_CHECK_REALPATH_ON_PROTECTED_MEMORY], [dnl #define PATH_MAX 4096 #endif -int main() +int realpath_can_operate_on_protected_mem_blocks() { char resv[PATH_MAX]; realpath("/bin/sh", NULL); realpath("/bin/sh", resv); return 0; } + +int main() +{ + return realpath_can_operate_on_protected_mem_blocks(); +} ]])], resvar[=yes], resvar[=no], @@ -202,7 +216,7 @@ AC_DEFUN([_SXE_CHECK_REALPATH_SANE_ON_NON_EXISTENT], [dnl static char p[24] = "/nobody/has/this/file\000"; -int main() +int realpath_survives_non_existent_path() { char *r; char resv[PATH_MAX]; @@ -210,6 +224,11 @@ int main() return ((r == NULL) == 0); } + +int main() +{ + return realpath_survives_non_existent_path(); +} ]])], resvar[=yes], resvar[=no], @@ -287,12 +306,17 @@ AC_DEFUN([_SXE_CHECK_DIRNAME_SIDE_EFFECT], [dnl # include #endif -int main() +int dirname_modifies_argument() { char p[11] = "somefile\000"; dirname(p); return ((p[0] == '.' && p[1] == '\0') == 0); } + +int main() +{ + return dirname_modifies_argument(); +} ]])], resvar[=yes], resvar[=no], @@ -370,6 +394,9 @@ AC_DEFUN([_SXE_CHECK_DIRNAME_RETVAL_OWNER], [dnl ## anything ... took me fucking ages to find out what's going on ## so let's drink to the morons responsible for THAT! AC_MSG_CHECKING([to whom belongs the object returned by dirname]) + if test "$opsys" = "darwin" ; then + resvar=sys + else AC_RUN_IFELSE([AC_LANG_SOURCE([[ #ifdef HAVE_LIBGEN_H # include @@ -378,7 +405,7 @@ AC_DEFUN([_SXE_CHECK_DIRNAME_RETVAL_OWNER], [dnl #define FOLLOW_FREE_STRATEGY 1 #define FOLLOW_REALLOC_STRATEGY 1 -int main() +int owner_of_object_returned_by_dirname() { void *r; /* any pointer is just fine */ char p[11] = "./somefile\000"; @@ -397,11 +424,17 @@ int main() #else return 1; #endif +} + +int main() +{ + return owner_of_object_returned_by_dirname(); } ]])], resvar[=user], resvar[=sys], resvar[=sys]) + fi if test "${malloc_check}" = "" ; then unset MALLOC_CHECK_ else @@ -430,11 +463,16 @@ AC_DEFUN([_SXE_CHECK_DIRNAME_ON_PROTECTED_MEMORY], [dnl # include #endif -int main() +int dirname_can_operate_on_protected_mem_blocks() { dirname("./somefile"); return 0; } + +int main() +{ + return dirname_can_operate_on_protected_mem_blocks(); +} ]])], resvar[=yes], resvar[=no], @@ -464,12 +502,17 @@ AC_DEFUN([_SXE_CHECK_DIRNAME_ON_C99_RESTRICT_MEMORY], [dnl static char f[11] = "./somefile\000"; -int main() +int dirname_can_operate_on_c99_restrict() { const char *restrict p = &f; dirname((char*)p); return 0; } + +int main() +{ + return dirname_can_operate_on_c99_restrict(); +} ]])], resvar[=yes], resvar[=no], -- 2.34.1