# HG changeset patch # User Christian Brabandt # Date 1536777005 -7200 # Node ID cf33c47d66aabb43121ea43d3c98923c651bc510 # Parent 4a59997ed10016385039725bae34253bea623db2 patch 8.1.0371: argument types for select() may be wrong commit https://github.com/vim/vim/commit/643b6140873e0e6f297df0cbca11bc1ea1f21925 Author: Bram Moolenaar Date: Wed Sep 12 20:29:09 2018 +0200 patch 8.1.0371: argument types for select() may be wrong Problem: Argument types for select() may be wrong. Solution: Use a configure macro. (Tobias Ulmer) diff --git a/src/auto/configure b/src/auto/configure --- a/src/auto/configure +++ b/src/auto/configure @@ -12630,6 +12630,81 @@ if eval test \"x\$"$as_ac_var"\" = x"yes 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 +#endif +#ifdef HAVE_SYS_SOCKET_H +# include +#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 --- a/src/config.h.in +++ b/src/config.h.in @@ -113,6 +113,9 @@ /* Define if you can safely include both and . */ #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 --- a/src/configure.ac +++ b/src/configure.ac @@ -3721,6 +3721,7 @@ AC_CHECK_FUNCS(fchdir fchown fchmod fsyn 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 --- 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 /* 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 --- 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,