[glib: 2/3] g_check_setuid: implement using getauxval(AT_SECURE) with glibc
- From: Xavier Claessens <xclaesse src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 2/3] g_check_setuid: implement using getauxval(AT_SECURE) with glibc
- Date: Thu, 31 May 2018 16:21:15 +0000 (UTC)
commit a7fefb0e4ef17883f55a0798c925c6f8d98ae964
Author: Christoph Reiter <creiter src gnome org>
Date: Thu May 31 11:31:23 2018 +0200
g_check_setuid: implement using getauxval(AT_SECURE) with glibc
See commit 4c2928a544829 for why checking AT_SECURE is preferable compared
to UID checks as currently done in the fallback case.
getauxval() was added with glibc 2.16
While glibc <2.19 didn't provide a way to differentiate a 0 return value from an error,
passing AT_SECURE should always succeed according to
https://sourceware.org/ml/libc-alpha/2014-07/msg00407.html
I've added an errno check anyway, to be on the safe side.
config.h.meson | 3 +++
configure.ac | 2 +-
glib/gutils.c | 15 +++++++++++++--
meson.build | 1 +
4 files changed, 18 insertions(+), 3 deletions(-)
---
diff --git a/config.h.meson b/config.h.meson
index 5752751ed..e9f4c4e6d 100644
--- a/config.h.meson
+++ b/config.h.meson
@@ -525,6 +525,9 @@
*/
#mesondefine HAVE_SYS_DIR_H
+/* Define to 1 if you have the <sys/auxv.h> header file. */
+#mesondefine HAVE_SYS_AUXV_H
+
/* Define to 1 if you have the <sys/event.h> header file. */
#mesondefine HAVE_SYS_EVENT_H
diff --git a/configure.ac b/configure.ac
index 18752b264..8d05659ca 100644
--- a/configure.ac
+++ b/configure.ac
@@ -674,7 +674,7 @@ fi
# check for header files
AC_CHECK_HEADERS([sys/param.h sys/resource.h mach/mach_time.h])
AC_CHECK_HEADERS([sys/select.h stdint.h inttypes.h sched.h malloc.h])
-AC_CHECK_HEADERS([sys/vfs.h sys/vmount.h sys/statfs.h sys/statvfs.h sys/filio.h])
+AC_CHECK_HEADERS([sys/vfs.h sys/vmount.h sys/statfs.h sys/statvfs.h sys/filio.h sys/auxv.h])
AC_CHECK_HEADERS([mntent.h sys/mnttab.h sys/vfstab.h sys/mntctl.h fstab.h])
AC_CHECK_HEADERS([linux/magic.h])
AC_CHECK_HEADERS([termios.h])
diff --git a/glib/gutils.c b/glib/gutils.c
index 5527a402c..2b750aba9 100644
--- a/glib/gutils.c
+++ b/glib/gutils.c
@@ -50,6 +50,9 @@
#ifdef HAVE_CRT_EXTERNS_H
#include <crt_externs.h> /* for _NSGetEnviron */
#endif
+#ifdef HAVE_SYS_AUXV_H
+#include <sys/auxv.h>
+#endif
#include "glib-init.h"
#include "glib-private.h"
@@ -2500,9 +2503,17 @@ const gchar *g_get_tmp_dir_utf8 (void) { return g_get_tmp_dir (); }
gboolean
g_check_setuid (void)
{
-/* TODO: use getauxval(AT_SECURE) if available */
+#if defined(HAVE_SYS_AUXV_H)
+ unsigned long value;
+ int errsv;
-#if defined(HAVE_ISSETUGID) && !defined(__BIONIC__)
+ errno = 0;
+ value = getauxval (AT_SECURE);
+ errsv = errno;
+ if (errsv)
+ g_error ("getauxval () failed: %s", g_strerror (errsv));
+ return value;
+#elif defined(HAVE_ISSETUGID) && !defined(__BIONIC__)
/* BSD: http://www.freebsd.org/cgi/man.cgi?query=issetugid&sektion=2 */
/* Android had it in older versions but the new 64 bit ABI does not
diff --git a/meson.build b/meson.build
index 6eb67cff2..a89ca55cd 100644
--- a/meson.build
+++ b/meson.build
@@ -229,6 +229,7 @@ headers = [
'stdlib.h',
'string.h',
'strings.h',
+ 'sys/auxv.h',
'sys/event.h',
'sys/filio.h',
'sys/inotify.h',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]