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