Diff for /embedaddon/sudo/plugins/sudoers/pwutil.c between versions 1.1.1.4 and 1.1.1.5

version 1.1.1.4, 2013/07/22 10:46:12 version 1.1.1.5, 2014/06/15 16:12:54
Line 145  sudo_getpwuid(uid_t uid) Line 145  sudo_getpwuid(uid_t uid)
         /* item->d.pw = NULL; */          /* item->d.pw = NULL; */
     }      }
     if (rbinsert(pwcache_byuid, item) != NULL)      if (rbinsert(pwcache_byuid, item) != NULL)
        fatalx(_("unable to cache uid %u, already exists"),        fatalx(U_("unable to cache uid %u, already exists"),
             (unsigned int) uid);              (unsigned int) uid);
 #ifdef HAVE_SETAUTHDB  #ifdef HAVE_SETAUTHDB
     aix_restoreauthdb();      aix_restoreauthdb();
Line 187  sudo_getpwnam(const char *name) Line 187  sudo_getpwnam(const char *name)
         /* item->d.pw = NULL; */          /* item->d.pw = NULL; */
     }      }
     if (rbinsert(pwcache_byname, item) != NULL)      if (rbinsert(pwcache_byname, item) != NULL)
        fatalx(_("unable to cache user %s, already exists"), name);        fatalx(U_("unable to cache user %s, already exists"), name);
 #ifdef HAVE_SETAUTHDB  #ifdef HAVE_SETAUTHDB
     aix_restoreauthdb();      aix_restoreauthdb();
 #endif  #endif
Line 270  sudo_mkpwent(const char *user, uid_t uid, gid_t gid, c Line 270  sudo_mkpwent(const char *user, uid_t uid, gid_t gid, c
 struct passwd *  struct passwd *
 sudo_fakepwnam(const char *user, gid_t gid)  sudo_fakepwnam(const char *user, gid_t gid)
 {  {
       const char *errstr;
     uid_t uid;      uid_t uid;
       debug_decl(sudo_fakepwnam, SUDO_DEBUG_NSS)
   
    uid = (uid_t) atoi(user + 1);    uid = (uid_t) atoid(user + 1, NULL, NULL, &errstr);
    return sudo_mkpwent(user, uid, gid, NULL, NULL);    if (errstr != NULL) {
         sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_DIAG,
             "uid %s %s", user, errstr);
         debug_return_ptr(NULL);
     }
     debug_return_ptr(sudo_mkpwent(user, uid, gid, NULL, NULL));
 }  }
   
 void  void
Line 383  sudo_getgrgid(gid_t gid) Line 390  sudo_getgrgid(gid_t gid)
         /* item->d.gr = NULL; */          /* item->d.gr = NULL; */
     }      }
     if (rbinsert(grcache_bygid, item) != NULL)      if (rbinsert(grcache_bygid, item) != NULL)
        fatalx(_("unable to cache gid %u, already exists"),        fatalx(U_("unable to cache gid %u, already exists"),
             (unsigned int) gid);              (unsigned int) gid);
 done:  done:
     item->refcnt++;      item->refcnt++;
Line 419  sudo_getgrnam(const char *name) Line 426  sudo_getgrnam(const char *name)
         /* item->d.gr = NULL; */          /* item->d.gr = NULL; */
     }      }
     if (rbinsert(grcache_byname, item) != NULL)      if (rbinsert(grcache_byname, item) != NULL)
        fatalx(_("unable to cache group %s, already exists"), name);        fatalx(U_("unable to cache group %s, already exists"), name);
 done:  done:
     item->refcnt++;      item->refcnt++;
     debug_return_ptr(item->d.gr);      debug_return_ptr(item->d.gr);
