--- embedaddon/sudo/plugins/system_group/system_group.c	2013/07/22 10:46:13	1.1.1.3
+++ embedaddon/sudo/plugins/system_group/system_group.c	2014/06/15 16:12:55	1.1.1.4
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2010-2014 Todd C. Miller <Todd.Miller@courtesan.com>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -45,11 +45,6 @@
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif /* HAVE_UNISTD_H */
-#ifdef HAVE_DLOPEN
-# include <dlfcn.h>
-#else
-# include "compat/dlfcn.h"
-#endif
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -57,13 +52,11 @@
 #include <grp.h>
 #include <pwd.h>
 
-#include "sudo_plugin.h"
 #include "missing.h"
+#include "sudo_dso.h"
+#include "sudo_plugin.h"
+#include "sudo_util.h"
 
-#ifndef RTLD_DEFAULT
-# define RTLD_DEFAULT	NULL
-#endif
-
 /*
  * Sudoers group plugin that does group name-based lookups using the system
  * group database functions, similar to how sudo behaved prior to 1.7.3.
@@ -97,7 +90,7 @@ sysgroup_init(int version, sudo_printf_t sudo_printf, 
     }
 
     /* Share group cache with sudo if possible. */
-    handle = dlsym(RTLD_DEFAULT, "sudo_getgrnam");
+    handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_getgrnam");
     if (handle != NULL) {
 	sysgroup_getgrnam = (sysgroup_getgrnam_t)handle;
     } else {
@@ -105,7 +98,7 @@ sysgroup_init(int version, sudo_printf_t sudo_printf, 
 	need_setent = true;
     }
 
-    handle = dlsym(RTLD_DEFAULT, "sudo_getgrgid");
+    handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_getgrgid");
     if (handle != NULL) {
 	sysgroup_getgrgid = (sysgroup_getgrgid_t)handle;
     } else {
@@ -113,7 +106,7 @@ sysgroup_init(int version, sudo_printf_t sudo_printf, 
 	need_setent = true;
     }
 
-    handle = dlsym(RTLD_DEFAULT, "sudo_gr_delref");
+    handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_gr_delref");
     if (handle != NULL)
 	sysgroup_gr_delref = (sysgroup_gr_delref_t)handle;
 
@@ -136,23 +129,24 @@ sysgroup_cleanup(void)
 static int
 sysgroup_query(const char *user, const char *group, const struct passwd *pwd)
 {
-    char **member, *ep = '\0';
+    char **member;
     struct group *grp;
 
     grp = sysgroup_getgrnam(group);
     if (grp == NULL && group[0] == '#' && group[1] != '\0') {
-	long lval = strtol(group + 1, &ep, 10);
-	if (*ep == '\0') {
-	    if ((lval != LONG_MAX && lval != LONG_MIN) || errno != ERANGE)
-		grp = sysgroup_getgrgid((gid_t)lval);
-	}
+	const char *errstr;
+	gid_t gid = atoid(group + 1, NULL, NULL, &errstr);
+	if (errstr == NULL)
+	    grp = sysgroup_getgrgid(gid);
     }
     if (grp != NULL) {
-	for (member = grp->gr_mem; *member != NULL; member++) {
-	    if (strcasecmp(user, *member) == 0) {
-		if (sysgroup_gr_delref)
-		    sysgroup_gr_delref(grp);
-		return true;
+	if (grp->gr_mem != NULL) {
+	    for (member = grp->gr_mem; *member != NULL; member++) {
+		if (strcasecmp(user, *member) == 0) {
+		    if (sysgroup_gr_delref)
+			sysgroup_gr_delref(grp);
+		    return true;
+		}
 	    }
 	}
 	if (sysgroup_gr_delref)