summaryrefslogtreecommitdiff
path: root/usr/src/lib/nsswitch
diff options
context:
space:
mode:
authormj162486 <none@none>2008-03-21 13:55:45 -0700
committermj162486 <none@none>2008-03-21 13:55:45 -0700
commit8bd1bae7b80c19127d25a15440e161140bcaacea (patch)
tree7141147db840a6bebefd88a9f9b3ee62908d3f4d /usr/src/lib/nsswitch
parent23d5bb1f2275e3b549733444de8e92fb47d0631b (diff)
downloadillumos-joyent-8bd1bae7b80c19127d25a15440e161140bcaacea.tar.gz
6265078 The getprojXXX() functions do not return project members properly for LDAP project entries.
Diffstat (limited to 'usr/src/lib/nsswitch')
-rw-r--r--usr/src/lib/nsswitch/ldap/common/getprojent.c127
1 files changed, 77 insertions, 50 deletions
diff --git a/usr/src/lib/nsswitch/ldap/common/getprojent.c b/usr/src/lib/nsswitch/ldap/common/getprojent.c
index f1ff6db64e..e88d396109 100644
--- a/usr/src/lib/nsswitch/ldap/common/getprojent.c
+++ b/usr/src/lib/nsswitch/ldap/common/getprojent.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -66,18 +66,31 @@ static const char *project_attrs[] = {
static int
_nss_ldap_proj2str(ldap_backend_ptr be, nss_XbyY_args_t *argp)
{
- int nss_result, buflen;
- unsigned long len = 0;
- char *buffer, *comment, *user_str, *group_str, *attr_str;
- ns_ldap_result_t *result = be->result;
- char **name, **id, **descr, **users, **groups, **attr;
+ int i;
+ int nss_result;
+ int buflen = 0, len;
+ int firsttime;
+ char *buffer, *comment, *attr_str;
+ ns_ldap_result_t *result = be->result;
+ char **name, **id, **descr, **attr;
+ ns_ldap_attr_t *users, *groups;
if (result == NULL)
return (NSS_STR_PARSE_PARSE);
buflen = argp->buf.buflen;
+ if (argp->buf.result != NULL) {
+ /* In all cases it must be deallocated by caller */
+ if ((be->buffer = calloc(1, buflen)) == NULL) {
+ nss_result = NSS_STR_PARSE_PARSE;
+ goto result_proj2str;
+ }
+ buffer = be->buffer;
+ } else
+ buffer = argp->buf.buffer;
+
nss_result = NSS_STR_PARSE_SUCCESS;
- (void) memset(argp->buf.buffer, 0, buflen);
+ (void) memset(buffer, 0, buflen);
name = __ns_ldap_getAttr(result->entry, _PROJ_NAME);
if (name == NULL || name[0] == NULL || (strlen(name[0]) < 1)) {
@@ -92,23 +105,53 @@ _nss_ldap_proj2str(ldap_backend_ptr be, nss_XbyY_args_t *argp)
descr = __ns_ldap_getAttr(result->entry, _PROJ_DESCR);
if (descr == NULL || descr[0] == NULL || (strlen(descr[0]) < 1))
comment = _NO_VALUE;
-
else
comment = descr[0];
-
- users = __ns_ldap_getAttr(result->entry, _PROJ_USERS);
- if (users == NULL || users[0] == NULL || (strlen(users[0]) < 1))
- user_str = _NO_VALUE;
-
- else
- user_str = users[0];
-
- groups = __ns_ldap_getAttr(result->entry, _PROJ_GROUPS);
- if (groups == NULL || groups[0] == NULL || (strlen(groups[0]) < 1))
- group_str = _NO_VALUE;
-
- else
- group_str = groups[0];
+ len = snprintf(buffer, buflen, "%s:%s:%s:", name[0], id[0],
+ comment);
+ TEST_AND_ADJUST(len, buffer, buflen, result_proj2str);
+
+ users = __ns_ldap_getAttrStruct(result->entry, _PROJ_USERS);
+ if (!(users == NULL || users->attrvalue == NULL)) {
+ firsttime = 1;
+ for (i = 0; i < users->value_count; i++) {
+ if (users->attrvalue[i] == NULL) {
+ nss_result = NSS_STR_PARSE_PARSE;
+ goto result_proj2str;
+ }
+ if (firsttime) {
+ len = snprintf(buffer, buflen, "%s",
+ users->attrvalue[i]);
+ firsttime = 0;
+ } else {
+ len = snprintf(buffer, buflen, ",%s",
+ users->attrvalue[i]);
+ }
+ TEST_AND_ADJUST(len, buffer, buflen, result_proj2str);
+ }
+ }
+ len = snprintf(buffer, buflen, ":");
+ TEST_AND_ADJUST(len, buffer, buflen, result_proj2str);
+
+ groups = __ns_ldap_getAttrStruct(result->entry, _PROJ_GROUPS);
+ if (!(groups == NULL || groups->attrvalue == NULL)) {
+ firsttime = 1;
+ for (i = 0; i < groups->value_count; i++) {
+ if (groups->attrvalue[i] == NULL) {
+ nss_result = NSS_STR_PARSE_PARSE;
+ goto result_proj2str;
+ }
+ if (firsttime) {
+ len = snprintf(buffer, buflen, "%s",
+ groups->attrvalue[i]);
+ firsttime = 0;
+ } else {
+ len = snprintf(buffer, buflen, ",%s",
+ groups->attrvalue[i]);
+ }
+ TEST_AND_ADJUST(len, buffer, buflen, result_proj2str);
+ }
+ }
attr = __ns_ldap_getAttr(result->entry, _PROJ_ATTR);
if (attr == NULL || attr[0] == NULL || (strlen(attr[0]) < 1))
@@ -116,28 +159,12 @@ _nss_ldap_proj2str(ldap_backend_ptr be, nss_XbyY_args_t *argp)
else
attr_str = attr[0];
+ len = snprintf(buffer, buflen, ":%s", attr_str);
+ TEST_AND_ADJUST(len, buffer, buflen, result_proj2str);
- /* 6 = 5 ':' + 1 '\0' */
- len = strlen(name[0]) + strlen(id[0]) + strlen(comment) +
- strlen(user_str) + strlen(group_str) + strlen(attr_str) + 6;
- if (len >= buflen) {
- nss_result = NSS_STR_PARSE_ERANGE;
- goto result_proj2str;
- }
- if (argp->buf.result != NULL) {
- if ((be->buffer = calloc(1, len)) == NULL) {
- nss_result = NSS_STR_PARSE_PARSE;
- goto result_proj2str;
- }
- buffer = be->buffer;
- /* The front end marshaller does not need trailing nulls */
- be->buflen = len - 1;
- } else
- buffer = argp->buf.buffer;
-
- (void) snprintf(buffer, len, "%s:%s:%s:%s:%s:%s", name[0], id[0],
- comment, user_str, group_str, attr_str);
-
+ /* The front end marshaller doesn't need the trailing nulls */
+ if (argp->buf.result != NULL)
+ be->buflen = strlen(be->buffer);
result_proj2str:
(void) __ns_ldap_freeResult(&be->result);
return ((int)nss_result);
@@ -158,10 +185,10 @@ getbyname(ldap_backend_ptr be, void *a)
char searchfilter[SEARCHFILTERLEN];
if (snprintf(searchfilter, SEARCHFILTERLEN,
- _F_GETPROJNAME, argp->key.name) < 0)
+ _F_GETPROJNAME, argp->key.name) < 0)
return (NSS_NOTFOUND);
- return (_nss_ldap_lookup(be, argp, _PROJECT, searchfilter, NULL,
- NULL, NULL));
+ return (_nss_ldap_lookup(be, argp, _PROJECT, searchfilter, NULL, NULL,
+ NULL));
}
@@ -178,11 +205,11 @@ getbyprojid(ldap_backend_ptr be, void *a)
nss_XbyY_args_t *argp = (nss_XbyY_args_t *)a;
char searchfilter[SEARCHFILTERLEN];
- if (snprintf(searchfilter, SEARCHFILTERLEN,
- _F_GETPROJID, (long)argp->key.projid) < 0)
+ if (snprintf(searchfilter, SEARCHFILTERLEN, _F_GETPROJID,
+ (long)argp->key.projid) < 0)
return (NSS_NOTFOUND);
- return (_nss_ldap_lookup(be, argp, _PROJECT, searchfilter, NULL,
- NULL, NULL));
+ return (_nss_ldap_lookup(be, argp, _PROJECT, searchfilter, NULL, NULL,
+ NULL));
}
static ldap_backend_op_t project_ops[] = {