Line 432  struct group * Line 439  struct group *
 sudo_fakegrnam(const char *group)  sudo_fakegrnam(const char *group)
 {  {
     struct cache_item_gr *gritem;      struct cache_item_gr *gritem;
       const char *errstr;
     struct group *gr;      struct group *gr;
     struct rbnode *node;      struct rbnode *node;
     size_t len, name_len;      size_t len, name_len;
Line 444  sudo_fakegrnam(const char *group) Line 452  sudo_fakegrnam(const char *group)
     for (i = 0; i < 2; i++) {      for (i = 0; i < 2; i++) {
         gritem = ecalloc(1, len);          gritem = ecalloc(1, len);
         gr = &gritem->gr;          gr = &gritem->gr;
        gr->gr_gid = (gid_t) atoi(group + 1);        gr->gr_gid = (gid_t) atoid(group + 1, NULL, NULL, &errstr);
         gr->gr_name = (char *)(gritem + 1);          gr->gr_name = (char *)(gritem + 1);
         memcpy(gr->gr_name, group, name_len + 1);          memcpy(gr->gr_name, group, name_len + 1);
           if (errstr != NULL) {
               sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_DIAG,
                   "gid %s %s", group, errstr);
               efree(gritem);
               debug_return_ptr(NULL);
           }
   
         gritem->cache.refcnt = 1;          gritem->cache.refcnt = 1;
         gritem->cache.d.gr = gr;          gritem->cache.d.gr = gr;
Line 549  sudo_endgrent(void) Line 563  sudo_endgrent(void)
 }  }
   
 struct group_list *  struct group_list *
sudo_get_grlist(struct passwd *pw)sudo_get_grlist(const struct passwd *pw)
 {  {
     struct cache_item key, *item;      struct cache_item key, *item;
     struct rbnode *node;      struct rbnode *node;
Line 575  sudo_get_grlist(struct passwd *pw) Line 589  sudo_get_grlist(struct passwd *pw)
         /* item->d.grlist = NULL; */          /* item->d.grlist = NULL; */
     }      }
     if (rbinsert(grlist_cache, item) != NULL)      if (rbinsert(grlist_cache, item) != NULL)
        fatalx(_("unable to cache group list for %s, already exists"),        fatalx(U_("unable to cache group list for %s, already exists"),
             pw->pw_name);              pw->pw_name);
 done:  done:
     item->refcnt++;      item->refcnt++;
Line 595  sudo_set_grlist(struct passwd *pw, char * const *group Line 609  sudo_set_grlist(struct passwd *pw, char * const *group
     key.k.name = pw->pw_name;      key.k.name = pw->pw_name;
     if ((node = rbfind(grlist_cache, &key)) == NULL) {      if ((node = rbfind(grlist_cache, &key)) == NULL) {
         if ((item = sudo_make_grlist_item(pw, groups, gids)) == NULL)          if ((item = sudo_make_grlist_item(pw, groups, gids)) == NULL)
            fatalx(_("unable to parse groups for %s"), pw->pw_name);            fatalx(U_("unable to parse groups for %s"), pw->pw_name);
         if (rbinsert(grlist_cache, item) != NULL)          if (rbinsert(grlist_cache, item) != NULL)
            fatalx(_("unable to cache group list for %s, already exists"),            fatalx(U_("unable to cache group list for %s, already exists"),
                 pw->pw_name);                  pw->pw_name);
     }      }
     debug_return;      debug_return;
 }  }
   
 bool  bool
user_in_group(struct passwd *pw, const char *group)user_in_group(const struct passwd *pw, const char *group)
 {  {
     struct group_list *grlist;      struct group_list *grlist;
     struct group *grp = NULL;      struct group *grp = NULL;
       const char *errstr;
     int i;      int i;
     bool matched = false;      bool matched = false;
     debug_decl(user_in_group, SUDO_DEBUG_NSS)      debug_decl(user_in_group, SUDO_DEBUG_NSS)
Line 617  user_in_group(struct passwd *pw, const char *group) Line 632  user_in_group(struct passwd *pw, const char *group)
          * If it could be a sudo-style group ID check gids first.           * If it could be a sudo-style group ID check gids first.
          */           */
         if (group[0] == '#') {          if (group[0] == '#') {
            gid_t gid = atoi(group + 1);            gid_t gid = (gid_t) atoid(group + 1, NULL, NULL, &errstr);
            if (gid == pw->pw_gid) {            if (errstr != NULL) {
                matched = true;                sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_DIAG,
                goto done;                    "gid %s %s", group, errstr);
            }            } else {
            for (i = 0; i < grlist->ngids; i++) {                if (gid == pw->pw_gid) {
                if (gid == grlist->gids[i]) { 
                     matched = true;                      matched = true;
                     goto done;                      goto done;
                   }
                   for (i = 0; i < grlist->ngids; i++) {
                       if (gid == grlist->gids[i]) {
                           matched = true;
                           goto done;
                       }
                 }                  }
             }              }
         }          }

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


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