Skip to content

Commit 9813eb4

Browse files
committed
Handle extra large NSS entries
Signed-off-by: Simo Sorce <simo@redhat.com> Reviewed-by: Robbie Harwood <rharwood@redhat.com> Closes #152
1 parent 7cddf31 commit 9813eb4

File tree

4 files changed

+78
-18
lines changed

4 files changed

+78
-18
lines changed

src/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dist_noinst_HEADERS = \
1111
mod_auth_gssapi.h crypto.h sessions.h environ.h mag_parse.h
1212

1313
mod_auth_gssapi_la_SOURCES = \
14-
mod_auth_gssapi.c crypto.c sessions.c environ.c lex.l parser.y
14+
mod_auth_gssapi.c crypto.c sessions.c environ.c util.c lex.l parser.y
1515
mod_auth_gssapi_la_CFLAGS = \
1616
$(MAG_CFLAGS)
1717
mod_auth_gssapi_la_LIBADD = \

src/mod_auth_gssapi.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,7 +1516,7 @@ static const char *mag_deleg_ccache_dir(cmd_parms *parms, void *mconfig,
15161516
#define CCMODE "mode:"
15171517
#define CCUID "uid:"
15181518
#define CCGID "gid:"
1519-
#define NSS_BUF_LEN 2048 /* just use a uid/gid number if not big enough */
1519+
15201520
static const char *mag_deleg_ccache_perms(cmd_parms *parms, void *mconfig,
15211521
const char *w)
15221522
{
@@ -1550,15 +1550,11 @@ static const char *mag_deleg_ccache_perms(cmd_parms *parms, void *mconfig,
15501550
cfg->deleg_ccache_uid = 0;
15511551
}
15521552
} else {
1553-
struct passwd pwd, *user;
1554-
char buf[NSS_BUF_LEN];
1555-
int ret = getpwnam_r(p, &pwd, buf, NSS_BUF_LEN, &user);
1556-
if ((ret != 0) || user != &pwd) {
1553+
int ret = mag_get_user_uid(p, &cfg->deleg_ccache_uid);
1554+
if (ret != 0) {
15571555
ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server,
1558-
"Invalid GssapiDelegCcachePerms uid value [%s]",
1559-
p);
1560-
} else {
1561-
cfg->deleg_ccache_uid = user->pw_uid;
1556+
"Invalid GssapiDelegCcachePerms uid value [%s](%s)",
1557+
p, strerror(ret));
15621558
}
15631559
}
15641560
} else if (strncmp(w, CCGID, sizeof(CCGID) - 1) == 0) {
@@ -1575,15 +1571,11 @@ static const char *mag_deleg_ccache_perms(cmd_parms *parms, void *mconfig,
15751571
cfg->deleg_ccache_gid = 0;
15761572
}
15771573
} else {
1578-
struct group grp, *group;
1579-
char buf[NSS_BUF_LEN];
1580-
int ret = getgrnam_r(p, &grp, buf, NSS_BUF_LEN, &group);
1581-
if ((ret != 0) || group != &grp) {
1574+
int ret = mag_get_group_gid(p, &cfg->deleg_ccache_gid);
1575+
if (ret != 0) {
15821576
ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server,
1583-
"Invalid GssapiDelegCcachePerms gid value [%s]",
1584-
p);
1585-
} else {
1586-
cfg->deleg_ccache_gid = group->gr_gid;
1577+
"Invalid GssapiDelegCcachePerms gid value [%s](%s)",
1578+
p, strerror(ret));
15871579
}
15881580
}
15891581
} else {

src/mod_auth_gssapi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,5 @@ struct mag_conn {
140140
struct mag_conn *mag_new_conn_ctx(apr_pool_t *pool);
141141
const char *mag_str_auth_type(int auth_type);
142142
char *mag_error(apr_pool_t *pool, const char *msg, uint32_t maj, uint32_t min);
143+
int mag_get_user_uid(const char *name, uid_t *uid);
144+
int mag_get_group_gid(const char *name, gid_t *gid);

src/util.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/* Copyright (C) 2017 mod_auth_gssapi contributors - See COPYING for (C) terms */
2+
3+
#include "mod_auth_gssapi.h"
4+
5+
#define NSS_BUF_MIN 1024
6+
#define NSS_BUF_MAX 1024*1024
7+
static char *get_buf(char *cur, size_t *len)
8+
{
9+
if (*len == 0) {
10+
*len = NSS_BUF_MIN;
11+
} else {
12+
*len *= 2;
13+
}
14+
if (*len > NSS_BUF_MAX) {
15+
*len = 0; /* will free the buf and return NULL */
16+
}
17+
return realloc(cur, *len);
18+
}
19+
20+
int mag_get_user_uid(const char *name, uid_t *uid)
21+
{
22+
struct passwd pwd, *user;
23+
size_t buflen = 0;
24+
char *buf = NULL;
25+
int ret;
26+
27+
do {
28+
buf = get_buf(buf, &buflen);
29+
if (buf == NULL || buflen == 0) {
30+
ret = ENOMEM;
31+
break;
32+
}
33+
ret = getpwnam_r(name, &pwd, buf, buflen, &user);
34+
} while (ret == ERANGE);
35+
if (ret != 0 || user != &pwd) {
36+
ret = (ret == 0) ? EINVAL : ret;
37+
} else {
38+
*uid = user->pw_uid;
39+
}
40+
free(buf);
41+
return ret;
42+
}
43+
44+
int mag_get_group_gid(const char *name, gid_t *gid)
45+
{
46+
struct group grp, *group;
47+
size_t buflen = 0;
48+
char *buf = NULL;
49+
int ret;
50+
51+
do {
52+
buf = get_buf(buf, &buflen);
53+
if (buf == NULL || buflen == 0) {
54+
ret = ENOMEM;
55+
break;
56+
}
57+
ret = getgrnam_r(name, &grp, buf, buflen, &group);
58+
} while (ret == ERANGE);
59+
if (ret != 0 || group != &grp) {
60+
ret = (ret == 0) ? EINVAL : ret;
61+
} else {
62+
*gid = group->gr_gid;
63+
}
64+
free(buf);
65+
return ret;
66+
}

0 commit comments

Comments
 (0)