# HG changeset patch # User Milan Jurik # Date 1334861101 18000 # Node ID 98ca40df917134ce76c194f9f0a8e2efc5b134a8 # Parent a9ae30c28ee4f9855b36d8b8ae09b37ba41e9114 2579 nscd contains several bad macros with side effects Reviewed by: Joshua M. Clulow Reviewed by: Vitaliy Gusev Approved by: Garrett D'Amore diff -r a9ae30c28ee4 -r 98ca40df9171 usr/src/cmd/nscd/cache.c --- a/usr/src/cmd/nscd/cache.c Wed Apr 25 00:27:21 2012 -0400 +++ b/usr/src/cmd/nscd/cache.c Thu Apr 19 13:45:01 2012 -0500 @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2012 Milan Jurik. All rights reserved. */ /* @@ -692,11 +693,11 @@ */ nsc_db_t * make_cache(enum db_type dbtype, int dbop, char *name, - int (*compar) (const void *, const void *), - void (*getlogstr)(char *, char *, size_t, nss_XbyY_args_t *), - uint_t (*gethash)(nss_XbyY_key_t *, int), - enum hash_type httype, int htsize) { - + int (*compar) (const void *, const void *), + void (*getlogstr)(char *, char *, size_t, nss_XbyY_args_t *), + uint_t (*gethash)(nss_XbyY_key_t *, int), + enum hash_type httype, int htsize) +{ nsc_db_t *nscdb; char *me = "make_cache"; @@ -728,7 +729,7 @@ /* The cache is an AVL tree */ avl_create(&nscdb->tree, nscdb->compar, sizeof (nsc_entry_t), - offsetof(nsc_entry_t, avl_link)); + offsetof(nsc_entry_t, avl_link)); /* Assign log routine */ if (getlogstr == NULL) { @@ -957,7 +958,7 @@ */ void nsc_info(nsc_ctx_t *ctx, char *dbname, nscd_cfg_cache_t cfg[], - nscd_cfg_stat_cache_t stats[]) + nscd_cfg_stat_cache_t stats[]) { int i; char *me = "nsc_info"; @@ -1040,7 +1041,8 @@ * not a daemon. */ int -nsc_dump(char *dbname, int dbop) { +nsc_dump(char *dbname, int dbop) +{ nsc_ctx_t *ctx; nsc_db_t *nscdb; nscd_bool_t enabled; @@ -1091,35 +1093,38 @@ /* * These macros are for exclusive use of nsc_lookup */ -#define NSC_LOOKUP_RETURN(retcode, loglevel, fmt) \ - (void) mutex_unlock(&nscdb->db_mutex); \ +#define NSC_LOOKUP_LOG(loglevel, fmt) \ _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_##loglevel) \ - (me, fmt, whoami); \ - return (retcode); + (me, fmt, whoami); + +static int +nsc_lookup_no_cache(nsc_lookup_args_t *largs, const char *str) +{ + char *me = "nsc_lookup_no_cache"; + nss_status_t status; -#define NSC_LOOKUP_NO_CACHE(str) \ - _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) \ - (me, "%s: name service lookup (bypassing cache\n", \ - str); \ - nss_psearch(largs->buffer, largs->bufsize); \ - status = NSCD_GET_STATUS(largs->buffer); \ - _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) \ - (me, "%s: name service lookup status = %d\n", \ - str, status); \ - if (status == NSS_SUCCESS) { \ - return (SUCCESS); \ - } else if (status == NSS_NOTFOUND) \ - return (NOTFOUND); \ - else \ + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) + (me, "%s: name service lookup (bypassing cache)\n", str); + nss_psearch(largs->buffer, largs->bufsize); + status = NSCD_GET_STATUS(largs->buffer); + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) + (me, "%s: name service lookup status = %d\n", str, status); + if (status == NSS_SUCCESS) { + return (SUCCESS); + } else if (status == NSS_NOTFOUND) { + return (NOTFOUND); + } else { return (SERVERERROR); + } +} /* * This function starts the revalidation and reaper threads * for a cache */ static void -start_threads(nsc_ctx_t *ctx) { - +start_threads(nsc_ctx_t *ctx) +{ int errnum; char *me = "start_threads"; @@ -1128,11 +1133,11 @@ */ if (ctx->revalidate_on != nscd_true) { if (thr_create(NULL, NULL, (void *(*)(void *))revalidate, - ctx, 0, NULL) != 0) { + ctx, 0, NULL) != 0) { errnum = errno; _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_ERROR) - (me, "thr_create (revalidate thread for %s): %s\n", - ctx->dbname, strerror(errnum)); + (me, "thr_create (revalidate thread for %s): %s\n", + ctx->dbname, strerror(errnum)); exit(1); } ctx->revalidate_on = nscd_true; @@ -1143,11 +1148,11 @@ */ if (ctx->reaper_on != nscd_true) { if (thr_create(NULL, NULL, (void *(*)(void *))reaper, - ctx, 0, NULL) != 0) { + ctx, 0, NULL) != 0) { errnum = errno; _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_ERROR) - (me, "thr_create (reaper thread for %s): %s\n", - ctx->dbname, strerror(errnum)); + (me, "thr_create (reaper thread for %s): %s\n", + ctx->dbname, strerror(errnum)); exit(1); } ctx->reaper_on = nscd_true; @@ -1239,11 +1244,10 @@ static int check_config(nsc_lookup_args_t *largs, nscd_cfg_cache_t *cfgp, - char *whoami, int flag) + char *whoami, int flag) { nsc_db_t *nscdb; nsc_ctx_t *ctx; - nss_status_t status; char *me = "check_config"; ctx = largs->ctx; @@ -1267,18 +1271,16 @@ if (UPDATEBIT & flag) return (NOTFOUND); - else { - NSC_LOOKUP_NO_CACHE(whoami); - } + else + return (nsc_lookup_no_cache(largs, whoami)); } /* * if caller requests lookup using his * own nsswitch config, bypass cache */ - if (nsw_config_in_phdr(largs->buffer)) { - NSC_LOOKUP_NO_CACHE(whoami); - } + if (nsw_config_in_phdr(largs->buffer)) + return (nsc_lookup_no_cache(largs, whoami)); /* no need of cache if we are dealing with 0 ttls */ if (cfgp->pos_ttl <= 0 && cfgp->neg_ttl <= 0) { @@ -1286,7 +1288,7 @@ return (NOTFOUND); else if (cfgp->avoid_ns == nscd_true) return (SERVERERROR); - NSC_LOOKUP_NO_CACHE(whoami); + return (nsc_lookup_no_cache(largs, whoami)); } return (CONTINUE); @@ -1298,7 +1300,7 @@ */ static void check_db_file(nsc_ctx_t *ctx, nscd_cfg_cache_t cfg, - char *whoami, time_t now) + char *whoami, time_t now) { struct stat buf; nscd_bool_t file_modified = nscd_false; @@ -1343,8 +1345,8 @@ } static int -lookup_int(nsc_lookup_args_t *largs, int flag) { - +lookup_int(nsc_lookup_args_t *largs, int flag) +{ nsc_ctx_t *ctx; nsc_db_t *nscdb; nscd_cfg_cache_t cfg; @@ -1364,7 +1366,7 @@ /* extract dbop, dbname, key and cred */ status = nss_packed_getkey(largs->buffer, largs->bufsize, &dbname, - &dbop, &args); + &dbop, &args); if (status != NSS_SUCCESS) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_ERROR) (me, "nss_packed_getkey failure (%d)\n", status); @@ -1379,9 +1381,8 @@ if (UPDATEBIT & flag) return (NOTFOUND); - else { - NSC_LOOKUP_NO_CACHE(dbname); - } + else + return (nsc_lookup_no_cache(largs, dbname)); } } ctx = largs->ctx; @@ -1390,13 +1391,12 @@ if ((largs->nscdb = nsc_get_db(ctx, dbop)) == NULL) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_WARNING) (me, "%s:%d: no cache found\n", - dbname, dbop); + dbname, dbop); if (UPDATEBIT & flag) return (NOTFOUND); - else { - NSC_LOOKUP_NO_CACHE(dbname); - } + else + return (nsc_lookup_no_cache(largs, dbname)); } } @@ -1404,7 +1404,7 @@ _NSCD_LOG_IF(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_ALL) { (void) nscdb->getlogstr(nscdb->name, whoami, - sizeof (whoami), &args); + sizeof (whoami), &args); } if (UPDATEBIT & flag) { @@ -1436,7 +1436,7 @@ /* Either no entry and avoid name service */ if (rc == NSCD_DB_ENTRY_NOT_FOUND || - rc == NSCD_INVALID_ARGUMENT) + rc == NSCD_INVALID_ARGUMENT) return (NOTFOUND); /* OR memory error */ @@ -1483,10 +1483,10 @@ if (cfg.avoid_ns == nscd_true) next_action = _NSC_USECACHED; else if ((flag & UPDATEBIT) || - (this_stats->timestamp < now)) { + (this_stats->timestamp < now)) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "%s: cached entry needs to be updated\n", - whoami); + whoami); next_action = _NSC_NSLOOKUP; } else next_action = _NSC_USECACHED; @@ -1506,8 +1506,10 @@ _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG_6) (me, "%s: throttling load\n", whoami); - NSC_LOOKUP_RETURN(NOSERVER, WARNING, - "%s: no clearance to wait\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(WARNING, + "%s: no clearance to wait\n"); + return (NOSERVER); } /* yes can wait */ (void) nscd_wait(ctx, nscdb, this_entry); @@ -1535,13 +1537,15 @@ (void) mutex_lock(&ctx->stats_mutex); ctx->stats.drop_count++; (void) mutex_unlock(&ctx->stats_mutex); - NSC_LOOKUP_RETURN(NOSERVER, WARNING, - "%s: no clearance for lookup\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(WARNING, + "%s: no clearance for lookup\n"); + return (NOSERVER); } /* block any threads accessing this entry */ - this_stats->status = (flag & UPDATEBIT)? - ST_UPDATE_PENDING:ST_LOOKUP_PENDING; + this_stats->status = (flag & UPDATEBIT) ? + ST_UPDATE_PENDING : ST_LOOKUP_PENDING; /* release lock and do name service lookup */ (void) mutex_unlock(&nscdb->db_mutex); @@ -1556,7 +1560,7 @@ _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "%s: name service lookup status = %d\n", - whoami, status); + whoami, status); if (status == NSS_SUCCESS) { int ttl; @@ -1568,20 +1572,24 @@ status = dup_packed_buffer(largs, this_entry); if (status != NSS_SUCCESS) { delete_entry(nscdb, ctx, this_entry); - NSC_LOOKUP_RETURN(SERVERERROR, ERROR, - "%s: failed to update cache\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(ERROR, + "%s: failed to update cache\n"); + return (SERVERERROR); } /* * store unpacked key in cache */ status = nss_packed_getkey(this_entry->buffer, - this_entry->bufsize, - &dbname, &dbop, &args); + this_entry->bufsize, + &dbname, &dbop, &args); if (status != NSS_SUCCESS) { delete_entry(nscdb, ctx, this_entry); - NSC_LOOKUP_RETURN(SERVERERROR, ERROR, - "%s: failed to extract key\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(ERROR, + "%s: failed to extract key\n"); + return (SERVERERROR); } this_entry->key = args.key; /* struct copy */ @@ -1605,8 +1613,10 @@ */ start_threads(ctx); - NSC_LOOKUP_RETURN(SUCCESS, DEBUG, - "%s: cache updated with positive entry\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(DEBUG, + "%s: cache updated with positive entry\n"); + return (SUCCESS); } else if (status == NSS_NOTFOUND) { /* * data not found in name service @@ -1617,25 +1627,32 @@ if (NSCD_GET_ERRNO(largs->buffer) == ERANGE) { delete_entry(nscdb, ctx, this_entry); - NSC_LOOKUP_RETURN(NOTFOUND, DEBUG, - "%s: ERANGE, cache not updated with negative entry\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(DEBUG, + "%s: ERANGE, cache not updated " + "with negative entry\n"); + return (NOTFOUND); } status = dup_packed_buffer(largs, this_entry); if (status != NSS_SUCCESS) { delete_entry(nscdb, ctx, this_entry); - NSC_LOOKUP_RETURN(SERVERERROR, ERROR, - "%s: failed to update cache\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(ERROR, + "%s: failed to update cache\n"); + return (SERVERERROR); } /* store unpacked key in cache */ status = nss_packed_getkey(this_entry->buffer, - this_entry->bufsize, - &dbname, &dbop, &args); + this_entry->bufsize, + &dbname, &dbop, &args); if (status != NSS_SUCCESS) { delete_entry(nscdb, ctx, this_entry); - NSC_LOOKUP_RETURN(SERVERERROR, ERROR, - "%s: failed to extract key\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(ERROR, + "%s: failed to extract key\n"); + return (SERVERERROR); } this_entry->key = args.key; /* struct copy */ @@ -1655,8 +1672,10 @@ */ start_threads(ctx); - NSC_LOOKUP_RETURN(NOTFOUND, DEBUG, - "%s: cache updated with negative entry\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(DEBUG, + "%s: cache updated with negative entry\n"); + return (NOTFOUND); } else { /* * name service lookup failed @@ -1672,8 +1691,9 @@ (void) mutex_unlock(&nscdb->db_mutex); _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_WARNING) - (me, "%s: name service lookup failed (status=%d, errno=%d)\n", - whoami, status, errnum); + (me, "%s: name service lookup failed " + "(status=%d, errno=%d)\n", + whoami, status, errnum); return (SERVERERROR); } @@ -1682,12 +1702,13 @@ * found entry in cache */ if (UPDATEBIT & flag) { - NSC_LOOKUP_RETURN(SUCCESS, DEBUG, - "%s: no need to update\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(DEBUG, "%s: no need to update\n"); + return (SUCCESS); } if (NSCD_GET_STATUS((nss_pheader_t *)this_entry->buffer) == - NSS_SUCCESS) { + NSS_SUCCESS) { /* positive hit */ (void) mutex_lock(&ctx->stats_mutex); ctx->stats.pos_hits++; @@ -1695,13 +1716,17 @@ /* update response buffer */ if (copy_result(largs->buffer, - this_entry->buffer) != NSS_SUCCESS) { - NSC_LOOKUP_RETURN(SERVERERROR, ERROR, - "%s: response buffer insufficient\n"); + this_entry->buffer) != NSS_SUCCESS) { + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(ERROR, + "%s: response buffer insufficient\n"); + return (SERVERERROR); } - NSC_LOOKUP_RETURN(SUCCESS, DEBUG, - "%s: positive entry in cache\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(DEBUG, + "%s: positive entry in cache\n"); + return (SUCCESS); } else { /* negative hit */ (void) mutex_lock(&ctx->stats_mutex); @@ -1709,18 +1734,21 @@ (void) mutex_unlock(&ctx->stats_mutex); NSCD_SET_STATUS((nss_pheader_t *)largs->buffer, - NSCD_GET_STATUS(this_entry->buffer), - NSCD_GET_ERRNO(this_entry->buffer)); + NSCD_GET_STATUS(this_entry->buffer), + NSCD_GET_ERRNO(this_entry->buffer)); NSCD_SET_HERRNO((nss_pheader_t *)largs->buffer, - NSCD_GET_HERRNO(this_entry->buffer)); + NSCD_GET_HERRNO(this_entry->buffer)); - NSC_LOOKUP_RETURN(NOTFOUND, DEBUG, - "%s: negative entry in cache\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(DEBUG, + "%s: negative entry in cache\n"); + return (NOTFOUND); } } - NSC_LOOKUP_RETURN(SERVERERROR, ERROR, - "%s: cache backend failure\n"); + (void) mutex_unlock(&nscdb->db_mutex); + NSC_LOOKUP_LOG(ERROR, "%s: cache backend failure\n"); + return (SERVERERROR); } /* @@ -1741,11 +1769,11 @@ switch (rc) { case SUCCESS: - NSCD_RETURN_STATUS(phdr, NSS_SUCCESS, 0); + NSCD_SET_STATUS(phdr, NSS_SUCCESS, 0); break; case NOTFOUND: - NSCD_RETURN_STATUS(phdr, NSS_NOTFOUND, -1); + NSCD_SET_STATUS(phdr, NSS_NOTFOUND, -1); break; case SERVERERROR: @@ -1759,7 +1787,7 @@ break; case NOSERVER: - NSCD_RETURN_STATUS(phdr, NSS_TRYLOCAL, -1); + NSCD_SET_STATUS(phdr, NSS_TRYLOCAL, -1); break; } } @@ -1946,7 +1974,8 @@ * Invalidate cache */ void -nsc_invalidate(nsc_ctx_t *ctx, char *dbname, nsc_ctx_t **ctxs) { +nsc_invalidate(nsc_ctx_t *ctx, char *dbname, nsc_ctx_t **ctxs) +{ int i; char *me = "nsc_invalidate"; @@ -1957,16 +1986,14 @@ if (dbname) { if ((i = get_cache_idx(dbname)) == -1) { - _NSCD_LOG(NSCD_LOG_CACHE, - NSCD_LOG_LEVEL_WARNING) + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_WARNING) (me, "%s: invalid cache name\n", dbname); return; } if ((ctx = cache_ctx_p[i]) == NULL) { - _NSCD_LOG(NSCD_LOG_CACHE, - NSCD_LOG_LEVEL_WARNING) + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_WARNING) (me, "%s: no cache context found\n", - dbname); + dbname); return; } ctx_invalidate(ctx); @@ -1987,7 +2014,8 @@ * Invalidate cache by context */ static void -ctx_invalidate(nsc_ctx_t *ctx) { +ctx_invalidate(nsc_ctx_t *ctx) +{ int i; nsc_entry_t *entry; char *me = "ctx_invalidate"; @@ -2041,8 +2069,8 @@ static nscd_rc_t lookup_cache(nsc_lookup_args_t *largs, nscd_cfg_cache_t *cfgp, - nss_XbyY_args_t *argp, char *whoami, nsc_entry_t **entry) { - + nss_XbyY_args_t *argp, char *whoami, nsc_entry_t **entry) +{ nsc_db_t *nscdb; nsc_ctx_t *ctx; uint_t hash; @@ -2073,8 +2101,8 @@ /* move it to the hash table */ if (nscdb->htable) { if (nscdb->htable[hash] == NULL || - (*entry)->stats.hits >= - nscdb->htable[hash]->stats.hits) { + (*entry)->stats.hits >= + nscdb->htable[hash]->stats.hits) { nscdb->htable[hash] = *entry; } } @@ -2086,18 +2114,16 @@ (me, "%s: cache miss\n", whoami); if (cfgp->avoid_ns == nscd_true) { - _NSCD_LOG(NSCD_LOG_CACHE, - NSCD_LOG_LEVEL_DEBUG) + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "%s: avoid name service\n", whoami); return (NSCD_DB_ENTRY_NOT_FOUND); } /* allocate memory for new entry (stub) */ *entry = (nsc_entry_t *)umem_cache_alloc(nsc_entry_cache, - UMEM_DEFAULT); + UMEM_DEFAULT); if (*entry == NULL) { - _NSCD_LOG(NSCD_LOG_CACHE, - NSCD_LOG_LEVEL_ERROR) + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_ERROR) (me, "%s: memory allocation failure\n", whoami); return (NSCD_NO_MEMORY); } @@ -2132,13 +2158,13 @@ if (cfgp->maxentries > 0 && nentries > cfgp->maxentries) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "%s: maximum entries exceeded -- " - "deleting least recently used entry\n", - whoami); + "deleting least recently used entry\n", + whoami); node = nscdb->qhead; while (node != NULL && node != *entry) { if (node->stats.status == ST_DISCARD || - !(node->stats.status & ST_PENDING)) { + !(node->stats.status & ST_PENDING)) { delete_entry(nscdb, ctx, node); break; } @@ -2156,7 +2182,8 @@ } static void -reaper(nsc_ctx_t *ctx) { +reaper(nsc_ctx_t *ctx) +{ uint_t ttl, extra_sleep, total_sleep, intervals; uint_t nodes_per_interval, seconds_per_interval; ulong_t nsc_entries; @@ -2207,12 +2234,12 @@ _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "%s: total entries = %d, " - "seconds per interval = %d, " - "nodes per interval = %d\n", - ctx->dbname, nsc_entries, seconds_per_interval, - nodes_per_interval); + "seconds per interval = %d, " + "nodes per interval = %d\n", + ctx->dbname, nsc_entries, seconds_per_interval, + nodes_per_interval); total_sleep = reap_cache(ctx, nodes_per_interval, - seconds_per_interval); + seconds_per_interval); extra_sleep = 1 + ttl - total_sleep; if (extra_sleep > 0) (void) sleep(extra_sleep); @@ -2222,7 +2249,8 @@ static uint_t reap_cache(nsc_ctx_t *ctx, uint_t nodes_per_interval, - uint_t seconds_per_interval) { + uint_t seconds_per_interval) +{ uint_t nodes_togo, total_sleep; time_t now; nsc_entry_t *node, *next_node; @@ -2254,8 +2282,8 @@ if ((node = nscdb->reap_node) == NULL) break; if (node->stats.status == ST_DISCARD || - (!(node->stats.status & ST_PENDING) && - node->stats.timestamp < now)) { + (!(node->stats.status & ST_PENDING) && + node->stats.timestamp < now)) { /* * Delete entry if its discard flag is * set OR if it has expired. Entries @@ -2287,8 +2315,9 @@ */ nentries = avl_numnodes(&nscdb->tree); for (slot = 0, value = _NSC_INIT_HTSIZE_SLOT_VALUE; - slot < _NSC_HTSIZE_NUM_SLOTS && nentries > value; - value = (value << 1) + 1, slot++); + slot < _NSC_HTSIZE_NUM_SLOTS && nentries > value; + value = (value << 1) + 1, slot++) + ; if (nscdb->hash_type == nsc_ht_power2) newhtsize = _NSC_INIT_HTSIZE_POWER2 << slot; else @@ -2302,7 +2331,7 @@ _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "%s: resizing hash table from %d to %d\n", - nscdb->name, nscdb->htsize, newhtsize); + nscdb->name, nscdb->htsize, newhtsize); /* * Dump old hashes because it would be time @@ -2312,9 +2341,8 @@ nscdb->htable = calloc(newhtsize, sizeof (*(nscdb->htable))); if (nscdb->htable == NULL) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_ERROR) - (me, - "%s: memory allocation failure\n", - nscdb->name); + (me, "%s: memory allocation failure\n", + nscdb->name); /* -1 to try later */ nscdb->htsize = -1; } else { @@ -2366,7 +2394,7 @@ node = next_node; next_node = next_node->qprev; if (node->stats.status == ST_DISCARD || - !(node->stats.status & ST_PENDING)) { + !(node->stats.status & ST_PENDING)) { /* Leave nodes with pending updates alone */ delete_entry(nscdb, ctx, node); count++; diff -r a9ae30c28ee4 -r 98ca40df9171 usr/src/cmd/nscd/nscd_admin.c --- a/usr/src/cmd/nscd/nscd_admin.c Wed Apr 25 00:27:21 2012 -0400 +++ b/usr/src/cmd/nscd/nscd_admin.c Thu Apr 19 13:45:01 2012 -0500 @@ -21,10 +21,9 @@ /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2012 Milan Jurik. All rights reserved. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include #include #include @@ -72,11 +71,11 @@ } else { admin_c.cache_cfg[i] = cfg_default; (void) memset(&admin_c.cache_stats[i], 0, - sizeof (admin_c.cache_stats[0])); + sizeof (admin_c.cache_stats[0])); } } (void) memcpy(((char *)outbuf) + phdr->data_off, - &admin_c, sizeof (admin_c)); + &admin_c, sizeof (admin_c)); return (0); } @@ -114,16 +113,16 @@ _nscd_logit(me, "total_size = %d\n", set->total_size); _nscd_logit(me, "debug_level_set = %d, debug_level = %d\n", - set->debug_level_set, set->debug_level); + set->debug_level_set, set->debug_level); _nscd_logit(me, "logfile_set = %d, logfile = %s\n", - set->logfile_set, *set->logfile == '\0' ? - "" : set->logfile); + set->logfile_set, *set->logfile == '\0' ? + "" : set->logfile); _nscd_logit(me, "cache_cfg_num = %d\n", - set->cache_cfg_num); + set->cache_cfg_num); _nscd_logit(me, "cache_flush_num = %d\n", - set->cache_flush_num); + set->cache_flush_num); } /* @@ -132,11 +131,11 @@ if (set->debug_level_set == nscd_true) { if (_nscd_set_debug_level(set->debug_level) - != NSCD_SUCCESS) { + != NSCD_SUCCESS) { _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "unable to set debug level %d\n", - set->debug_level); + set->debug_level); goto err_exit; } @@ -152,7 +151,7 @@ goto err_exit; } (void) strlcpy(admin_c.logfile, set->logfile, - NSCD_LOGFILE_LEN); + NSCD_LOGFILE_LEN); } /* @@ -162,7 +161,7 @@ _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "number of caches (%d) to change out of bound %s\n", - set->cache_cfg_num); + set->cache_cfg_num); goto err_exit; } @@ -177,14 +176,14 @@ if (cache_ctx_p[j] == NULL) { _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "unable to find cache context for %s\n", - dbname); + dbname); } rc = _nscd_cfg_get_handle(group, dbname, &h, NULL); if (rc != NSCD_SUCCESS) { _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "unable to get handle for < %s : %s >\n", - dbname, group); + dbname, group); goto err_exit; } @@ -193,7 +192,7 @@ if (rc != NSCD_SUCCESS) { _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "unable to set admin data for < %s : %s >\n", - dbname, group); + dbname, group); _nscd_cfg_free_handle(h); @@ -209,7 +208,7 @@ _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "number of caches (%d) to flush out of bound %s\n", - set->cache_flush_num); + set->cache_flush_num); goto err_exit; } @@ -222,7 +221,7 @@ if (cache_ctx_p[j] == NULL) { _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "unable to find cache context for %s\n", - dbname); + dbname); } nsc_invalidate(cache_ctx_p[j], NULL, NULL); } @@ -248,9 +247,9 @@ _NSCD_LOG(NSCD_LOG_ADMIN, NSCD_LOG_LEVEL_ERROR) (me, "SETADMIN call failed\n"); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, rc); + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, rc); } else { - NSCD_RETURN_STATUS_SUCCESS(phdr); + NSCD_SET_STATUS_SUCCESS(phdr); } } @@ -393,7 +392,7 @@ callnum = NSCD_GETADMIN; (void) _nscd_doorcall_data(callnum, NULL, sizeof (admin_c), - &admin_c, sizeof (admin_c), &phdr); + &admin_c, sizeof (admin_c), &phdr); if (NSCD_STATUS_IS_NOT_OK(&phdr)) { return (1); @@ -406,5 +405,5 @@ _nscd_client_setadmin() { return (_nscd_doorcall_data(NSCD_SETADMIN, &admin_mod, - sizeof (admin_mod), NULL, 0, NULL)); + sizeof (admin_mod), NULL, 0, NULL)); } diff -r a9ae30c28ee4 -r 98ca40df9171 usr/src/cmd/nscd/nscd_door.c --- a/usr/src/cmd/nscd/nscd_door.c Wed Apr 25 00:27:21 2012 -0400 +++ b/usr/src/cmd/nscd/nscd_door.c Thu Apr 19 13:45:01 2012 -0500 @@ -22,10 +22,9 @@ /* * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2012 Milan Jurik. All rights reserved. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include #include #include @@ -48,14 +47,16 @@ _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door is %s (fd is %d)\n", NAME_SERVICE_DOOR, - *doorfd); + *doorfd); - if (*doorfd == -1) - NSCD_RETURN_STATUS(phdr, NSS_ERROR, errno); + if (*doorfd == -1) { + NSCD_SET_STATUS(phdr, NSS_ERROR, errno); + return; + } if (door_info(*doorfd, &doori) < 0 || - (doori.di_attributes & DOOR_REVOKED) || - doori.di_data != (uintptr_t)NAME_SERVICE_DOOR_COOKIE) { + (doori.di_attributes & DOOR_REVOKED) || + doori.di_data != (uintptr_t)NAME_SERVICE_DOOR_COOKIE) { /* * we should close doorfd because we just opened it @@ -65,10 +66,11 @@ _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door %d not valid\n", *doorfd); - NSCD_RETURN_STATUS(phdr, NSS_ERROR, ECONNREFUSED); + NSCD_SET_STATUS(phdr, NSS_ERROR, ECONNREFUSED); + return; } - NSCD_RETURN_STATUS_SUCCESS(phdr); + NSCD_SET_STATUS_SUCCESS(phdr); } /* general door call functions used by nscd */ @@ -87,15 +89,14 @@ (void) memmove(outdata, dp, phdr->data_len); } else { - _NSCD_LOG(NSCD_LOG_FRONT_END, - NSCD_LOG_LEVEL_DEBUG) + _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "output buffer not large enough " - " should be > %d but is %d\n", - phdr->data_len, outdlen); + " should be > %d but is %d\n", + phdr->data_len, outdlen); if (outphdr != NULL) { NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, - 0, NSCD_INVALID_ARGUMENT); + 0, NSCD_INVALID_ARGUMENT); NSCD_COPY_STATUS(outphdr, phdr); } ret = NSS_NSCD_PRIV; @@ -130,7 +131,7 @@ phdr = (nss_pheader_t *)dptr; _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (%d) failed (status = %d, error = %s)\n", - callnum, ret, strerror(NSCD_GET_ERRNO(phdr))); + callnum, ret, strerror(NSCD_GET_ERRNO(phdr))); } return (ret); @@ -169,7 +170,7 @@ if (ret != NSS_SUCCESS) { _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (%d) failed (status = %d, error = %s)\n", - callnum, ret, strerror(NSCD_GET_ERRNO(phdr_d))); + callnum, ret, strerror(NSCD_GET_ERRNO(phdr_d))); } else { if (phdr != NULL) { NSCD_COPY_STATUS(phdr, phdr_d); @@ -230,7 +231,7 @@ _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (%d to %d) did not get through (%s)\n", - callnum, fd, strerror(errnum)); + callnum, fd, strerror(errnum)); return (NSS_ERROR); } @@ -250,9 +251,9 @@ _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (%d to %d) failed: p_status = %d, " - "p_errno = %s, nscd status = %d\n", callnum, fd, - ret, strerror(NSCD_GET_ERRNO(phdr_d)), - NSCD_GET_NSCD_STATUS(phdr_d)); + "p_errno = %s, nscd status = %d\n", callnum, fd, + ret, strerror(NSCD_GET_ERRNO(phdr_d)), + NSCD_GET_NSCD_STATUS(phdr_d)); } else ret = copy_output(outdata, outdlen, phdr_d, phdr); @@ -291,21 +292,20 @@ _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (to fd %d) failed (%s)\n", - doorfd, strerror(errnum)); + doorfd, strerror(errnum)); (void) close(doorfd); - NSCD_RETURN_STATUS(phdr, NSS_ERROR, errnum); + NSCD_SET_STATUS(phdr, NSS_ERROR, errnum); + return; } *adata = param.data_size; *ndata = param.rsize; *dptr = (void *)param.data_ptr; if (*adata == 0 || *dptr == NULL) { - (void) close(doorfd); - _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "no data\n"); - NSCD_RETURN_STATUS(phdr, NSS_ERROR, ENOTCONN); + NSCD_SET_STATUS(phdr, NSS_ERROR, ENOTCONN); } (void) close(doorfd); @@ -348,8 +348,8 @@ _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (%d) failed (status = %d, error = %s)\n", - callnum, NSCD_GET_STATUS(phdr_d), - strerror(NSCD_GET_ERRNO(phdr_d))); + callnum, NSCD_GET_STATUS(phdr_d), + strerror(NSCD_GET_ERRNO(phdr_d))); } return (NSCD_GET_STATUS(phdr_d)); diff -r a9ae30c28ee4 -r 98ca40df9171 usr/src/cmd/nscd/nscd_door.h --- a/usr/src/cmd/nscd/nscd_door.h Wed Apr 25 00:27:21 2012 -0400 +++ b/usr/src/cmd/nscd/nscd_door.h Thu Apr 19 13:45:01 2012 -0500 @@ -22,13 +22,12 @@ /* * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2012 Milan Jurik. All rights reserved. */ #ifndef _NSCD_DOOR_H #define _NSCD_DOOR_H -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Definitions for nscd to nscd door interfaces */ @@ -97,24 +96,10 @@ (ph)->p_herrno = herrno; -#define NSCD_RETURN_STATUS(ph, st, errno) \ - { \ - int e = errno; \ - (ph)->p_status = st; \ - if (e != -1) \ - (ph)->p_errno = e; \ - return; \ - } - #define NSCD_SET_STATUS_SUCCESS(ph) \ (ph)->p_status = NSS_SUCCESS; \ (ph)->p_errno = 0; -#define NSCD_RETURN_STATUS_SUCCESS(ph) \ - (ph)->p_status = NSS_SUCCESS; \ - (ph)->p_errno = 0; \ - return; - #define NSCD_SET_N2N_STATUS(ph, st, errno, n2nst) \ { \ int e = errno; \ @@ -124,16 +109,6 @@ (ph)->nscdpriv = n2nst; \ } -#define NSCD_RETURN_N2N_STATUS(ph, st, errno, n2nst) \ - { \ - int e = errno; \ - (ph)->p_status = st; \ - if (e != -1) \ - (ph)->p_errno = e; \ - (ph)->nscdpriv = n2nst; \ - return; \ - } - #define NSCD_STATUS_IS_OK(ph) \ (((ph)->p_status) == NSS_SUCCESS) diff -r a9ae30c28ee4 -r 98ca40df9171 usr/src/cmd/nscd/nscd_frontend.c --- a/usr/src/cmd/nscd/nscd_frontend.c Wed Apr 25 00:27:21 2012 -0400 +++ b/usr/src/cmd/nscd/nscd_frontend.c Thu Apr 19 13:45:01 2012 -0500 @@ -21,6 +21,7 @@ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2012 Milan Jurik. All rights reserved. */ #include @@ -389,7 +390,8 @@ _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door_ucred: %s\n", strerror(errno)); - NSCD_RETURN_STATUS(phdr, NSS_ERROR, errnum); + NSCD_SET_STATUS(phdr, NSS_ERROR, errnum); + return; } eset = ucred_getprivset(uc, PRIV_EFFECTIVE); @@ -405,7 +407,8 @@ ucred_getruid(uc), ucred_geteuid(uc), zoneid); ucred_free(uc); - NSCD_RETURN_STATUS(phdr, NSS_ERROR, EACCES); + NSCD_SET_STATUS(phdr, NSS_ERROR, EACCES); + return; } _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) @@ -415,7 +418,7 @@ ucred_free(uc); - NSCD_RETURN_STATUS_SUCCESS(phdr); + NSCD_SET_STATUS_SUCCESS(phdr); } void @@ -439,7 +442,8 @@ _NSCD_LOG(log_comp, NSCD_LOG_LEVEL_ERROR) (me, "door_ucred: %s\n", strerror(errno)); - NSCD_RETURN_STATUS(phdr, NSS_ERROR, errnum); + NSCD_SET_STATUS(phdr, NSS_ERROR, errnum); + return; } NSCD_SET_STATUS_SUCCESS(phdr); diff -r a9ae30c28ee4 -r 98ca40df9171 usr/src/cmd/nscd/nscd_selfcred.c --- a/usr/src/cmd/nscd/nscd_selfcred.c Wed Apr 25 00:27:21 2012 -0400 +++ b/usr/src/cmd/nscd/nscd_selfcred.c Thu Apr 19 13:45:01 2012 -0500 @@ -520,8 +520,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "door_ucred failed: %s\n", strerror(errnum)); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, errnum, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, errnum, NSCD_DOOR_UCRED_ERROR); + return; } uid = ucred_geteuid(uc); @@ -716,8 +717,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "MAIN IMPOSTER CAUGHT! i am %d not NSCD_MAIN\n", iam); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_MAIN_IMPOSTER); + return; } /* forker doesn't return stats, it just pauses */ @@ -725,11 +727,8 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "forker ready to pause ...\n"); - /*CONSTCOND*/ - while (1) + for (;;) (void) pause(); - - NSCD_RETURN_STATUS_SUCCESS(phdr); } /* remember the current activity sequence number */ @@ -784,8 +783,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "MAIN IMPOSTER CAUGHT! i am %d not NSCD_MAIN\n", iam); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_MAIN_IMPOSTER); + return; } /* only forker handles fork requests */ @@ -793,8 +793,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "MAIN IMPOSTER CAUGHT! I AM NOT FORKER!\n"); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_WRONG_NSCD); + return; } /* fork a child for the slot assigned by the main nscd */ @@ -809,8 +810,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "bas slot number\n"); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_INVALID_SLOT_NUMBER); + return; } _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) @@ -854,7 +856,8 @@ NSCD_IMHERE | (NSCD_CHILD & NSCD_WHOAMI), &ih, sizeof (ih), NULL); - NSCD_RETURN_STATUS_SUCCESS(phdr); + NSCD_SET_STATUS_SUCCESS(phdr); + return; } if (cid == (pid_t)-1) { _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "forker unable to fork ...\n"); @@ -953,8 +956,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_ERROR) (me, "no door to talk to the forker\n"); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_NO_FORKER); + return; } /* get door client's credential information */ @@ -963,8 +967,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "door_ucred failed: %s\n", strerror(errnum)); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, errnum, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, errnum, NSCD_DOOR_UCRED_ERROR); + return; } /* get door client's effective uid and effective gid */ @@ -983,8 +988,9 @@ (me, "no child slot available (child array = %p, slot = %d)\n", child, ch->child_slot); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_NO_CHILD_SLOT); + return; } /* create the per user nscd if necessary */ @@ -1036,8 +1042,9 @@ if (ch->child_state != CHILD_STATE_PIDKNOWN) { - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_INVALID_SLOT_STATE); + return; } *door = ch->child_door; @@ -1046,7 +1053,7 @@ (me, "returning door %d for slot %d, uid %d, gid = %d\n", *door, ch->child_slot, set2uid, set2gid); - NSCD_RETURN_STATUS(phdr, NSS_ALTRETRY, 0); + NSCD_SET_STATUS(phdr, NSS_ALTRETRY, 0); } static char ** @@ -1260,8 +1267,9 @@ _NSCD_LOG(NSCD_LOG_SELF_CRED, NSCD_LOG_LEVEL_DEBUG) (me, "door_ucred failed: %s\n", strerror(errnum)); - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, errnum, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, errnum, NSCD_DOOR_UCRED_ERROR); + return; } /* get door client's effective uid */ @@ -1275,8 +1283,9 @@ /* is the per-user nscd running ? if not, no one to serve */ ch = get_cslot(uid, 1); if (ch == NULL) { - NSCD_RETURN_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, + NSCD_SET_N2N_STATUS(phdr, NSS_NSCD_PRIV, 0, NSCD_SELF_CRED_NO_CHILD_SLOT); + return; } ret = _nscd_doorcall_fd(ch->child_door, NSCD_GETADMIN, @@ -1457,8 +1466,7 @@ int found; char *me = "check_user_process"; - /*CONSTCOND*/ - while (1) { + for (;;) { (void) sleep(60); found = 0; @@ -1492,7 +1500,6 @@ } (void) closedir(dp); } - /* NOTREACHED */ /*LINTED E_FUNC_HAS_NO_RETURN_STMT*/ } diff -r a9ae30c28ee4 -r 98ca40df9171 usr/src/cmd/nscd/nscd_switch.c --- a/usr/src/cmd/nscd/nscd_switch.c Wed Apr 25 00:27:21 2012 -0400 +++ b/usr/src/cmd/nscd/nscd_switch.c Thu Apr 19 13:45:01 2012 -0500 @@ -22,6 +22,7 @@ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2012 Milan Jurik. All rights reserved. */ #include /* getenv() */ @@ -1352,13 +1353,15 @@ char *me = "nss_psearch"; if (buffer == NULL || length == 0) { - NSCD_RETURN_STATUS(pbuf, NSS_ERROR, EFAULT); + NSCD_SET_STATUS(pbuf, NSS_ERROR, EFAULT); + return; } status = nss_packed_arg_init(buffer, length, NULL, &initf, &dbop, &arg); if (status != NSS_SUCCESS) { - NSCD_RETURN_STATUS(pbuf, status, -1); + NSCD_SET_STATUS(pbuf, status, -1); + return; } /* @@ -1376,7 +1379,8 @@ */ rc = set_initf_key(pbuf); if (rc != 0) { - NSCD_RETURN_STATUS(pbuf, NSS_UNAVAIL, EINVAL); + NSCD_SET_STATUS(pbuf, NSS_UNAVAIL, EINVAL); + return; } initf = nscd_initf; @@ -1443,7 +1447,8 @@ nscd_getent_p1_cookie_t *cookie; if (buffer == NULL) { - NSCD_RETURN_STATUS(pbuf, NSS_ERROR, EFAULT); + NSCD_SET_STATUS(pbuf, NSS_ERROR, EFAULT); + return; } off = pbuf->key_off; @@ -1464,7 +1469,8 @@ if (cookie_num_p != NULL) *cookie_num_p = &cookie->p1_cookie_num; if (setent == 1 && cookie->p1_cookie_num == NSCD_NEW_COOKIE) { - NSCD_RETURN_STATUS_SUCCESS(pbuf); + NSCD_SET_STATUS_SUCCESS(pbuf); + return; } /* @@ -1475,8 +1481,10 @@ if (cookie->p1_seqnum == NSCD_P0_COOKIE_SEQNUM) { nscd_getent_p0_cookie_t *p0c = (nscd_getent_p0_cookie_t *)cookie; - if (p0c->p0_time == _nscd_get_start_time()) - NSCD_RETURN_STATUS_SUCCESS(pbuf); + if (p0c->p0_time == _nscd_get_start_time()) { + NSCD_SET_STATUS_SUCCESS(pbuf); + return; + } } _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_DEBUG) @@ -1490,7 +1498,8 @@ (me, "No matching context found (cookie number: %lld)\n", cookie->p1_cookie_num); - NSCD_RETURN_STATUS(pbuf, NSS_ERROR, EFAULT); + NSCD_SET_STATUS(pbuf, NSS_ERROR, EFAULT); + return; } /* if not called by nss_psetent, verify sequence number */ @@ -1500,12 +1509,13 @@ (me, "invalid sequence # (%lld)\n", cookie->p1_seqnum); _nscd_free_ctx_if_aborted(ctx); - NSCD_RETURN_STATUS(pbuf, NSS_ERROR, EFAULT); + NSCD_SET_STATUS(pbuf, NSS_ERROR, EFAULT); + return; } contextp->ctx = (struct nss_getent_context *)ctx; - NSCD_RETURN_STATUS_SUCCESS(pbuf); + NSCD_SET_STATUS_SUCCESS(pbuf); } void @@ -1520,7 +1530,8 @@ char *me = "nss_psetent"; if (buffer == NULL || length == 0) { - NSCD_RETURN_STATUS(pbuf, NSS_ERROR, EFAULT); + NSCD_SET_STATUS(pbuf, NSS_ERROR, EFAULT); + return; } /* @@ -1542,7 +1553,8 @@ _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_DEBUG) (me, "NSS_TRYLOCAL: fallback to caller process\n"); - NSCD_RETURN_STATUS(pbuf, NSS_TRYLOCAL, 0); + NSCD_SET_STATUS(pbuf, NSS_TRYLOCAL, 0); + return; } } } @@ -1590,7 +1602,7 @@ (me, "returning a p0 cookie: pid = %ld, time = %ld, seq #= %llx\n", p0c->p0_pid, p0c->p0_time, p0c->p0_seqnum); - NSCD_RETURN_STATUS(pbuf, NSS_SUCCESS, 0); + NSCD_SET_STATUS(pbuf, NSS_SUCCESS, 0); } static void @@ -1639,14 +1651,15 @@ _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_DEBUG) (me, "NSS_TRYLOCAL: cookie # = %lld, sequence # = %lld\n", *cookie_num_p, *seqnum_p); - NSCD_RETURN_STATUS(pbuf, NSS_TRYLOCAL, 0); + NSCD_SET_STATUS(pbuf, NSS_TRYLOCAL, 0); + return; } _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_DEBUG) (me, "NSS_SUCCESS: cookie # = %lld, sequence # = %lld\n", ctx->cookie_num, ctx->seq_num); - NSCD_RETURN_STATUS(pbuf, NSS_SUCCESS, 0); + NSCD_SET_STATUS(pbuf, NSS_SUCCESS, 0); } void @@ -1666,7 +1679,8 @@ char *me = "nss_pgetent"; if (buffer == NULL || length == 0) { - NSCD_RETURN_STATUS(pbuf, NSS_ERROR, EFAULT); + NSCD_SET_STATUS(pbuf, NSS_ERROR, EFAULT); + return; } /* verify the cookie passed in */ @@ -1680,7 +1694,8 @@ */ rc = set_initf_key(pbuf); if (rc != 0) { - NSCD_RETURN_STATUS(pbuf, NSS_UNAVAIL, EINVAL); + NSCD_SET_STATUS(pbuf, NSS_UNAVAIL, EINVAL); + return; } initf = nscd_initf; @@ -1703,7 +1718,8 @@ clear_initf_key(); _nscd_free_ctx_if_aborted( (nscd_getent_context_t *)contextp->ctx); - NSCD_RETURN_STATUS(pbuf, status, -1); + NSCD_SET_STATUS(pbuf, status, -1); + return; } /* Perform local search and pack results into return buffer */ @@ -1751,7 +1767,8 @@ char *me = "nss_pendent"; if (buffer == NULL || length == 0) { - NSCD_RETURN_STATUS(pbuf, NSS_ERROR, EFAULT); + NSCD_SET_STATUS(pbuf, NSS_ERROR, EFAULT); + return; } /* map the contextp from the cookie information */ @@ -1769,7 +1786,7 @@ /* Perform local endent and reset context */ nss_endent(NULL, NULL, contextp); - NSCD_RETURN_STATUS(pbuf, NSS_SUCCESS, 0); + NSCD_SET_STATUS(pbuf, NSS_SUCCESS, 0); } /*ARGSUSED*/ @@ -1779,5 +1796,5 @@ nss_pheader_t *pbuf = (nss_pheader_t *)buffer; /* unnecessary, kept for completeness */ - NSCD_RETURN_STATUS_SUCCESS(pbuf); + NSCD_SET_STATUS_SUCCESS(pbuf); }