Diff for /embedaddon/sudo/plugins/system_group/system_group.c between versions 1.1.1.3 and 1.1.1.4

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)

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>