Changeset 24122
- Timestamp:
- 10/23/09 14:09:57 (5 weeks ago)
- Location:
- trunk/debathena/debathena/libnss-nonlocal
- Files:
-
- 5 modified
-
configure.ac (modified) (1 diff)
-
debian/changelog (modified) (1 diff)
-
nonlocal-group.c (modified) (8 diffs)
-
nonlocal-passwd.c (modified) (6 diffs)
-
nonlocal-shadow.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/debathena/debathena/libnss-nonlocal/configure.ac
r23829 r24122 1 AC_INIT([nss_nonlocal], [1. 9], [andersk@mit.edu])1 AC_INIT([nss_nonlocal], [1.10], [andersk@mit.edu]) 2 2 AC_CANONICAL_TARGET 3 3 AM_INIT_AUTOMAKE([-Wall -Werror foreign]) 4 m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) 4 5 5 6 AC_PREFIX_DEFAULT([/]) -
trunk/debathena/debathena/libnss-nonlocal/debian/changelog
r23880 r24122 1 libnss-nonlocal (1.10-0debathena1) unstable; urgency=low 2 3 * New upstream version. 4 - Disallow numeric nonlocal user/group names that look like local 5 uid/gids. 6 7 -- Anders Kaseorg <andersk@mit.edu> Fri, 23 Oct 2009 13:49:43 -0400 8 1 9 libnss-nonlocal (1.9-0debathena2) unstable; urgency=low 2 10 -
trunk/debathena/debathena/libnss-nonlocal/nonlocal-group.c
r23829 r24122 82 82 int old_errno = errno; 83 83 84 int buflen = sysconf(_SC_GETGR_R_SIZE_MAX);84 size_t buflen = sysconf(_SC_GETGR_R_SIZE_MAX); 85 85 char *buf = malloc(buflen); 86 86 if (buf == NULL) { … … 128 128 129 129 enum nss_status 130 check_nonlocal_group(const char *user, struct group *grp, int *errnop) 131 { 132 enum nss_status status = NSS_STATUS_SUCCESS; 133 int old_errno = errno; 134 char *end; 135 unsigned long gid; 136 137 errno = 0; 138 gid = strtoul(grp->gr_name, &end, 10); 139 if (errno == 0 && *end == '\0' && (gid_t)gid == gid) 140 status = check_nonlocal_gid(user, gid, errnop); 141 errno = old_errno; 142 if (status != NSS_STATUS_SUCCESS) 143 return status; 144 145 return check_nonlocal_gid(user, grp->gr_gid, errnop); 146 } 147 148 enum nss_status 130 149 get_local_group(const char *name, struct group *grp, char **buffer, int *errnop) 131 150 { … … 281 300 status = DL_CALL_FCT(grent_fct.l, (grp, buffer, buflen, errnop)); 282 301 while (status == NSS_STATUS_SUCCESS && 283 check_nonlocal_g id("(unknown)", grp->gr_gid, &nonlocal_errno) != NSS_STATUS_SUCCESS);302 check_nonlocal_group("(unknown)", grp, &nonlocal_errno) != NSS_STATUS_SUCCESS); 284 303 } 285 304 if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) … … 330 349 return status; 331 350 332 return check_nonlocal_gid(name, grp->gr_gid, errnop); 351 if (strcmp(name, grp->gr_name) != 0) { 352 syslog(LOG_ERR, "nss_nonlocal: discarding group %s from lookup for group %s\n", grp->gr_name, name); 353 return NSS_STATUS_NOTFOUND; 354 } 355 356 return check_nonlocal_group(name, grp, errnop); 333 357 } 334 358 … … 368 392 return status; 369 393 370 return check_nonlocal_g id(grp->gr_name, grp->gr_gid, errnop);394 return check_nonlocal_group(grp->gr_name, grp, errnop); 371 395 } 372 396 … … 391 415 int is_local = 0; 392 416 char *buffer; 417 int old_errno; 418 int in, out, i; 393 419 394 420 /* Check that the user is a nonlocal user before adding any groups. */ … … 399 425 is_local = 1; 400 426 401 intold_errno = errno;427 old_errno = errno; 402 428 403 429 status = get_local_group(MAGIC_LOCAL_GROUPNAME, … … 462 488 return NSS_STATUS_SUCCESS; 463 489 464 in t in = *start, out = *start, i;490 in = out = *start; 465 491 466 492 nip = nss_group_nonlocal_database(); -
trunk/debathena/debathena/libnss-nonlocal/nonlocal-passwd.c
r23829 r24122 80 80 int old_errno = errno; 81 81 82 int buflen = sysconf(_SC_GETPW_R_SIZE_MAX);82 size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); 83 83 char *buf = malloc(buflen); 84 84 if (buf == NULL) { … … 126 126 127 127 enum nss_status 128 check_nonlocal_passwd(const char *user, struct passwd *pwd, int *errnop) 129 { 130 enum nss_status status = NSS_STATUS_SUCCESS; 131 int old_errno = errno; 132 char *end; 133 unsigned long uid; 134 135 errno = 0; 136 uid = strtoul(pwd->pw_name, &end, 10); 137 if (errno == 0 && *end == '\0' && (uid_t)uid == uid) 138 status = check_nonlocal_uid(user, uid, errnop); 139 errno = old_errno; 140 if (status != NSS_STATUS_SUCCESS) 141 return status; 142 143 return check_nonlocal_uid(user, pwd->pw_uid, errnop); 144 } 145 146 enum nss_status 128 147 check_nonlocal_user(const char *user, int *errnop) 129 148 { … … 141 160 int old_errno = errno; 142 161 143 int buflen = sysconf(_SC_GETPW_R_SIZE_MAX);162 size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX); 144 163 char *buf = malloc(buflen); 145 164 if (buf == NULL) { … … 280 299 status = DL_CALL_FCT(pwent_fct.l, (pwd, buffer, buflen, errnop)); 281 300 while (status == NSS_STATUS_SUCCESS && 282 check_nonlocal_ uid(pwd->pw_name, pwd->pw_uid, &nonlocal_errno) != NSS_STATUS_SUCCESS);301 check_nonlocal_passwd(pwd->pw_name, pwd, &nonlocal_errno) != NSS_STATUS_SUCCESS); 283 302 } 284 303 if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE) … … 330 349 return status; 331 350 332 status = check_nonlocal_uid(name, pwd->pw_uid, errnop); 351 if (strcmp(name, pwd->pw_name) != 0) { 352 syslog(LOG_ERR, "nss_nonlocal: discarding user %s from lookup for user %s\n", pwd->pw_name, name); 353 return NSS_STATUS_NOTFOUND; 354 } 355 356 status = check_nonlocal_passwd(name, pwd, errnop); 333 357 if (status != NSS_STATUS_SUCCESS) 334 358 return status; … … 376 400 return status; 377 401 378 status = check_nonlocal_ uid(pwd->pw_name, pwd->pw_uid, errnop);402 status = check_nonlocal_passwd(pwd->pw_name, pwd, errnop); 379 403 if (status != NSS_STATUS_SUCCESS) 380 404 return status; -
trunk/debathena/debathena/libnss-nonlocal/nonlocal-shadow.c
r22686 r24122 34 34 #include <dlfcn.h> 35 35 #include <stdio.h> 36 #include <syslog.h> 36 37 #include <errno.h> 37 38 #include <shadow.h> … … 180 181 break; 181 182 } while (__nss_next(&nip, fct_name, &fct.ptr, status, 0) == 0); 182 return status; 183 if (status != NSS_STATUS_SUCCESS) 184 return status; 185 186 if (strcmp(name, pwd->sp_namp) != 0) { 187 syslog(LOG_ERR, "nss_nonlocal: discarding shadow %s from lookup for shadow %s\n", pwd->sp_namp, name); 188 return NSS_STATUS_NOTFOUND; 189 } 190 191 return NSS_STATUS_SUCCESS; 183 192 }
