Blame src/util.c

Packit Service 466431
/* Copyright (C) 2017 mod_auth_gssapi contributors - See COPYING for (C) terms */
Packit Service 466431
Packit Service 466431
#include "mod_auth_gssapi.h"
Packit Service 466431
Packit Service 466431
#define NSS_BUF_MIN 1024
Packit Service 466431
#define NSS_BUF_MAX 1024*1024
Packit Service 466431
static char *get_buf(char *cur, size_t *len)
Packit Service 466431
{
Packit Service 466431
    if (*len == 0) {
Packit Service 466431
        *len = NSS_BUF_MIN;
Packit Service 466431
    } else {
Packit Service 466431
        *len *= 2;
Packit Service 466431
    }
Packit Service 466431
    if (*len > NSS_BUF_MAX) {
Packit Service 466431
        *len = 0; /* will free the buf and return NULL */
Packit Service 466431
    }
Packit Service 466431
    return realloc(cur, *len);
Packit Service 466431
}
Packit Service 466431
Packit Service 466431
int mag_get_user_uid(const char *name, uid_t *uid)
Packit Service 466431
{
Packit Service 466431
    struct passwd pwd, *user;
Packit Service 466431
    size_t buflen = 0;
Packit Service 466431
    char *buf = NULL;
Packit Service 466431
    int ret;
Packit Service 466431
Packit Service 466431
    do {
Packit Service 466431
        buf = get_buf(buf, &buflen);
Packit Service 466431
        if (buf == NULL || buflen == 0) {
Packit Service 466431
            ret = ENOMEM;
Packit Service 466431
            break;
Packit Service 466431
        }
Packit Service 466431
        ret = getpwnam_r(name, &pwd, buf, buflen, &user);
Packit Service 466431
    } while (ret == ERANGE);
Packit Service 466431
    if (ret != 0 || user != &pwd) {
Packit Service 466431
        ret = (ret == 0) ? EINVAL : ret;
Packit Service 466431
    } else {
Packit Service 466431
        *uid = user->pw_uid;
Packit Service 466431
    }
Packit Service 466431
    free(buf);
Packit Service 466431
    return ret;
Packit Service 466431
}
Packit Service 466431
Packit Service 466431
int mag_get_group_gid(const char *name, gid_t *gid)
Packit Service 466431
{
Packit Service 466431
    struct group grp, *group;
Packit Service 466431
    size_t buflen = 0;
Packit Service 466431
    char *buf = NULL;
Packit Service 466431
    int ret;
Packit Service 466431
Packit Service 466431
    do {
Packit Service 466431
        buf = get_buf(buf, &buflen);
Packit Service 466431
        if (buf == NULL || buflen == 0) {
Packit Service 466431
            ret = ENOMEM;
Packit Service 466431
            break;
Packit Service 466431
        }
Packit Service 466431
        ret = getgrnam_r(name, &grp, buf, buflen, &group);
Packit Service 466431
    } while (ret == ERANGE);
Packit Service 466431
    if (ret != 0 || group != &grp) {
Packit Service 466431
        ret = (ret == 0) ? EINVAL : ret;
Packit Service 466431
    } else {
Packit Service 466431
        *gid = group->gr_gid;
Packit Service 466431
    }
Packit Service 466431
    free(buf);
Packit Service 466431
    return ret;
Packit Service 466431
}
Packit Service 466431
Packit Service 466431
bool mag_strbuf_equal(const char *str, gss_buffer_t buf)
Packit Service 466431
{
Packit Service 466431
    if (strncmp(str, buf->value, buf->length) != 0) return false;
Packit Service 466431
    return buf->length == strlen(str);
Packit Service 466431
}