diff options
| author | michen <none@none> | 2007-10-29 14:31:40 -0700 |
|---|---|---|
| committer | michen <none@none> | 2007-10-29 14:31:40 -0700 |
| commit | 18bdb8a7484e018149ac9a2766c97bdea9752c87 (patch) | |
| tree | 1d76bbec5ea617113bed5e39bc41727f51823f80 /usr/src | |
| parent | b6131d8fb9d81bf7aaa169dfc3f2f24f68825b18 (diff) | |
| download | illumos-joyent-18bdb8a7484e018149ac9a2766c97bdea9752c87.tar.gz | |
6612782 Repeated msg "yp_all: failed to get server's name" on cluster node consoles
6616435 nscd process aborts and dumps core with S10U4
6617555 nscd debug mode broken in S10U4
6620843 New nscd rejects databases without a source in nsswitch.conf
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/cmd/nscd/cache.c | 57 | ||||
| -rw-r--r-- | usr/src/cmd/nscd/nscd_cfgfile.c | 41 | ||||
| -rw-r--r-- | usr/src/cmd/nscd/nscd_log.c | 171 | ||||
| -rw-r--r-- | usr/src/cmd/nscd/nscd_log.h | 50 | ||||
| -rw-r--r-- | usr/src/cmd/nscd/nscd_switch.c | 179 | ||||
| -rw-r--r-- | usr/src/cmd/nscd/server.c | 26 | ||||
| -rw-r--r-- | usr/src/lib/nsswitch/ldap/common/getgrent.c | 50 | ||||
| -rw-r--r-- | usr/src/lib/nsswitch/ldap/common/ldap_common.c | 3 |
8 files changed, 323 insertions, 254 deletions
diff --git a/usr/src/cmd/nscd/cache.c b/usr/src/cmd/nscd/cache.c index f7abb08d58..e595a13c65 100644 --- a/usr/src/cmd/nscd/cache.c +++ b/usr/src/cmd/nscd/cache.c @@ -836,11 +836,11 @@ _nscd_cfg_cache_notify( /* group data */ if (_nscd_cfg_flag_is_set(dflag, NSCD_CFG_DFLAG_GROUP)) { if (_nscd_cfg_flag_is_set(pdesc->pflag, - NSCD_CFG_PFLAG_GLOBAL)) { + NSCD_CFG_PFLAG_GLOBAL)) { /* global config */ global_cfg = *(nscd_cfg_global_cache_t *)data; } else if (_nscd_cfg_flag_is_set(dflag, - NSCD_CFG_DFLAG_SET_ALL_DB)) { + NSCD_CFG_DFLAG_SET_ALL_DB)) { /* non-global config for all dbs */ for (i = 0; i < CACHE_CTX_COUNT; i++) { ctx = cache_ctx_p[i]; @@ -855,8 +855,7 @@ _nscd_cfg_cache_notify( /* non-global config for a specific db */ /* ignore non-caching databases */ - if (get_cache_ctx(nswdb->name, &ctx) != - NSCD_SUCCESS) + if (get_cache_ctx(nswdb->name, &ctx) != NSCD_SUCCESS) return (NSCD_SUCCESS); (void) rw_wrlock(&ctx->cfg_rwlp); ctx->cfg = *(nscd_cfg_cache_t *)data; @@ -867,13 +866,12 @@ _nscd_cfg_cache_notify( } /* individual data */ - if (_nscd_cfg_flag_is_set(pdesc->pflag, - NSCD_CFG_PFLAG_GLOBAL)) { + if (_nscd_cfg_flag_is_set(pdesc->pflag, NSCD_CFG_PFLAG_GLOBAL)) { /* global config */ dp = (char *)&global_cfg + pdesc->p_offset; (void) memcpy(dp, data, pdesc->p_size); } else if (_nscd_cfg_flag_is_set(dflag, - NSCD_CFG_DFLAG_SET_ALL_DB)) { + NSCD_CFG_DFLAG_SET_ALL_DB)) { /* non-global config for all dbs */ for (i = 0; i < CACHE_CTX_COUNT; i++) { ctx = cache_ctx_p[i]; @@ -931,7 +929,7 @@ _nscd_cfg_cache_get_stat( (void) mutex_lock(&cache_ctx_p[i]->stats_mutex); stats = cache_ctx_p[i]->stats; (void) mutex_unlock( - &cache_ctx_p[i]->stats_mutex); + &cache_ctx_p[i]->stats_mutex); } statsp->pos_hits += stats.pos_hits; statsp->neg_hits += stats.neg_hits; @@ -941,7 +939,7 @@ _nscd_cfg_cache_get_stat( statsp->drop_count += stats.drop_count; statsp->wait_count += stats.wait_count; statsp->invalidate_count += - stats.invalidate_count; + stats.invalidate_count; } } else { if ((rc = get_cache_ctx(nswdb->name, &ctx)) != NSCD_SUCCESS) { @@ -986,7 +984,7 @@ nsc_info(nsc_ctx_t *ctx, char *dbname, nscd_cfg_cache_t cfg[], } else if (rc == NSCD_NO_MEMORY) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_WARNING) (me, "%s: unable to create cache context - no memory\n", - dbname); + dbname); return; } ctx_info(ctx1); @@ -1208,14 +1206,14 @@ copy_result(void *rbuf, void *cbuf) dst = (char *)rphdr + rphdr->data_off; (void) memcpy(dst, (char *)cphdr + cphdr->data_off, - cphdr->data_len); + cphdr->data_len); rphdr->data_len = cphdr->data_len; /* some frontend code expects a terminating NULL char */ *(dst + rphdr->data_len) = '\0'; _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "cache data (len = %lld): >>%s<<\n", - cphdr->data_len, (char *)cphdr + cphdr->data_off); + cphdr->data_len, (char *)cphdr + cphdr->data_off); return (NSS_SUCCESS); } @@ -1233,7 +1231,7 @@ get_dns_ttl(void *pbuf, char *dbname) return (-1); if (strcmp(dbname, NSS_DBNAM_HOSTS) != 0 && - strcmp(dbname, NSS_DBNAM_IPNODES) != 0) + strcmp(dbname, NSS_DBNAM_IPNODES) != 0) return (-1); ttl = *(nssuint_t *)((void *)((char *)pbuf + phdr->ext_off)); @@ -1264,7 +1262,7 @@ check_config(nsc_lookup_args_t *largs, nscd_cfg_cache_t *cfgp, (void) rw_unlock(&ctx->cfg_rwlp); _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) (me, "config for context %s, database %s updated\n", - ctx->dbname, nscdb->name); + ctx->dbname, nscdb->name); } *cfgp = nscdb->cfg; @@ -1326,12 +1324,12 @@ check_db_file(nsc_ctx_t *ctx, nscd_cfg_cache_t cfg, } (void) mutex_unlock(&ctx->file_mutex); } else if (ctx->file_mtime < buf.st_mtime || - ctx->file_size != buf.st_size || - ctx->file_ino != buf.st_ino) { + ctx->file_size != buf.st_size || + ctx->file_ino != buf.st_ino) { (void) mutex_lock(&ctx->file_mutex); if (ctx->file_mtime < buf.st_mtime || - ctx->file_size != buf.st_size || - ctx->file_ino != buf.st_ino) { + ctx->file_size != buf.st_size || + ctx->file_ino != buf.st_ino) { file_modified = nscd_true; ctx->file_mtime = buf.st_mtime; ctx->file_size = buf.st_size; @@ -1343,8 +1341,8 @@ check_db_file(nsc_ctx_t *ctx, nscd_cfg_cache_t cfg, if (file_modified == nscd_true) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG) - (me, "%s: file %s has been modified - invalidating cache\n", - whoami, ctx->file_name); + (me, "%s: file %s has been modified - invalidating cache\n", + whoami, ctx->file_name); ctx_invalidate(ctx); } } @@ -1510,6 +1508,9 @@ lookup_int(nsc_lookup_args_t *largs, int flag) { (void) mutex_lock(&ctx->stats_mutex); ctx->stats.drop_count++; (void) mutex_unlock(&ctx->stats_mutex); + _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"); } @@ -1616,6 +1617,8 @@ lookup_int(nsc_lookup_args_t *largs, int flag) { * data not found in name service * update cache */ + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG_6) + (me, "%s: name service lookup failed\n", whoami); if (NSCD_GET_ERRNO(largs->buffer) == ERANGE) { delete_entry(nscdb, ctx, this_entry); @@ -1663,6 +1666,9 @@ lookup_int(nsc_lookup_args_t *largs, int flag) { /* * name service lookup failed */ + _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_DEBUG_6) + (me, "%s: name service lookup failed\n", whoami); + errnum = NSCD_GET_ERRNO(largs->buffer); if (delete == nscd_true) delete_entry(nscdb, ctx, this_entry); @@ -1804,7 +1810,7 @@ revalidate(nsc_ctx_t *ctx) (void) sleep(slp*2/3); for (i = 0; i < ctx->db_count; i++) { getxy_keepalive(ctx, ctx->nsc_db[i], - count, interval); + count, interval); } } else { (void) sleep(slp); @@ -1841,8 +1847,7 @@ getxy_keepalive(nsc_ctx_t *ctx, nsc_db_t *nscdb, int keep, int interval) /* leave pending calls alone */ if (!(entry->stats.status & ST_PENDING)) { /* do_revalidate */ - (void) insertn(table, entry->stats.hits, - entry); + (void) insertn(table, entry->stats.hits, entry); } entry = entry->qnext; } @@ -1917,11 +1922,11 @@ launch_update(nsc_lookup_args_t *in) int errnum; errnum = thr_create(NULL, NULL, (void *(*)(void*))do_update, - in, 0|THR_DETACHED, NULL); + in, 0|THR_DETACHED, NULL); if (errnum != 0) { _NSCD_LOG(NSCD_LOG_CACHE, NSCD_LOG_LEVEL_ERROR) - (me, "%s: thread creation failure (%d)\n", - in->nscdb->name, errnum); + (me, "%s: thread creation failure (%d)\n", + in->nscdb->name, errnum); return (-1); } return (0); diff --git a/usr/src/cmd/nscd/nscd_cfgfile.c b/usr/src/cmd/nscd/nscd_cfgfile.c index f3075ac792..c20794e59a 100644 --- a/usr/src/cmd/nscd/nscd_cfgfile.c +++ b/usr/src/cmd/nscd/nscd_cfgfile.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -44,8 +44,10 @@ strbreak(char *field[], int array_size, char *s, char *sep) int inquote; qp = strchr(s, '"'); - for (i = 0; i < array_size && (field[i] = - strtok_r((i?(char *)NULL:s), sep, &lasts)); i++); + for (i = 0; i < array_size && (field[i] = strtok_r((i?(char *)NULL:s), + sep, &lasts)); i++) { + /* empty */ + } if (qp == NULL) return (i); @@ -106,11 +108,11 @@ _nscd_cfg_read_file( if ((in = fopen(filename, "r")) == NULL) { (void) snprintf(msg, sizeof (msg), - gettext("open of configuration file \"%s\" failed: %s"), - filename, strerror(errno)); + gettext("open of configuration file \"%s\" failed: %s"), + filename, strerror(errno)); if (errorp != NULL) *errorp = _nscd_cfg_make_error( - NSCD_CFG_FILE_OPEN_ERROR, msg); + NSCD_CFG_FILE_OPEN_ERROR, msg); _NSCD_LOG(NSCD_LOG_CONFIG, NSCD_LOG_LEVEL_ERROR) (me, "%s\n", msg); @@ -124,7 +126,7 @@ _nscd_cfg_read_file( linecnt++; if ((fieldcnt = strbreak(fields, 128, buffer, " \t\n")) == - 0 || *fields[0] == '#') { + 0 || *fields[0] == '#') { /* skip blank or comment lines */ continue; } @@ -146,9 +148,9 @@ _nscd_cfg_read_file( (void) strlcpy(u.data, fields[0], sizeof (u.data)); for (i = 1; i < fieldcnt; i++) { (void) strlcat(u.data, " ", - sizeof (u.data)); + sizeof (u.data)); (void) strlcat(u.data, fields[i], - sizeof (u.data)); + sizeof (u.data)); } (void) snprintf(msg, sizeof (msg), @@ -156,7 +158,7 @@ _nscd_cfg_read_file( "file: %s : \"%s\""), linecnt, filename, u.data); if (errorp != NULL) *errorp = _nscd_cfg_make_error( - NSCD_CFG_SYNTAX_ERROR, msg); + NSCD_CFG_SYNTAX_ERROR, msg); _NSCD_LOG(NSCD_LOG_CONFIG, NSCD_LOG_LEVEL_ERROR) (me, "%s\n", msg); @@ -176,7 +178,7 @@ _nscd_cfg_read_file( /* convert string to data */ rc = _nscd_cfg_str_to_data(pdesc, str, &u.data, - &data_p, errorp); + &data_p, errorp); if (rc != NSCD_SUCCESS) break; @@ -241,11 +243,11 @@ _nscd_cfg_read_nsswitch_file( if ((in = fopen(filename, "r")) == NULL) { (void) snprintf(msg, sizeof (msg), - gettext("open of configuration file \"%s\" failed: %s"), - filename, strerror(errno)); + gettext("open of configuration file \"%s\" failed: %s"), + filename, strerror(errno)); if (errorp != NULL) *errorp = _nscd_cfg_make_error( - NSCD_CFG_FILE_OPEN_ERROR, msg); + NSCD_CFG_FILE_OPEN_ERROR, msg); _NSCD_LOG(NSCD_LOG_CONFIG, NSCD_LOG_LEVEL_ERROR) (me, "%s\n", msg); @@ -306,9 +308,10 @@ _nscd_cfg_read_nsswitch_file( c2 = ce - 1; while (cc <= c2 && isspace(*c2)) c2--; - if (c1 > c2) - syntax_err = 1; - else { + if (c1 > c2) { + /* no source specified, it's OK */ + continue; + } else { *dbe = '\0'; nsscfg = c1; *(c2 + 1) = '\0'; @@ -323,7 +326,7 @@ _nscd_cfg_read_nsswitch_file( "file: %s : \"%s\""), linecnt, filename, buffer); if (errorp != NULL) *errorp = _nscd_cfg_make_error( - NSCD_CFG_SYNTAX_ERROR, msg); + NSCD_CFG_SYNTAX_ERROR, msg); _NSCD_LOG(NSCD_LOG_CONFIG, NSCD_LOG_LEVEL_ERROR) (me, "%s\n", msg); @@ -348,7 +351,7 @@ _nscd_cfg_read_nsswitch_file( /* convert string to data */ rc = _nscd_cfg_str_to_data(pdesc, nsscfg, &u.data, - &data_p, errorp); + &data_p, errorp); if (rc != NSCD_SUCCESS) break; diff --git a/usr/src/cmd/nscd/nscd_log.c b/usr/src/cmd/nscd/nscd_log.c index 748fcb2ddb..ac6456b184 100644 --- a/usr/src/cmd/nscd/nscd_log.c +++ b/usr/src/cmd/nscd/nscd_log.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -52,9 +52,17 @@ #define LOGBUFLEN 1024 /* configuration for the nscd log component */ -int _nscd_log_comp = 0x0; -int _nscd_log_level = 0x0; -static char logfile[PATH_MAX]; +int _nscd_log_comp = 0x0; +int _nscd_log_level = 0x0; +static char _nscd_logfile[PATH_MAX] = { 0 }; + +#define NSCD_DEBUG_NONE '0' +#define NSCD_DEBUG_OPEN '1' +#define NSCD_DEBUG_CLOSE '2' + +static char _nscd_debug = NSCD_DEBUG_NONE; +static char _nscd_logfile_d[PATH_MAX] = { 0 }; +static char _nscd_logfile_s[PATH_MAX] = { 0 }; /* statistics data */ static nscd_cfg_stat_global_log_t logstats = { @@ -63,6 +71,7 @@ static nscd_cfg_stat_global_log_t logstats = { /* if no log file specified, log entry goes to stderr */ int _logfd = 2; + /* close old log file and open a new one */ static nscd_rc_t _nscd_set_lf( @@ -78,13 +87,13 @@ _nscd_set_lf( /* ignore empty log file specs */ return (NSCD_SUCCESS); } else if (strcmp(lf, "/dev/null") == 0) { - (void) strlcpy(logfile, lf, PATH_MAX); + (void) strlcpy(_nscd_logfile, lf, PATH_MAX); if (_logfd >= 0) (void) close(_logfd); _logfd = -1; return (NSCD_SUCCESS); } else if (strcmp(lf, "stderr") == 0) { - (void) strlcpy(logfile, lf, PATH_MAX); + (void) strlcpy(_nscd_logfile, lf, PATH_MAX); if (_logfd != -1 && _logfd != 2) (void) close(_logfd); _logfd = 2; @@ -105,34 +114,40 @@ _nscd_set_lf( struct stat before; if (lstat(lf, &before) < 0) { - _nscd_logit(me, "Cannot open new " - "logfile \"%s\": %sn", lf, strerror(errno)); + if (_nscd_debug == NSCD_DEBUG_NONE) + _nscd_logit(me, "Cannot open new " + "logfile \"%s\": %sn", + lf, strerror(errno)); return (NSCD_CFG_FILE_OPEN_ERROR); } if (S_ISREG(before.st_mode) && /* no symbolic links */ - (before.st_nlink == 1) && /* no hard links */ - (before.st_uid == 0)) { /* owned by root */ + (before.st_nlink == 1) && /* no hard links */ + (before.st_uid == 0)) { /* owned by root */ if ((newlogfd = open(lf, O_APPEND|O_WRONLY, 0644)) < 0) { - _nscd_logit(me, "Cannot open new "\ - "logfile \"%s\": %s\n", lf, - strerror(errno)); + if (_nscd_debug == NSCD_DEBUG_NONE) + _nscd_logit(me, + "Cannot open new "\ + "logfile \"%s\": %s\n", lf, + strerror(errno)); return (NSCD_CFG_FILE_OPEN_ERROR); } } else { - _nscd_logit(me, "Cannot use specified " - "logfile \"%s\": "\ - "file is/has links or isn't owned by "\ - "root\n", lf); + if (_nscd_debug == NSCD_DEBUG_NONE) + _nscd_logit(me, "Cannot use specified " + "logfile \"%s\": "\ + "file is/has links or isn't " + "owned by root\n", lf); return (NSCD_CFG_FILE_OPEN_ERROR); } } (void) close(_logfd); - (void) strlcpy(logfile, lf, PATH_MAX); + (void) strlcpy(_nscd_logfile, lf, PATH_MAX); _logfd = newlogfd; - _nscd_logit(me, "Start of new logfile %s\n", lf); + if (_nscd_debug == NSCD_DEBUG_NONE) + _nscd_logit(me, "Start of new logfile %s\n", lf); } return (NSCD_SUCCESS); } @@ -156,6 +171,26 @@ _nscd_logit( if (_logfd < 0) return; + if (_nscd_debug == NSCD_DEBUG_OPEN) { + (void) mutex_lock(&loglock); + if (_nscd_debug == NSCD_DEBUG_OPEN && + *_nscd_logfile_d != '\0' && + (strcmp(_nscd_logfile, "/dev/null") == 0 || + strcmp(_nscd_logfile, "stderr") == 0)) { + (void) strlcpy(_nscd_logfile_s, + _nscd_logfile, PATH_MAX); + (void) _nscd_set_lf(_nscd_logfile_d); + } + _nscd_debug = NSCD_DEBUG_NONE; + (void) mutex_unlock(&loglock); + } else if (_nscd_debug == NSCD_DEBUG_CLOSE) { + (void) mutex_lock(&loglock); + if (_nscd_debug == NSCD_DEBUG_CLOSE) + (void) _nscd_set_lf(_nscd_logfile_s); + _nscd_debug = NSCD_DEBUG_NONE; + (void) mutex_unlock(&loglock); + } + va_start(ap, format); if (gettimeofday(&tv, NULL) != 0 || @@ -173,9 +208,9 @@ _nscd_logit( offset = strlen(buffer) - 6; safechars = LOGBUFLEN - (offset - 1); (void) snprintf(buffer + offset, - safechars, ".%.4ld%s%s\t%s:\n\t\t", - tv.tv_usec/100, tid_buf, pid_buf, - funcname); + safechars, ".%.4ld%s%s\t%s:\n\t\t", + tv.tv_usec/100, tid_buf, pid_buf, + funcname); } offset = strlen(buffer); safechars = LOGBUFLEN - (offset - 1); @@ -193,6 +228,29 @@ _nscd_logit( va_end(ap); } +/* + * Map old nscd debug level (0 -10) to log level: + * -- >= 6: DBG_ALL --> NSCD_LOG_LEVEL_ALL + * -- >= 4: DBG_DBG_NETLOOKUPS --> NSCD_LOG_LEVEL_CANT_FIND + * -- >= 2: DBG_CANT_FIND --> NSCD_LOG_LEVEL_CANT_FIND + * -- >= 0: DBG_OFF --> NSCD_LOG_LEVEL_NONE + */ +static int +debug_to_log_level( + int level) +{ + if (level >= 0 && level <= 10) { + if (level >= DBG_ALL) + return (NSCD_LOG_LEVEL_ALL); + else if (level >= DBG_NETLOOKUPS) + return (NSCD_LOG_LEVEL_CANT_FIND); + else if (level >= DBG_CANT_FIND) + return (NSCD_LOG_LEVEL_CANT_FIND); + else if (level >= DBG_OFF) + return (NSCD_LOG_LEVEL_NONE); + } + return (level); +} /* ARGSUSED */ nscd_rc_t @@ -283,11 +341,11 @@ _nscd_cfg_log_verify( logcfg = (nscd_cfg_global_log_t *)data; if (_nscd_cfg_bitmap_valid(logcfg->debug_comp, - NSCD_LOG_ALL) == 0) + NSCD_LOG_ALL) == 0) return (NSCD_CFG_SYNTAX_ERROR); if (_nscd_cfg_bitmap_valid(logcfg->debug_level, - NSCD_LOG_LEVEL_ALL) == 0) + NSCD_LOG_LEVEL_ALL) == 0) return (NSCD_CFG_SYNTAX_ERROR); if (logcfg->logfile != NULL) @@ -372,51 +430,43 @@ _nscd_set_log_file( return (NSCD_SUCCESS); } -/* - * Map old nscd debug level to new one and make it current. - * -- debug component: NSCD_LOG_CACHE - * -- debug level: - * -- DBG_OFF --> NSCD_LOG_LEVEL_NONE - * -- DBG_CANT_FIND --> NSCD_LOG_LEVEL_ERROR - * -- DBG_DBG_NETLOOKUPS --> NSCD_LOG_LEVEL_ERROR - * -- DBG_ALL --> NSCD_LOG_LEVEL_ALL - */ +/* Set debug level to the new one and make it current */ nscd_rc_t _nscd_set_debug_level( int level) { nscd_rc_t rc; nscd_cfg_handle_t *h; - int l; - int c; + int l = 0; + int c = -1; - rc = _nscd_cfg_get_handle("debug-components", NULL, &h, NULL); - if (rc != NSCD_SUCCESS) - return (rc); - c = NSCD_LOG_CACHE; + /* old nscd debug level is 1 to 10, map it to log_level and log_comp */ + if (level >= 0 && level <= 10) { + l = debug_to_log_level(level); + c = NSCD_LOG_CACHE; + } else + l = level; if (level < 0) - c = -1 * level / 10000; - rc = _nscd_cfg_set(h, &c, NULL); - _nscd_cfg_free_handle(h); - if (rc != NSCD_SUCCESS) - exit(rc); + c = -1 * level / 1000000; + + if (c != -1) { + rc = _nscd_cfg_get_handle("debug-components", NULL, &h, NULL); + if (rc != NSCD_SUCCESS) + return (rc); + + rc = _nscd_cfg_set(h, &c, NULL); + _nscd_cfg_free_handle(h); + if (rc != NSCD_SUCCESS) + exit(rc); + } rc = _nscd_cfg_get_handle("debug-level", NULL, &h, NULL); if (rc != NSCD_SUCCESS) return (rc); - if (level == DBG_OFF) - l = NSCD_LOG_LEVEL_NONE; - else if (level >= DBG_CANT_FIND) - l = NSCD_LOG_LEVEL_ERROR; - else if (level >= DBG_NETLOOKUPS) - l = NSCD_LOG_LEVEL_ERROR; - else if (level >= DBG_ALL) - l = NSCD_LOG_LEVEL_ALL; - if (level < 0) - l = -1 * level % 10000; + l = -1 * level % 1000000; rc = _nscd_cfg_set(h, &l, NULL); _nscd_cfg_free_handle(h); @@ -425,3 +475,16 @@ _nscd_set_debug_level( return (NSCD_SUCCESS); } + +void +_nscd_get_log_info( + char *level, + int llen, + char *file, + int flen) +{ + if (_nscd_log_level != 0) + (void) snprintf(level, llen, "%d", _nscd_log_level); + if (*_nscd_logfile != '\0') + (void) strlcpy(file, _nscd_logfile, flen); +} diff --git a/usr/src/cmd/nscd/nscd_log.h b/usr/src/cmd/nscd/nscd_log.h index 784c74cf01..05aa596034 100644 --- a/usr/src/cmd/nscd/nscd_log.h +++ b/usr/src/cmd/nscd/nscd_log.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -41,32 +41,37 @@ extern "C" { * components: select more than one by OR'ing */ #define NSCD_LOG_NONE 0x0000 -#define NSCD_LOG_ACCESS_INFO 0x0001 -#define NSCD_LOG_INT_ADDR 0x0002 -#define NSCD_LOG_NSW_STATE 0x0004 -#define NSCD_LOG_GETENT_CTX 0x0008 -#define NSCD_LOG_SWITCH_ENGINE 0x0010 -#define NSCD_LOG_CONFIG 0x0020 -#define NSCD_LOG_FRONT_END 0x0040 -#define NSCD_LOG_CACHE 0x0080 -#define NSCD_LOG_SMF_MONITOR 0x0100 -#define NSCD_LOG_ADMIN 0x0200 -#define NSCD_LOG_SELF_CRED 0x0400 -#define NSCD_LOG_ALL 0x07ff +#define NSCD_LOG_CACHE 0x0001 +#define NSCD_LOG_SWITCH_ENGINE 0x0002 +#define NSCD_LOG_FRONT_END 0x0004 +#define NSCD_LOG_SELF_CRED 0x0008 +#define NSCD_LOG_ADMIN 0x0010 /* 16 */ +#define NSCD_LOG_CONFIG 0x0020 /* 32 */ +#define NSCD_LOG_SMF_MONITOR 0x0040 /* 64 */ +#define NSCD_LOG_NSW_STATE 0x0080 /* 128 */ +#define NSCD_LOG_GETENT_CTX 0x0100 /* 256 */ +#define NSCD_LOG_ACCESS_INFO 0x0200 /* 512 */ +#define NSCD_LOG_INT_ADDR 0x0400 /* 1024 */ +#define NSCD_LOG_ALL 0x07ff /* 2047 */ /* * debug level: select more than one by OR'ing */ #define NSCD_LOG_LEVEL_NONE 0x0000 -#define NSCD_LOG_LEVEL_CANT_FOUND 0x0001 -#define NSCD_LOG_LEVEL_ALERT 0x0002 -#define NSCD_LOG_LEVEL_CRIT 0x0004 -#define NSCD_LOG_LEVEL_ERROR 0x0008 -#define NSCD_LOG_LEVEL_WARNING 0x0010 -#define NSCD_LOG_LEVEL_NOTICE 0x0020 -#define NSCD_LOG_LEVEL_INFO 0x0040 -#define NSCD_LOG_LEVEL_DEBUG 0x0080 -#define NSCD_LOG_LEVEL_ALL 0x00ff +#define NSCD_LOG_LEVEL_CANT_FIND 0x0001 +#define NSCD_LOG_LEVEL_DEBUG 0x0100 /* 256 */ +#define NSCD_LOG_LEVEL_ERROR 0x0200 /* 512 */ +#define NSCD_LOG_LEVEL_WARNING 0x0400 /* 1024 */ +#define NSCD_LOG_LEVEL_INFO 0x0800 /* 2048 */ +#define NSCD_LOG_LEVEL_NOTICE 0x1000 /* 4096 */ +#define NSCD_LOG_LEVEL_ALERT 0x2000 /* 8192 */ +#define NSCD_LOG_LEVEL_CRIT 0x4000 /* 16384 */ +#define NSCD_LOG_LEVEL_ALL 0x7fff /* 32767 */ + +/* + * debug level: for backward compatibility + */ +#define NSCD_LOG_LEVEL_DEBUG_6 (NSCD_LOG_LEVEL_CANT_FIND | NSCD_LOG_LEVEL_ERROR) /* * _nscd_log_comp and _nscd_log_level defined in nscd_log.c @@ -88,6 +93,7 @@ extern int _nscd_log_level; void _nscd_logit(char *funcname, char *format, ...); nscd_rc_t _nscd_set_debug_level(int level); nscd_rc_t _nscd_set_log_file(char *name); +void _nscd_get_log_info(char *level, int llen, char *file, int flen); #ifdef __cplusplus } diff --git a/usr/src/cmd/nscd/nscd_switch.c b/usr/src/cmd/nscd/nscd_switch.c index 311bc60aaa..24b3b1a53e 100644 --- a/usr/src/cmd/nscd/nscd_switch.c +++ b/usr/src/cmd/nscd/nscd_switch.c @@ -334,7 +334,9 @@ trace_result( char *res_str; char *src = "?"; char *db = "?"; - char *me = "nss_search"; + char *data_str = "<NOT STRING FORMAT>"; + int data_len = 0; + char *me = "trace_result"; switch (res) { case NSS_SUCCESS: @@ -362,10 +364,15 @@ trace_result( if (srci != -1) src = NSCD_NSW_SRC_NAME(srci); + if (arg->buf.result == NULL) { + data_str = arg->buf.buffer; + data_len = arg->returnlen; + } + if (res == NSS_SUCCESS) { _nscd_logit(me, "%s: database: %s, operation: %d, " "source: %s returned >>%s<<, length = %d\n", - res_str, db, op, src, arg->buf.buffer, arg->returnlen); + res_str, db, op, src, data_str, data_len); return; } @@ -435,65 +442,84 @@ try_local2( return (rc); } - static nscd_rc_t -get_gss_func(void **func_p) +get_lib_func(void **handle, void **func, mutex_t *lock, + char *lib, char *name, void **func_p) { - char *me = "get_gss_func"; - static void *handle = NULL; - static mutex_t func_lock = DEFAULTMUTEX; - void *sym; - char *func_name = "gss_inquire_cred"; - static void *func = NULL; + char *me = "get_lib_func"; + void *sym; - if (handle != NULL && func_p != NULL && func != NULL) { - (void) memcpy(func_p, &func, sizeof (void *)); + if (func_p != NULL && *handle != NULL && *func != NULL) { + *func_p = *func; return (NSCD_SUCCESS); } - (void) mutex_lock(&func_lock); + (void) mutex_lock(lock); /* close the handle if requested */ if (func_p == NULL) { - if (handle != NULL) { - (void) dlclose(handle); - func = NULL; + if (*handle != NULL) { + (void) dlclose(*handle); + *handle = NULL; + *func = NULL; } - (void) mutex_unlock(&func_lock); + (void) mutex_unlock(lock); return (NSCD_SUCCESS); } - if (handle != NULL && func != NULL) { - (void) memcpy(func_p, &func, sizeof (void *)); - (void) mutex_unlock(&func_lock); + if (*handle != NULL && *func != NULL) { + *func_p = *func; + (void) mutex_unlock(lock); return (NSCD_SUCCESS); } - if (handle == NULL) { - handle = dlopen("libgss.so.1", RTLD_LAZY); - if (handle == NULL) { + if (*handle == NULL) { + *handle = dlopen(lib, RTLD_LAZY); + if (*handle == NULL) { _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_ERROR) - (me, "unable to dlopen libgss.so.1\n"); - (void) mutex_unlock(&func_lock); + (me, "unable to dlopen %s\n", lib); + (void) mutex_unlock(lock); return (NSCD_CFG_DLOPEN_ERROR); } } - if ((sym = dlsym(handle, func_name)) == NULL) { + if ((sym = dlsym(*handle, name)) == NULL) { _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_ERROR) - (me, "unable to find symbol %s\n", func_name); - (void) mutex_unlock(&func_lock); + (me, "unable to find symbol %s:%s\n", lib, name); + (void) mutex_unlock(lock); return (NSCD_CFG_DLSYM_ERROR); } else { - (void) memcpy(func_p, &sym, sizeof (void *)); - (void) memcpy(&func, &sym, sizeof (void *)); + *func_p = sym; + *func = sym; } - (void) mutex_unlock(&func_lock); + (void) mutex_unlock(lock); return (NSCD_SUCCESS); } +static nscd_rc_t +get_libc_nss_search(void **func_p) +{ + static void *handle = NULL; + static void *func = NULL; + static mutex_t lock = DEFAULTMUTEX; + + return (get_lib_func(&handle, &func, &lock, + "libc.so", "nss_search", func_p)); +} + +static nscd_rc_t +get_gss_func(void **func_p) +{ + static void *handle = NULL; + static void *func = NULL; + static mutex_t lock = DEFAULTMUTEX; + + return (get_lib_func(&handle, &func, &lock, + "libgss.so", "gss_inquire_cred", func_p)); +} + /* * get_dns_funcs returns pointers to gethostbyname functions in the * dynamically loaded nss_dns & nss_mdns modules that return host @@ -506,11 +532,10 @@ get_gss_func(void **func_p) static nscd_rc_t get_dns_funcs(int dnsi, nss_status_t (**func_p)(), const char *srcname) { - char *me = "get_dns_funcs"; int si; + void **funcpp; static void *handle[2] = { NULL, NULL }; static mutex_t func_lock[2] = { DEFAULTMUTEX, DEFAULTMUTEX }; - void *sym[2]; static void *func[2][2] = {{NULL, NULL}, {NULL, NULL}}; static const char *lib[2] = { "nss_dns.so.1", "nss_mdns.so.1" }; static const char *func_name[2][2] = @@ -529,53 +554,17 @@ get_dns_funcs(int dnsi, nss_status_t (**func_p)(), const char *srcname) * [1,0] = mdns/hosts, [1,1] = mdns/ipnodes */ - if (handle[si] != NULL && dnsi >= 0 && func[si][dnsi] != NULL) { - *func_p = (nss_status_t (*)()) func[si][dnsi]; - return (NSCD_SUCCESS); - } - - (void) mutex_lock(&func_lock[si]); - - /* close the handle if requested */ - if (dnsi < 0) { - if (handle[si] != NULL) { - (void) dlclose(handle[si]); - func[si][0] = NULL; - func[si][1] = NULL; - } - (void) mutex_unlock(&func_lock[si]); - return (NSCD_SUCCESS); - } - - if (handle[si] != NULL && func[si][dnsi] != NULL) { - *func_p = (nss_status_t (*)()) func[si][dnsi]; - (void) mutex_unlock(&func_lock[si]); - return (NSCD_SUCCESS); - } - - if (handle[si] == NULL) { - handle[si] = dlopen(lib[si], RTLD_LAZY); - if (handle[si] == NULL) { - _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_ERROR) - (me, "unable to dlopen %s\n", lib[si]); - (void) mutex_unlock(&func_lock[si]); - return (NSCD_CFG_DLOPEN_ERROR); - } - } - - if ((sym[si] = dlsym(handle[si], func_name[si][dnsi])) == NULL) { - - _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_ERROR) - (me, "unable to find symbol %s\n", func_name[si][dnsi]); + if (dnsi < 0) { /* close handle */ + funcpp = NULL; + (void) mutex_lock(&func_lock[si]); + func[si][0] = NULL; + func[si][1] = NULL; (void) mutex_unlock(&func_lock[si]); - return (NSCD_CFG_DLSYM_ERROR); - } else { - *func_p = (nss_status_t (*)()) sym[si]; - func[si][dnsi] = sym[si]; - } + } else + funcpp = (void **)func_p; - (void) mutex_unlock(&func_lock[si]); - return (NSCD_SUCCESS); + return (get_lib_func(&handle[si], &func[si][dnsi], &func_lock[si], + (char *)lib[si], (char *)func_name[si][dnsi], funcpp)); } static nss_status_t @@ -653,9 +642,19 @@ nss_search(nss_db_root_t *rootp, nss_db_initf_t initf, int search_fnum, * if unsupported database and the request is from the * the door, tell the door client to try it locally */ - if (initf == nscd_initf) + if (initf == nscd_initf) { res = NSS_TRYLOCAL; - goto error_exit; + goto error_exit; + } else { /* otherwise, let libc:nss_search() handle it */ + nss_status_t (*func)(); + + if (get_libc_nss_search((void **)&func) == + NSCD_SUCCESS) + return ((func)(rootp, initf, search_fnum, + search_args)); + else + goto error_exit; + } } dbi = params.dbi; @@ -669,10 +668,10 @@ nss_search(nss_db_root_t *rootp, nss_db_initf_t initf, int search_fnum, } /* - * for request that should be processed by the client, + * for door request that should be processed by the client, * send it back with status NSS_TRYLOCAL */ - if (try_local(dbi, search_args) == 1) { + if (initf == nscd_initf && try_local(dbi, search_args) == 1) { res = NSS_TRYLOCAL; goto error_exit; } @@ -734,8 +733,8 @@ nss_search(nss_db_root_t *rootp, nss_db_initf_t initf, int search_fnum, (*s->nsw_cfg_p)->nsw_cfg_str); for (n_src = 0; n_src < s->max_src; n_src++) { - nss_backend_t *be; - nss_backend_op_t funcp; + nss_backend_t *be = NULL; + nss_backend_op_t funcp = NULL; struct __nsw_lookup_v1 *lkp; int smf_state; int n_loop = 0; @@ -773,8 +772,9 @@ nss_search(nss_db_root_t *rootp, nss_db_initf_t initf, int search_fnum, smf_state = _nscd_get_smf_state(srci, dbi, 0); /* stop if the source is one that should be TRYLOCAL */ - if (smf_state == NSCD_SVC_STATE_UNKNOWN_SRC || - (params.privdb && try_local2(dbi, srci) == 1)) { + if (initf == nscd_initf && + (smf_state == NSCD_SVC_STATE_UNKNOWN_SRC || + (params.privdb && try_local2(dbi, srci) == 1))) { _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_DEBUG) (me, "returning TRYLOCAL ... \n"); res = NSS_TRYLOCAL; @@ -804,9 +804,10 @@ nss_search(nss_db_root_t *rootp, nss_db_initf_t initf, int search_fnum, if (be != NULL) funcp = NSS_LOOKUP_DBOP(be, search_fnum); - if ((params.dnsi >= 0 && be == 0) || (params.dnsi < 0 && - (be == 0 || (smf_state != NSCD_SVC_STATE_UNINITED && - smf_state < SCF_STATE_ONLINE) || funcp == 0))) { + if (be == NULL || (params.dnsi < 0 && (funcp == NULL || + (smf_state != NSCD_SVC_STATE_UNINITED && + smf_state != NSCD_SVC_STATE_UNKNOWN_SRC && + smf_state < SCF_STATE_ONLINE)))) { _NSCD_LOG(NSCD_LOG_SWITCH_ENGINE, NSCD_LOG_LEVEL_DEBUG) diff --git a/usr/src/cmd/nscd/server.c b/usr/src/cmd/nscd/server.c index 520a92be17..3ffb758cc0 100644 --- a/usr/src/cmd/nscd/server.c +++ b/usr/src/cmd/nscd/server.c @@ -66,7 +66,7 @@ extern nsc_ctx_t *cache_ctx_p[]; static void usage(char *); static void detachfromtty(void); -static int debug_level = 0; +static char debug_level[32] = { 0 }; static char logfile[128] = { 0 }; static int will_become_server; @@ -235,6 +235,8 @@ main(int argc, char ** argv) gettext("initialization of switch failed (rc = %d)\n"), rc); exit(1); } + _nscd_get_log_info(debug_level, sizeof (debug_level), + logfile, sizeof (logfile)); /* * initialize cache store @@ -298,16 +300,13 @@ main(int argc, char ** argv) case 'l': doset++; - (void) strlcpy(logfile, optarg, 128); - (void) _nscd_add_admin_mod(NULL, 'l', optarg, - msg, sizeof (msg)); + (void) strlcpy(logfile, optarg, sizeof (logfile)); break; case 'd': doset++; - debug_level = atoi(optarg); - (void) _nscd_add_admin_mod(NULL, 'd', optarg, - msg, sizeof (msg)); + (void) strlcpy(debug_level, optarg, + sizeof (debug_level)); break; case 'S': @@ -401,16 +400,17 @@ gettext("%s already running.... no administration option specified\n"), * if a log file is not specified, set it to * "stderr" or "/dev/null" based on debug level */ - if (_logfd < 0 && *logfile == '\0') { - if (debug_level != 0) + if (*logfile == '\0') { + if (*debug_level != '\0') /* we're debugging... */ (void) strcpy(logfile, "stderr"); else (void) strcpy(logfile, "/dev/null"); - - (void) _nscd_add_admin_mod(NULL, 'l', logfile, - msg, sizeof (msg)); } + (void) _nscd_add_admin_mod(NULL, 'l', logfile, + msg, sizeof (msg)); + (void) _nscd_add_admin_mod(NULL, 'd', debug_level, + msg, sizeof (msg)); /* activate command options */ if (_nscd_server_setadmin(NULL) != NSCD_SUCCESS) { @@ -419,7 +419,7 @@ gettext("%s already running.... no administration option specified\n"), exit(1); } - if (debug_level) { + if (*debug_level != '\0') { /* we're debugging, no forking of nscd */ /* diff --git a/usr/src/lib/nsswitch/ldap/common/getgrent.c b/usr/src/lib/nsswitch/ldap/common/getgrent.c index f20c48a4db..6601f0471b 100644 --- a/usr/src/lib/nsswitch/ldap/common/getgrent.c +++ b/usr/src/lib/nsswitch/ldap/common/getgrent.c @@ -121,8 +121,7 @@ _nss_ldap_group2str(ldap_backend_ptr be, nss_XbyY_args_t *argp) nss_result = NSS_STR_PARSE_PARSE; goto result_grp2str; } - len = snprintf(buffer, buflen, "%s:%s:%s:", - gname[0], password, gid[0]); + len = snprintf(buffer, buflen, "%s:%s:%s:", gname[0], password, gid[0]); TEST_AND_ADJUST(len, buffer, buflen, result_grp2str); members = __ns_ldap_getAttrStruct(result->entry, _G_MEM); @@ -138,12 +137,12 @@ _nss_ldap_group2str(ldap_backend_ptr be, nss_XbyY_args_t *argp) } if (firstime) { len = snprintf(buffer, buflen, "%s", - members->attrvalue[i]); + members->attrvalue[i]); TEST_AND_ADJUST(len, buffer, buflen, result_grp2str); firstime = 0; } else { len = snprintf(buffer, buflen, ",%s", - members->attrvalue[i]); + members->attrvalue[i]); TEST_AND_ADJUST(len, buffer, buflen, result_grp2str); } } @@ -173,8 +172,8 @@ getbynam(ldap_backend_ptr be, void *a) char groupname[SEARCHFILTERLEN]; int ret; - if (_ldap_filter_name(groupname, argp->key.name, sizeof (groupname)) - != 0) + if (_ldap_filter_name(groupname, argp->key.name, sizeof (groupname)) != + 0) return ((nss_status_t)NSS_NOTFOUND); ret = snprintf(searchfilter, sizeof (searchfilter), @@ -187,8 +186,7 @@ getbynam(ldap_backend_ptr be, void *a) return ((nss_status_t)NSS_NOTFOUND); return ((nss_status_t)_nss_ldap_lookup(be, argp, - _GROUP, searchfilter, NULL, - _merge_SSD_filter, userdata)); + _GROUP, searchfilter, NULL, _merge_SSD_filter, userdata)); } @@ -219,8 +217,7 @@ getbygid(ldap_backend_ptr be, void *a) return ((nss_status_t)NSS_NOTFOUND); return ((nss_status_t)_nss_ldap_lookup(be, argp, - _GROUP, searchfilter, NULL, - _merge_SSD_filter, userdata)); + _GROUP, searchfilter, NULL, _merge_SSD_filter, userdata)); } @@ -247,8 +244,6 @@ getbymember(ldap_backend_ptr be, void *a) int gcnt = (int)0; char **groupvalue, **membervalue; nss_status_t lstat; - nss_XbyY_args_t argb; - static nss_XbyY_buf_t *gb; struct nss_groupsbymem *argp = (struct nss_groupsbymem *)a; char searchfilter[SEARCHFILTERLEN]; char userdata[SEARCHFILTERLEN]; @@ -259,10 +254,6 @@ getbymember(ldap_backend_ptr be, void *a) gid_t gid; int ret; - /* LINTED E_EXPR_NULL_EFFECT */ - NSS_XbyY_ALLOC(&gb, sizeof (struct group), NSS_BUFLEN_GROUP); - NSS_XbyY_INIT(&argb, gb->result, gb->buffer, gb->buflen, 0); - if (strcmp(argp->username, "") == 0 || strcmp(argp->username, "root") == 0) return ((nss_status_t)NSS_NOTFOUND); @@ -279,9 +270,8 @@ getbymember(ldap_backend_ptr be, void *a) return ((nss_status_t)NSS_NOTFOUND); gcnt = (int)argp->numgids; - lstat = (nss_status_t)_nss_ldap_nocb_lookup(be, &argb, - _GROUP, searchfilter, NULL, - _merge_SSD_filter, userdata); + lstat = (nss_status_t)_nss_ldap_nocb_lookup(be, NULL, + _GROUP, searchfilter, NULL, _merge_SSD_filter, userdata); if (lstat != (nss_status_t)NS_LDAP_SUCCESS) return ((nss_status_t)lstat); if (be->result == NULL) @@ -295,17 +285,18 @@ getbymember(ldap_backend_ptr be, void *a) for (j = 0; membervalue[j]; j++) { if (strcmp(membervalue[j], username) == NULL) { groupvalue = __ns_ldap_getAttr(curEntry, - "gidnumber"); + "gidnumber"); gid = (gid_t)strtol(groupvalue[0], - (char **)NULL, 10); + (char **)NULL, 10); if (argp->numgids < argp->maxgids) { - for (k = 0; k < argp->numgids; - k++) { - if (argp->gid_array[k] == gid) + for (k = 0; k < argp->numgids; + k++) { + if (argp->gid_array[k] + == gid) /* already exists */ - break; - } - if (k == argp->numgids) + break; + } + if (k == argp->numgids) argp->gid_array[argp->numgids++] = gid; } @@ -317,7 +308,6 @@ getbymember(ldap_backend_ptr be, void *a) } (void) __ns_ldap_freeResult((ns_ldap_result_t **)&be->result); - NSS_XbyY_FREE(&gb); if (gcnt == argp->numgids) return ((nss_status_t)NSS_NOTFOUND); @@ -342,6 +332,6 @@ _nss_ldap_group_constr(const char *dummy1, const char *dummy2, { return ((nss_backend_t *)_nss_ldap_constr(gr_ops, - sizeof (gr_ops)/sizeof (gr_ops[0]), _GROUP, gr_attrs, - _nss_ldap_group2str)); + sizeof (gr_ops)/sizeof (gr_ops[0]), _GROUP, gr_attrs, + _nss_ldap_group2str)); } diff --git a/usr/src/lib/nsswitch/ldap/common/ldap_common.c b/usr/src/lib/nsswitch/ldap/common/ldap_common.c index db6800bba3..46284899c8 100644 --- a/usr/src/lib/nsswitch/ldap/common/ldap_common.c +++ b/usr/src/lib/nsswitch/ldap/common/ldap_common.c @@ -257,7 +257,8 @@ _nss_ldap_nocb_lookup(ldap_backend_ptr be, nss_XbyY_args_t *argp, if ((rc = __ns_ldap_list(database, searchfilter, init_filter_cb, be->attrs, NULL, 0, &be->result, &error, NULL, userdata)) != NS_LDAP_SUCCESS) { - argp->returnval = 0; + if (argp != NULL) + argp->returnval = 0; rc = switch_err(rc, error); (void) __ns_ldap_freeError(&error); return (rc); |
