diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-09-12 20:29:09 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-09-12 20:29:09 +0200 |
commit | 643b6140873e0e6f297df0cbca11bc1ea1f21925 (patch) | |
tree | 5d1fcafcd7395aefe6e0e73503758705a766e991 | |
parent | 274cea35c6d409cfb16862ff24e789b2d3ea3ee3 (diff) | |
download | vim-git-643b6140873e0e6f297df0cbca11bc1ea1f21925.tar.gz |
patch 8.1.0371: argument types for select() may be wrongv8.1.0371
Problem: Argument types for select() may be wrong.
Solution: Use a configure macro. (Tobias Ulmer)
-rwxr-xr-x | src/auto/configure | 75 | ||||
-rw-r--r-- | src/config.h.in | 3 | ||||
-rw-r--r-- | src/configure.ac | 1 | ||||
-rw-r--r-- | src/os_unix.c | 27 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 85 insertions, 23 deletions
diff --git a/src/auto/configure b/src/auto/configure index 0ab7e2302..74d3e7219 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -12630,6 +12630,81 @@ _ACEOF fi done +for ac_header in sys/select.h sys/socket.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 +$as_echo_n "checking types of arguments for select... " >&6; } +if ${ac_cv_func_select_args+:} false; then : + $as_echo_n "(cached) " >&6 +else + for ac_arg234 in 'fd_set *' 'int *' 'void *'; do + for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do + for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +#ifdef HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif + +int +main () +{ +extern int select ($ac_arg1, + $ac_arg234, $ac_arg234, $ac_arg234, + $ac_arg5); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + done +done +# Provide a safe default value. +: "${ac_cv_func_select_args=int,int *,struct timeval *}" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 +$as_echo "$ac_cv_func_select_args" >&6; } +ac_save_IFS=$IFS; IFS=',' +set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` +IFS=$ac_save_IFS +shift + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG1 $1 +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG234 ($2) +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SELECT_TYPE_ARG5 ($3) +_ACEOF + +rm -f conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : diff --git a/src/config.h.in b/src/config.h.in index 00117cf8c..09420d211 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -113,6 +113,9 @@ /* Define if you can safely include both <sys/time.h> and <sys/select.h>. */ #undef SYS_SELECT_WITH_SYS_TIME +/* Define to a typecast for select() arguments 2, 3 and 4. */ +#undef SELECT_TYPE_ARG234 + /* Define if you have /dev/ptc */ #undef HAVE_DEV_PTC diff --git a/src/configure.ac b/src/configure.ac index 8994f3c90..9f17b9c70 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -3721,6 +3721,7 @@ AC_CHECK_FUNCS(fchdir fchown fchmod fsync getcwd getpseudotty \ sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp \ strnicmp strpbrk strtol tgetent towlower towupper iswupper \ usleep utime utimes mblen ftruncate unsetenv) +AC_FUNC_SELECT_ARGTYPES AC_FUNC_FSEEKO dnl define _LARGE_FILES, _FILE_OFFSET_BITS and _LARGEFILE_SOURCE when diff --git a/src/os_unix.c b/src/os_unix.c index f33042675..aee3a35ff 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -18,17 +18,6 @@ * changed beyond recognition. */ -/* - * Some systems have a prototype for select() that has (int *) instead of - * (fd_set *), which is wrong. This define removes that prototype. We define - * our own prototype below. - * Don't use it for the Mac, it causes a warning for precompiled headers. - * TODO: use a configure check for precompiled headers? - */ -#if !defined(__APPLE__) && !defined(__TANDEM) -# define select select_declared_wrong -#endif - #include "vim.h" #ifdef FEAT_MZSCHEME @@ -54,14 +43,9 @@ static int selinux_enabled = -1; # endif #endif -/* - * Use this prototype for select, some include files have a wrong prototype - */ -#ifndef __TANDEM +#ifdef __BEOS__ # undef select -# ifdef __BEOS__ -# define select beos_select -# endif +# define select beos_select #endif #ifdef __CYGWIN__ @@ -77,10 +61,6 @@ static int selinux_enabled = -1; # endif #endif -#if defined(HAVE_SELECT) -extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *); -#endif - #ifdef FEAT_MOUSE_GPM # include <gpm.h> /* <linux/keyboard.h> contains defines conflicting with "keymap.h", @@ -6316,7 +6296,8 @@ select_eintr: if (interrupted != NULL) *interrupted = FALSE; - ret = select(maxfd + 1, &rfds, &wfds, &efds, tvp); + ret = select(maxfd + 1, SELECT_TYPE_ARG234 &rfds, + SELECT_TYPE_ARG234 &wfds, SELECT_TYPE_ARG234 &efds, tvp); result = ret > 0 && FD_ISSET(fd, &rfds); if (result) --ret; diff --git a/src/version.c b/src/version.c index fc93cbf67..88e50c1d1 100644 --- a/src/version.c +++ b/src/version.c @@ -795,6 +795,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 371, +/**/ 370, /**/ 369, |