--- embedaddon/sudo/plugins/system_group/system_group.c 2012/05/29 12:26:49 1.1.1.1 +++ 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, 2012 Todd C. Miller + * Copyright (c) 2010-2014 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -17,7 +17,6 @@ #include #include -#include #include #include @@ -46,11 +45,6 @@ #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ -#ifdef HAVE_DLOPEN -# include -#else -# include "compat/dlfcn.h" -#endif #include #include #include @@ -58,13 +52,11 @@ #include #include -#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. @@ -98,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 { @@ -106,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 { @@ -114,7 +106,7 @@ sysgroup_init(int version, sudo_printf_t sudo_printf, need_setent = true; } - handle = dlsym(RTLD_DEFAULT, "gr_delref"); + handle = sudo_dso_findsym(SUDO_DSO_DEFAULT, "sudo_gr_delref"); if (handle != NULL) sysgroup_gr_delref = (sysgroup_gr_delref_t)handle; @@ -137,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) @@ -163,7 +156,7 @@ sysgroup_query(const char *user, const char *group, co return false; } -struct sudoers_group_plugin group_plugin = { +__dso_public struct sudoers_group_plugin group_plugin = { GROUP_API_VERSION, sysgroup_init, sysgroup_cleanup,