summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2012-11-28 15:49:25 -0800
committerGerrit Code Review <noreply-gerritcodereview@google.com>2012-11-28 15:49:25 -0800
commit360f71adc9c5fcf6dafb1d4258d4a6c1e5022dd2 (patch)
tree7e7b3060182a0c9d776cdb398c9e349470b5ced3
parentd758e6092bbd733f608ea49ffdd00f0d421b4fc7 (diff)
parent959c2543dd4335f2b19daa636ffde813043654f7 (diff)
downloadping6-jb-mr1-dev-plus-aosp.tar.gz
-rw-r--r--Android.mk2
-rw-r--r--ping6.c24
2 files changed, 25 insertions, 1 deletions
diff --git a/Android.mk b/Android.mk
index 0991eeb..d20d1c1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -3,5 +3,5 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= ping6.c
LOCAL_MODULE := ping6
-LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE_TAGS := debug
include $(BUILD_EXECUTABLE)
diff --git a/ping6.c b/ping6.c
index ccf9c4c..fc1eb84 100644
--- a/ping6.c
+++ b/ping6.c
@@ -131,6 +131,8 @@ __RCSID("$NetBSD: ping6.c,v 1.73 2010/09/20 11:49:48 ahoka Exp $");
#include <unistd.h>
#include <poll.h>
+#include <private/android_filesystem_config.h>
+
#ifdef IPSEC
#include <netinet6/ah.h>
#include <netinet6/ipsec.h>
@@ -298,6 +300,23 @@ char *nigroup(char *);
void usage(void);
int
+isInSupplementaryGroup(gid_t group)
+{
+ int numgroups, i;
+ gid_t groups[sysconf(_SC_NGROUPS_MAX) + 1];
+ numgroups = getgroups(sizeof(groups) / sizeof(groups[0]), groups);
+ if (numgroups < 0) {
+ perror("getgroups");
+ return 0;
+ }
+ for (i = 0; i < numgroups; i++) {
+ if (group == groups[i])
+ return 1;
+ }
+ return 0;
+}
+
+int
main(int argc, char *argv[])
{
struct itimerval itimer;
@@ -331,6 +350,11 @@ main(int argc, char *argv[])
int mflag = 0;
#endif
+ if (getuid() != 0 && !isInSupplementaryGroup(AID_INET)) {
+ fprintf(stderr, "%s: not root or in group AID_INET\n", argv[0]);
+ exit(3);
+ }
+
/* just to be sure */
memset(&smsghdr, 0, sizeof(smsghdr));
memset(&smsgiov, 0, sizeof(smsgiov));