summaryrefslogtreecommitdiff
path: root/usr/src/lib/nsswitch/files/common/getexecattr.c
diff options
context:
space:
mode:
authordjl <none@none>2006-09-29 06:00:17 -0700
committerdjl <none@none>2006-09-29 06:00:17 -0700
commitcb5caa98562cf06753163f558cbcfe30b8f4673a (patch)
tree7a24623821583899295e29553207e69701b471ff /usr/src/lib/nsswitch/files/common/getexecattr.c
parent350f572a3fa518fc3690d53066c2c54fd03b5a08 (diff)
downloadillumos-joyent-cb5caa98562cf06753163f558cbcfe30b8f4673a.tar.gz
PSARC 2005/133 Sparks: Name Service Switch 2
4406529 artificial limit of 10 threads per backend 4516075 LDAP connections could be reused more 4696964 LDAP naming services should support Kerberos authentication 4740951 Need host based authentication options in Native LDAP 4952533 Some backends of gethostby* do not set h_errno correctly 4979596 getXbyY calls should have better buffer mechanism 5028908 /usr/bin/logins accesses free memory deep in nss_getent_u(). 5046881 nscd: old-data-ok parameter is not useful, should go away 6225323 NSS/nscd Enhancements (Sparks Project) --HG-- rename : usr/src/cmd/nscd/attrstr.c => deleted_files/usr/src/cmd/nscd/attrstr.c rename : usr/src/cmd/nscd/hash.c => deleted_files/usr/src/cmd/nscd/hash.c rename : usr/src/cmd/nscd/nscd_parse.c => deleted_files/usr/src/cmd/nscd/nscd_parse.c rename : usr/src/cmd/nscd/nscd.h => usr/src/cmd/nscd/cache.h
Diffstat (limited to 'usr/src/lib/nsswitch/files/common/getexecattr.c')
-rw-r--r--usr/src/lib/nsswitch/files/common/getexecattr.c90
1 files changed, 54 insertions, 36 deletions
diff --git a/usr/src/lib/nsswitch/files/common/getexecattr.c b/usr/src/lib/nsswitch/files/common/getexecattr.c
index 502c0112b9..ac9e50ad3a 100644
--- a/usr/src/lib/nsswitch/files/common/getexecattr.c
+++ b/usr/src/lib/nsswitch/files/common/getexecattr.c
@@ -52,29 +52,47 @@ extern int _readbufline(char *, int, char *, int, int *);
extern char *_exec_wild_id(char *, const char *);
extern void _exec_cleanup(nss_status_t, nss_XbyY_args_t *);
-typedef int (*_exec_XY_check_func) (nss_XbyY_args_t *);
-
/*
* check_match: returns 1 if matching entry found, else returns 0.
*/
static int
-check_match(nss_XbyY_args_t *argp)
+check_match(nss_XbyY_args_t *argp, const char *line, int linelen)
{
+ const char *limit, *linep, *keyp;
_priv_execattr *_priv_exec = (_priv_execattr *)(argp->key.attrp);
- const char *name = _priv_exec->name;
- const char *type = _priv_exec->type;
- const char *id = _priv_exec->id;
- const char *policy = _priv_exec->policy;
- execstr_t *exec = (execstr_t *)argp->returnval;
-
- if ((policy && exec->policy && (strcmp(policy, exec->policy) != 0)) ||
- (name && exec->name && (strcmp(name, exec->name) != 0)) ||
- (type && exec->type && (strcmp(type, exec->type) != 0)) ||
- (id && exec->id && (strcmp(id, exec->id) != 0))) {
- return (0);
+ const char *exec_field[6];
+ int i;
+
+ exec_field[0] = _priv_exec->name; /* name */
+ exec_field[1] = _priv_exec->policy; /* policy */
+ exec_field[2] = _priv_exec->type; /* type */
+ exec_field[3] = NULL; /* res1 */
+ exec_field[4] = NULL; /* res2 */
+ exec_field[5] = _priv_exec->id; /* id */
+ /* No need to check attr field */
+
+ linep = line;
+ limit = line + linelen;
+
+ for (i = 0; i < 6; i++) {
+ keyp = exec_field[i];
+ if (keyp) {
+ /* compare field */
+ while (*keyp && linep < limit &&
+ *linep != ':' && *keyp == *linep) {
+ keyp++;
+ linep++;
+ }
+ if (*keyp || linep == limit || *linep != ':')
+ return (0);
+ } else {
+ /* skip field */
+ while (linep < limit && *linep != ':')
+ linep++;
+ }
+ linep++;
}
-
return (1);
}
@@ -90,7 +108,6 @@ _exec_files_XY_all(files_backend_ptr_t be,
int f_size = 0;
time_t f_time = 0;
static time_t read_time = 0;
- char *key = NULL;
char *first;
char *last;
static char *f_buf = NULL;
@@ -169,16 +186,15 @@ _exec_files_XY_all(files_backend_ptr_t be,
}
res = NSS_NOTFOUND;
+ /*CONSTCOND*/
while (1) {
int linelen = 0;
- int check_stat = 0;
char *instr = be->buf;
linelen = _readbufline(f_buf, f_size, instr, be->minbuf,
&lastlen);
if (linelen < 0) {
/* End of file */
- argp->erange = 0;
break;
}
@@ -235,26 +251,25 @@ _exec_files_XY_all(files_backend_ptr_t be,
if (first != instr)
instr = first;
- /*
- * Parse the entry.
- */
+ /* Check the entry */
argp->returnval = NULL;
+ argp->returnlen = 0;
+ if (check_match(argp, instr, linelen) == 0)
+ continue;
+
+ /* Marshall the data */
parse_stat = (*argp->str2ent)(instr, linelen, argp->buf.result,
argp->buf.buffer, argp->buf.buflen);
if (parse_stat == NSS_STR_PARSE_SUCCESS) {
- argp->returnval = argp->buf.result;
- if (check_match(argp)) {
- res = NSS_SUCCESS;
- if (_priv_exec->search_flag == GET_ONE) {
- break;
- } else if (_doexeclist(argp) == 0) {
- res = NSS_UNAVAIL;
- break;
- }
- } else {
- argp->returnval = NULL;
- memset(argp->buf.buffer, NULL,
- argp->buf.buflen);
+ argp->returnval = (argp->buf.result != NULL)?
+ argp->buf.result : argp->buf.buffer;
+ argp->returnlen = linelen;
+ res = NSS_SUCCESS;
+ if (_priv_exec->search_flag == GET_ONE) {
+ break;
+ } else if (_doexeclist(argp) == 0) {
+ res = NSS_UNAVAIL;
+ break;
}
} else if (parse_stat == NSS_STR_PARSE_ERANGE) {
argp->erange = 1;
@@ -276,13 +291,13 @@ _exec_files_XY_all(files_backend_ptr_t be,
static nss_status_t
get_wild(files_backend_ptr_t be, nss_XbyY_args_t *argp, int getby_flag)
{
- char *orig_id = NULL;
+ const char *orig_id = NULL;
char *old_id = NULL;
char *wild_id = NULL;
nss_status_t res = NSS_NOTFOUND;
_priv_execattr *_priv_exec = (_priv_execattr *)(argp->key.attrp);
- orig_id = strdup(_priv_exec->id);
+ orig_id = _priv_exec->id;
old_id = strdup(_priv_exec->id);
wild_id = old_id;
while ((wild_id = _exec_wild_id(wild_id, _priv_exec->type)) != NULL) {
@@ -318,6 +333,7 @@ getbyid(files_backend_ptr_t be, void *a)
{
nss_status_t res;
nss_XbyY_args_t *argp = (nss_XbyY_args_t *)a;
+ /*LINTED*/
_priv_execattr *_priv_exec = (_priv_execattr *)(argp->key.attrp);
res = _exec_files_XY_all(be, argp, NSS_DBOP_EXECATTR_BYID);
@@ -336,6 +352,7 @@ getbynameid(files_backend_ptr_t be, void *a)
{
nss_status_t res;
nss_XbyY_args_t *argp = (nss_XbyY_args_t *)a;
+ /*LINTED*/
_priv_execattr *_priv_exec = (_priv_execattr *)(argp->key.attrp);
res = _exec_files_XY_all(be, argp, NSS_DBOP_EXECATTR_BYNAMEID);
@@ -359,6 +376,7 @@ static files_backend_op_t execattr_ops[] = {
getbynameid
};
+/*ARGSUSED*/
nss_backend_t *
_nss_files_exec_attr_constr(const char *dummy1,
const char *dummy2,