From b381e2c60e3f5f9404fe070082d164bf99020869 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 11 Jul 2011 14:35:04 +0000 Subject: [PATCH] bincheck --- src/include/gnunet_os_lib.h | 12 ++++++------ src/util/os_installation.c | 36 ++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/include/gnunet_os_lib.h b/src/include/gnunet_os_lib.h index 13e0b7a98..715061161 100644 --- a/src/include/gnunet_os_lib.h +++ b/src/include/gnunet_os_lib.h @@ -341,15 +341,15 @@ GNUNET_OS_install_parent_control_handler (void *cls, /** - * Check whether the suid bit is set on a file. Attempts to find the - * file using the current PATH environment variable as a search path. - * On W32, if the binary exists, this function tests if we are running - * with administrative rights (sufficient to create RAW sockets). + * Check whether an executable exists and possibly + * if the suid bit is set on the file. + * Attempts to find the file using the current + * PATH environment variable as a search path. * * @param binary the name of the file to check * @return GNUNET_YES if the file is SUID, - * GNUNET_NO if not, - * GNUNET_SYSERR on error + * GNUNET_NO if not SUID (but binary exists) + * GNUNET_SYSERR on error (no such binary or not executable) */ int GNUNET_OS_check_helper_binary (const char *binary); diff --git a/src/util/os_installation.c b/src/util/os_installation.c index 9bf260979..36627a8d8 100644 --- a/src/util/os_installation.c +++ b/src/util/os_installation.c @@ -438,14 +438,15 @@ GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind) /** - * Check whether the suid bit is set on a file. + * Check whether an executable exists and possibly + * if the suid bit is set on the file. * Attempts to find the file using the current * PATH environment variable as a search path. * * @param binary the name of the file to check * @return GNUNET_YES if the file is SUID, - * GNUNET_NO if not, - * GNUNET_SYSERR on error + * GNUNET_NO if not SUID (but binary exists) + * GNUNET_SYSERR on error (no such binary or not executable) */ int GNUNET_OS_check_helper_binary (const char *binary) @@ -477,11 +478,10 @@ GNUNET_OS_check_helper_binary (const char *binary) #endif if (p == NULL) { - GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, - "tcp", - _("Could not find binary `%s' in PATH!\n"), - binary); - return GNUNET_NO; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + _("Could not find binary `%s' in PATH!\n"), + binary); + return GNUNET_SYSERR; } if (0 != STAT (p, &statbuf)) { @@ -492,20 +492,28 @@ GNUNET_OS_check_helper_binary (const char *binary) GNUNET_free (p); return GNUNET_SYSERR; } - GNUNET_free (p); #ifndef MINGW if ( (0 != (statbuf.st_mode & S_ISUID)) && (statbuf.st_uid == 0) ) - return GNUNET_YES; - return GNUNET_NO; + { + GNUNET_free (p); + return GNUNET_YES; + } + if (0 == ACCESS (p, X_OK)) + { + GNUNET_free (p); + return GNUNET_NO; + } + GNUNET_free (p); + return GNUNET_SYSERR; #else + GNUNET_free (p); rawsock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); if (INVALID_SOCKET == rawsock) { DWORD err = GetLastError (); - GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, - "tcp", - "socket (AF_INET, SOCK_RAW, IPPROTO_ICMP) failed! GLE = %d\n", err); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "socket (AF_INET, SOCK_RAW, IPPROTO_ICMP) failed! GLE = %d\n", err); return GNUNET_NO; /* not running as administrator */ } closesocket (rawsock); -- 2.25.1