Ignore:
Timestamp:
May 3, 2010, 1:20:42 AM (14 years ago)
Author:
andersk
Message:
Update nss_nonlocal to 1.11.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/common/oursrc/nss_nonlocal/nonlocal-passwd.c

    r1131 r1553  
    33 * passwd database for nss_nonlocal proxy.
    44 *
    5  * Copyright © 2007 Anders Kaseorg <andersk@mit.edu> and Tim Abbott
    6  * <tabbott@mit.edu>
     5 * Copyright © 2007–2010 Anders Kaseorg <andersk@mit.edu> and Tim
     6 * Abbott <tabbott@mit.edu>
    77 *
    8  * Permission is hereby granted, free of charge, to any person
    9  * obtaining a copy of this software and associated documentation
    10  * files (the "Software"), to deal in the Software without
    11  * restriction, including without limitation the rights to use, copy,
    12  * modify, merge, publish, distribute, sublicense, and/or sell copies
    13  * of the Software, and to permit persons to whom the Software is
    14  * furnished to do so, subject to the following conditions:
     8 * This file is part of nss_nonlocal.
    159 *
    16  * The above copyright notice and this permission notice shall be
    17  * included in all copies or substantial portions of the Software.
     10 * nss_nonlocal is free software; you can redistribute it and/or
     11 * modify it under the terms of the GNU Lesser General Public License
     12 * as published by the Free Software Foundation; either version 2.1 of
     13 * the License, or (at your option) any later version.
    1814 *
    19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    22  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
    23  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
    24  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    25  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    26  * SOFTWARE.
     15 * nss_nonlocal is distributed in the hope that it will be useful, but
     16 * WITHOUT ANY WARRANTY; without even the implied warranty of
     17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     18 * Lesser General Public License for more details.
     19 *
     20 * You should have received a copy of the GNU Lesser General Public
     21 * License along with nss_nonlocal; if not, write to the Free Software
     22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     23 * 02110-1301  USA
    2724 */
    2825
     
    8077    int old_errno = errno;
    8178
    82     int buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
     79    size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
    8380    char *buf = malloc(buflen);
    8481    if (buf == NULL) {
     
    126123
    127124enum nss_status
     125check_nonlocal_passwd(const char *user, struct passwd *pwd, int *errnop)
     126{
     127    enum nss_status status = NSS_STATUS_SUCCESS;
     128    int old_errno = errno;
     129    char *end;
     130    unsigned long uid;
     131
     132    errno = 0;
     133    uid = strtoul(pwd->pw_name, &end, 10);
     134    if (errno == 0 && *end == '\0' && (uid_t)uid == uid)
     135        status = check_nonlocal_uid(user, uid, errnop);
     136    errno = old_errno;
     137    if (status != NSS_STATUS_SUCCESS)
     138        return status;
     139
     140    return check_nonlocal_uid(user, pwd->pw_uid, errnop);
     141}
     142
     143enum nss_status
    128144check_nonlocal_user(const char *user, int *errnop)
    129145{
     
    141157    int old_errno = errno;
    142158
    143     int buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
     159    size_t buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
    144160    char *buf = malloc(buflen);
    145161    if (buf == NULL) {
     
    280296                status = DL_CALL_FCT(pwent_fct.l, (pwd, buffer, buflen, errnop));
    281297            while (status == NSS_STATUS_SUCCESS &&
    282                    check_nonlocal_uid(pwd->pw_name, pwd->pw_uid, &nonlocal_errno) != NSS_STATUS_SUCCESS);
     298                   check_nonlocal_passwd(pwd->pw_name, pwd, &nonlocal_errno) != NSS_STATUS_SUCCESS);
    283299        }
    284300        if (status == NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
     
    330346        return status;
    331347
    332     status = check_nonlocal_uid(name, pwd->pw_uid, errnop);
     348    if (strcmp(name, pwd->pw_name) != 0) {
     349        syslog(LOG_ERR, "nss_nonlocal: discarding user %s from lookup for user %s\n", pwd->pw_name, name);
     350        return NSS_STATUS_NOTFOUND;
     351    }
     352
     353    status = check_nonlocal_passwd(name, pwd, errnop);
    333354    if (status != NSS_STATUS_SUCCESS)
    334355        return status;
     
    376397        return status;
    377398
    378     status = check_nonlocal_uid(pwd->pw_name, pwd->pw_uid, errnop);
     399    if (uid != pwd->pw_uid) {
     400        syslog(LOG_ERR, "nss_nonlocal: discarding uid %d from lookup for uid %d\n", pwd->pw_uid, uid);
     401        return NSS_STATUS_NOTFOUND;
     402    }
     403
     404    status = check_nonlocal_passwd(pwd->pw_name, pwd, errnop);
    379405    if (status != NSS_STATUS_SUCCESS)
    380406        return status;
Note: See TracChangeset for help on using the changeset viewer.