usr/src/lib/libc/port/gen/nss_dbdefs.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 11411 c2fe1bf96826
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
3864
2ae506652d11 PSARC 2007/129 thr_keycreate_once
raf
parents: 3099
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
8765
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
    23
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    27
#include "lint.h"
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    28
#include <mtlib.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <limits.h>
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    35
#include <dlfcn.h>
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    36
#include <link.h>
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    37
#include <thread.h>
3864
2ae506652d11 PSARC 2007/129 thr_keycreate_once
raf
parents: 3099
diff changeset
    38
#include <atomic.h>
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    39
/* headers for key2str/str2key routines */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    40
#include <sys/ethernet.h>
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    41
#include <exec_attr.h>
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    42
#include <grp.h>
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    43
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    44
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    45
 * functions in nss_dbdefs.c deal more with the mechanics of
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    46
 * the data structures like nss_XbyY_args_t and the interaction
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    47
 * with the packed buffers etc.  versus the mechanics of the
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    48
 * actual policy component operations such as nss_search sequencing.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    49
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * ALIGN? is there an official definition of this?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * We use sizeof(long) to cover what we want
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 * for both the 32-bit world and 64-bit world.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#define	ALIGN(x) ((((long)(x)) + sizeof (long) - 1) & ~(sizeof (long) - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
nss_XbyY_buf_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
_nss_XbyY_buf_alloc(int struct_size, int buffer_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	nss_XbyY_buf_t	*b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	/* Use one malloc for dbargs, result struct and buffer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	b = (nss_XbyY_buf_t *)
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
    66
	    malloc(ALIGN(sizeof (*b)) + struct_size + buffer_size);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	if (b == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	b->result = (void *)ALIGN(&b[1]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	b->buffer = (char *)(b->result) + struct_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	b->buflen = buffer_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	return (b);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
_nss_XbyY_buf_free(nss_XbyY_buf_t *b)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	if (b != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
		free(b);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
/* === Comment:  used by fget{gr,pw,sp}ent */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
/* ==== Should do ye olde syslog()ing of suspiciously long lines */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
_nss_XbyY_fgets(FILE *f, nss_XbyY_args_t *b)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	char		buf[LINE_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	int		len, parsestat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	if (fgets(buf, LINE_MAX, f) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		/* End of file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		b->returnval = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
		b->erange    = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	len = (int)strlen(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	/* len >= 0 (otherwise we would have got EOF) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	if (buf[len - 1] != '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		if ((len + 1) == LINE_MAX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
			/* Line too long for buffer; too bad */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
			while (fgets(buf, LINE_MAX, f) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
			    buf[strlen(buf) - 1] != '\n') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
				;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
			b->returnval = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
			b->erange    = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
		/* case where the file is not terminated with a Newline */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		len++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	parsestat = (*b->str2ent)(buf, (len - 1), b->buf.result, b->buf.buffer,
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   116
	    b->buf.buflen);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	if (parsestat == NSS_STR_PARSE_ERANGE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		b->returnval = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		b->erange    = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	} else if (parsestat == NSS_STR_PARSE_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		b->returnval = b->buf.result;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
 * parse the aliases string into the buffer and if successful return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
 * a char ** pointer to the beginning of the aliases.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 * CAUTION: (instr, instr+lenstr) and (buffer, buffer+buflen) are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 * non-intersecting memory areas. Since this is an internal interface,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
 * we should be able to live with that.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
char **
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
_nss_netdb_aliases(const char *instr, int lenstr, char *buffer, int buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	/* "instr" is the beginning of the aliases string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	/* "buffer" has the return val for success */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	/* "buflen" is the length of the buffer available for aliases */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	 * Build the alias-list in the start of the buffer, and copy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	 * the strings to the end of the buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	const char
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		*instr_limit	= instr + lenstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	char	*copyptr	= buffer + buflen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	char	**aliasp	= (char **)ROUND_UP(buffer, sizeof (*aliasp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	char	**alias_start	= aliasp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	int	nstrings	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		const char	*str_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		size_t		str_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
		while (instr < instr_limit && isspace(*instr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
			instr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		if (instr >= instr_limit || *instr == '#') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		str_start = instr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		while (instr < instr_limit && !isspace(*instr)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
			instr++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		++nstrings;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		str_len = instr - str_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		copyptr -= str_len + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		if (copyptr <= (char *)(&aliasp[nstrings + 1])) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
			/* Has to be room for the pointer to */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
			/* the alias we're about to add,   */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
			/* as well as the final NULL ptr.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		*aliasp++ = copyptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		(void) memcpy(copyptr, str_start, str_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
		copyptr[str_len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	*aliasp++ = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	return (alias_start);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
}
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   182
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   183
3099
df972f671b58 6462185 /etc/hosts parsing is still retarded and broken
michen
parents: 2830
diff changeset
   184
extern nss_status_t process_cstr(const char *, int, struct nss_groupsbymem *);
df972f671b58 6462185 /etc/hosts parsing is still retarded and broken
michen
parents: 2830
diff changeset
   185
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   186
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   187
 * pack well known getXbyY keys to packed buffer prior to the door_call
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   188
 * to nscd.  Some consideration is given to ordering the tests based on
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   189
 * usage.  Note: buf is nssuint_t aligned.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   190
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   191
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   192
typedef struct {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   193
	const char	*name;		/* NSS_DBNAM_* */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   194
	const char	*defconf;	/* NSS_DEFCONF_* */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   195
	const char	*initfn;	/* init function name */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   196
	const char	*strfn;		/* str2X function name */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   197
	const char	*cstrfn;	/* cstr2X function name */
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   198
	void		*initfnp;	/* init function pointer */
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   199
	void		*strfnp;	/* str2X function pointer */
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   200
	uint32_t	dbop;		/* NSS_DBOP_* */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   201
	const char	*tostr;		/* key2str cvt str */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   202
} getXbyY_to_dbop_t;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   203
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   204
#define	NSS_MK_GETXYDBOP(x, y, f, e)	\
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   205
	{ NSS_DBNAM_##x, NSS_DEFCONF_##x, "_nss_initf_" f, "str2" f, \
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   206
		NULL, NULL, NULL, NSS_DBOP_##x##_##y, (e) }
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   207
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   208
#define	NSS_MK_GETXYDBOPA(x, a, f, e)	\
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   209
	{ NSS_DBNAM_##x, NSS_DEFCONF_##x, "_nss_initf_" f, "str2" f, \
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   210
		NULL, NULL, NULL, NSS_DBOP_##a, (e) }
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   211
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   212
#define	NSS_MK_GETXYDBOPB(x, b, a, f, s, e)	\
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   213
	{ NSS_DBNAM_##x, NSS_DEFCONF_##b, "_nss_initf_" f, s,  \
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   214
		NULL, NULL, NULL, NSS_DBOP_##a, (e) }
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   215
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   216
#define	NSS_MK_GETXYDBOPC(x, a, f, s, e)	\
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   217
	{ NSS_DBNAM_##x, NSS_DEFCONF_##x, "_nss_initf_" f, s, \
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   218
		NULL, NULL, NULL, NSS_DBOP_##x##_##a, (e) }
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   219
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   220
#define	NSS_MK_GETXYDBOPD(x, y, i, f, e)	\
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   221
	{ NSS_DBNAM_##x, NSS_DEFCONF_##x, "_nss_initf_" i, "str2" f, \
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   222
		NULL, NULL, NULL, NSS_DBOP_##x##_##y, (e) }
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   223
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   224
#define	NSS_MK_GETXYDBOPCSTR(x, a, f, s, e)	\
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   225
	{ NSS_DBNAM_##x, NSS_DEFCONF_##x, "_nss_initf_" f, s, \
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
   226
		"process_cstr", NULL, NULL, NSS_DBOP_##x##_##a, (e) }
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   227
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   228
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   229
 * The getXbyY_to_dbop structure is hashed on first call in order to
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   230
 * reduce the search time for the well known getXbyY operations.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   231
 * A binary search was not fast enough.  There were on average
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   232
 * 3-4 tests (strcmps) per getXbyY call.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   233
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   234
 * DBOP_PRIME_HASH must be a prime number (reasonably small) but that
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   235
 * is sufficient to uniquely map the entries in the following table
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   236
 * without collision.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   237
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   238
 * The DBOP_PRIME_HASH was selected as the smallest hash value
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   239
 * for this table without collisions. Changing this table WILL
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   240
 * necessitate re-testing for possible collisions.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   241
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   242
8765
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   243
#define	DBOP_PRIME_HASH		227
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   244
#define	DBOP_HASH_TAG		0xf0000000
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   245
static int getXbyYdbopHASH[DBOP_PRIME_HASH] = { 0 };
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   246
static mutex_t getXbydbop_hash_lock = DEFAULTMUTEX;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   247
static int getXbyYdbop_hashed = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   248
8765
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   249
/*
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   250
 * If the size of getXbyY_to_dbop[] is changed then hash function must be
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   251
 * corrected to be without collisions in nss_dbop_search().
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   252
 */
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   253
static getXbyY_to_dbop_t getXbyY_to_dbop[] = {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   254
	/* NSS_MK_GETXYDBOP(ALIASES, ?, ?), */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   255
	NSS_MK_GETXYDBOPD(AUDITUSER, BYNAME, "auuser", "audituser", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   256
	NSS_MK_GETXYDBOP(AUTHATTR, BYNAME, "authattr", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   257
	/* NSS_MK_GETXYDBOP(AUTOMOUNT, ?, ?), */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   258
	NSS_MK_GETXYDBOP(BOOTPARAMS, BYNAME, "bootparams", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   259
	NSS_MK_GETXYDBOPC(ETHERS, HOSTTON, "ethers", "str2ether", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   260
	NSS_MK_GETXYDBOPC(ETHERS, NTOHOST, "ethers", "str2ether", "e"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   261
	NSS_MK_GETXYDBOP(EXECATTR, BYNAME, "execattr", "A"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   262
	NSS_MK_GETXYDBOP(EXECATTR, BYID, "execattr", "A"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   263
	NSS_MK_GETXYDBOP(EXECATTR, BYNAMEID, "execattr", "A"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   264
	NSS_MK_GETXYDBOP(GROUP, BYNAME, "group", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   265
	NSS_MK_GETXYDBOP(GROUP, BYGID, "group", "g"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   266
	NSS_MK_GETXYDBOPCSTR(GROUP, BYMEMBER, "group", "str2group", "I"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   267
	NSS_MK_GETXYDBOPC(HOSTS, BYNAME, "hosts", "str2hostent", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   268
	NSS_MK_GETXYDBOPC(HOSTS, BYADDR, "hosts", "str2hostent", "h"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   269
	NSS_MK_GETXYDBOPC(IPNODES, BYNAME, "ipnodes", "str2hostent", "i"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   270
	NSS_MK_GETXYDBOPC(IPNODES, BYADDR, "ipnodes", "str2hostent", "h"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   271
	NSS_MK_GETXYDBOP(NETGROUP, IN, "netgroup", "t"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   272
	NSS_MK_GETXYDBOP(NETGROUP, SET, "netgroup", "T"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   273
	NSS_MK_GETXYDBOPC(NETMASKS, BYNET, "netmasks", "str2addr", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   274
	NSS_MK_GETXYDBOPC(NETWORKS, BYNAME, "net", "str2netent", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   275
	NSS_MK_GETXYDBOPC(NETWORKS, BYADDR, "net", "str2netent", "a"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   276
	NSS_MK_GETXYDBOP(PASSWD, BYNAME, "passwd", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   277
	NSS_MK_GETXYDBOP(PASSWD, BYUID, "passwd", "u"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   278
	NSS_MK_GETXYDBOP(PRINTERS, BYNAME, "printers", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   279
	NSS_MK_GETXYDBOP(PROFATTR, BYNAME, "profattr", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   280
	NSS_MK_GETXYDBOP(PROJECT, BYNAME, "project", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   281
	NSS_MK_GETXYDBOP(PROJECT, BYID, "project", "p"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   282
	NSS_MK_GETXYDBOPC(PROTOCOLS, BYNAME, "proto", "str2protoent", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   283
	NSS_MK_GETXYDBOPC(PROTOCOLS, BYNUMBER, "proto", "str2protoent", "N"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   284
	NSS_MK_GETXYDBOPA(PUBLICKEY, KEYS_BYNAME, "publickey", "k"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   285
	NSS_MK_GETXYDBOPC(RPC, BYNAME, "rpc", "str2rpcent", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   286
	NSS_MK_GETXYDBOPC(RPC, BYNUMBER, "rpc", "str2rpcent", "N"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   287
	NSS_MK_GETXYDBOPC(SERVICES, BYNAME, "services", "str2servent", "s"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   288
	NSS_MK_GETXYDBOPC(SERVICES, BYPORT, "services", "str2servent", "S"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   289
	NSS_MK_GETXYDBOPB(SHADOW, PASSWD, PASSWD_BYNAME, "shadow",
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   290
				"str2spwd", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   291
	NSS_MK_GETXYDBOPC(TSOL_RH, BYADDR, "tsol_rh", "str_to_rhstr", "h"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   292
	NSS_MK_GETXYDBOPC(TSOL_TP, BYNAME, "tsol_tp", "str_to_tpstr", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   293
	NSS_MK_GETXYDBOPC(TSOL_ZC, BYNAME, "tsol_zc", "str_to_zcstr", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   294
	NSS_MK_GETXYDBOP(USERATTR, BYNAME, "userattr", "n"),
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   295
};
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   296
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   297
static int
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   298
nss_dbop_search(const char *name, uint32_t dbop)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   299
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   300
	getXbyY_to_dbop_t *hptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   301
	int count = (sizeof (getXbyY_to_dbop) / sizeof (getXbyY_to_dbop_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   302
	uint32_t hval, g;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   303
	const char *cp;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   304
	int i, idx;
8765
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   305
	static const uint32_t hbits_tst = 0xf0000000;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   306
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   307
	/* Uses a table size is known to have no collisions */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   308
	if (getXbyYdbop_hashed == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   309
		lmutex_lock(&getXbydbop_hash_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   310
		if (getXbyYdbop_hashed == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   311
			for (i = 0; i < count; i++) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   312
				cp = getXbyY_to_dbop[i].name;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   313
				hval = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   314
				while (*cp) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   315
					hval = (hval << 4) + *cp++;
8765
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   316
					if ((g = (hval & hbits_tst)) != 0)
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   317
						hval ^= g >> 24;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   318
					hval &= ~g;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   319
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   320
				hval += getXbyY_to_dbop[i].dbop;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   321
				hval %= DBOP_PRIME_HASH;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   322
				if (getXbyYdbopHASH[hval] != 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   323
					/* hash table collision-see above */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   324
					lmutex_unlock(&getXbydbop_hash_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   325
					return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   326
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   327
				getXbyYdbopHASH[hval] = i | DBOP_HASH_TAG;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   328
			}
3864
2ae506652d11 PSARC 2007/129 thr_keycreate_once
raf
parents: 3099
diff changeset
   329
			membar_producer();
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   330
			getXbyYdbop_hashed = 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   331
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   332
		lmutex_unlock(&getXbydbop_hash_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   333
	}
3864
2ae506652d11 PSARC 2007/129 thr_keycreate_once
raf
parents: 3099
diff changeset
   334
	membar_consumer();
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   335
	cp = name;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   336
	hval = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   337
	while (*cp) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   338
		hval = (hval << 4) + *cp++;
8765
06531078004e 6742433 nss_dbddefs contains literals overflow
Milan Jurik <Milan.Jurik@Sun.COM>
parents: 6812
diff changeset
   339
		if ((g = (hval & hbits_tst)) != 0)
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   340
			hval ^= g >> 24;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   341
		hval &= ~g;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   342
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   343
	hval += dbop;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   344
	hval %= DBOP_PRIME_HASH;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   345
	idx = getXbyYdbopHASH[hval];
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   346
	if ((idx & DBOP_HASH_TAG) != DBOP_HASH_TAG)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   347
		return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   348
	idx &= ~DBOP_HASH_TAG;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   349
	if (idx >= count)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   350
		return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   351
	hptr = &getXbyY_to_dbop[idx];
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   352
	if (hptr->dbop != dbop || strcmp(name, hptr->name) != 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   353
		return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   354
	return (idx);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   355
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   356
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   357
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   358
 * nss_pack_key2str
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   359
 * Private key to string packing function for getXbyY routines
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   360
 * This routine performs a printf like parse over the argument
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   361
 * key, given a string of items to pack and assembles the key in
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   362
 * the packed structure.  This routine is called (currently) by
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   363
 * nss_default_key2str, but will be used by other external
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   364
 * APIs in the future.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   365
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   366
 * buffer - Start of the key buffer location [in packed buffer]
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   367
 * length - Length of key buffer component
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   368
 * Key offsets are relative to start of key buffer location.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   369
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   370
 * Pack fields			Key
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   371
 *   key.name			n
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   372
 *   key.number			N
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   373
 *   key.uid			u
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   374
 *   key.gid			g
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   375
 *   key.hostaddr		h
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   376
 *   key.ipnode			i
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   377
 *   key.projid			p
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   378
 *   key.serv(name)		s
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   379
 *   key.serv(port)		S
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   380
 *   key.ether			e
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   381
 *   key.pkey			k
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   382
 *   key.netaddr		a
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   383
 *   key.attrp			A
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   384
 *   groupsbymember		I
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   385
 *   innetgr_args		t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   386
 *   setnetgr_args		T
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   387
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   388
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   389
/*ARGSUSED*/
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   390
static nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   391
nss_pack_key2str(void *buffer, size_t length, nss_XbyY_args_t *arg,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   392
	const char *dbname, int dbop, size_t *rlen, const char *typestr)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   393
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   394
	int				i, j;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   395
	size_t				len, len2, len3, len4, len5, slop;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   396
	nssuint_t 			*uptr, offv, offc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   397
	struct nss_setnetgrent_args	*sng;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   398
	struct nss_innetgr_args		*ing;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   399
	struct nss_groupsbymem		*gbm;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   400
	char				**cv, *dptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   401
	nss_pnetgr_t			*pptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   402
	_priv_execattr			*pe;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   403
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   404
	if (buffer == NULL || length == 0 || arg == NULL ||
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   405
	    dbname == NULL || rlen == NULL || typestr == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   406
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   407
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   408
	while (typestr && *typestr) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   409
		switch (*typestr++) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   410
		case 'n':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   411
			if (arg->key.name == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   412
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   413
			len = strlen(arg->key.name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   414
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   415
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   416
			(void) strlcpy(buffer, arg->key.name, len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   417
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   418
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   419
		case 'N':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   420
			len = sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   421
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   422
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   423
			*(nssuint_t *)buffer = (nssuint_t)arg->key.number;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   424
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   425
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   426
		case 'u':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   427
			len = sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   428
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   429
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   430
			*(nssuint_t *)buffer = (nssuint_t)arg->key.uid;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   431
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   432
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   433
		case 'g':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   434
			len = sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   435
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   436
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   437
			*(nssuint_t *)buffer = (nssuint_t)arg->key.gid;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   438
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   439
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   440
		case 'h':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   441
			if (arg->key.hostaddr.addr == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   442
				return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   443
			len = arg->key.hostaddr.len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   444
			len = ROUND_UP(len, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   445
			len2 = (sizeof (nssuint_t) * 2) + len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   446
			if (len2 >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   447
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   448
			*(nssuint_t *)buffer =
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   449
			    (nssuint_t)arg->key.hostaddr.len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   450
			buffer = (void *)((char *)buffer + sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   451
			*(nssuint_t *)buffer =
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   452
			    (nssuint_t)arg->key.hostaddr.type;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   453
			buffer = (void *)((char *)buffer + sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   454
			(void) memcpy(buffer, arg->key.hostaddr.addr,
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   455
			    arg->key.hostaddr.len);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   456
			*rlen = len2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   457
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   458
		case 'i':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   459
			if (arg->key.ipnode.name == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   460
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   461
			len = strlen(arg->key.ipnode.name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   462
			len = ROUND_UP(len, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   463
			len2 = (sizeof (nssuint_t) * 2) + len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   464
			if (len2 >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   465
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   466
			*(nssuint_t *)buffer =
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   467
			    (nssuint_t)arg->key.ipnode.af_family;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   468
			buffer = (void *)((char *)buffer + sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   469
			*(nssuint_t *)buffer =
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   470
			    (nssuint_t)arg->key.ipnode.flags;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   471
			buffer = (void *)((char *)buffer + sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   472
			(void) strlcpy(buffer, arg->key.ipnode.name, len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   473
			*rlen = len2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   474
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   475
		case 'p':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   476
			len = sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   477
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   478
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   479
			*(nssuint_t *)buffer = (nssuint_t)arg->key.projid;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   480
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   481
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   482
		case 's':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   483
			if (arg->key.serv.serv.name == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   484
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   485
			len = strlen(arg->key.serv.serv.name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   486
			len2 = 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   487
			if (arg->key.serv.proto != NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   488
				len2 += strlen(arg->key.serv.proto);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   489
			len3 = len + len2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   490
			len3 = ROUND_UP(len3, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   491
			if (len3 >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   492
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   493
			(void) strlcpy(buffer, arg->key.serv.serv.name, len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   494
			buffer = (void *)((char *)buffer + len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   495
			if (len2 > 1)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   496
				(void) strlcpy(buffer, arg->key.serv.proto,
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   497
				    len2);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   498
			else
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   499
				*(char *)buffer = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   500
			*rlen = len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   501
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   502
		case 'S':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   503
			len2 = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   504
			if (arg->key.serv.proto != NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   505
				len2 = strlen(arg->key.serv.proto) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   506
			len = sizeof (nssuint_t) + len2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   507
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   508
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   509
			uptr = (nssuint_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   510
			*uptr++ = (nssuint_t)arg->key.serv.serv.port;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   511
			if (len2) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   512
				(void) strlcpy((char *)uptr,
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   513
				    arg->key.serv.proto, len2);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   514
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   515
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   516
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   517
		case 'e':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   518
			if (arg->key.ether == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   519
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   520
			len = sizeof (struct ether_addr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   521
			len = ROUND_UP(len, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   522
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   523
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   524
			*(struct ether_addr *)buffer =
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   525
			    *(struct ether_addr *)arg->key.ether;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   526
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   527
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   528
		case 'k':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   529
			if (arg->key.pkey.name == NULL ||
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   530
			    arg->key.pkey.keytype == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   531
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   532
			len = strlen(arg->key.pkey.name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   533
			len2 = strlen(arg->key.pkey.keytype) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   534
			len3 = len + len2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   535
			len3 = ROUND_UP(len3, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   536
			if (len3 >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   537
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   538
			(void) strlcpy(buffer, arg->key.pkey.name, len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   539
			buffer = (void *)((char *)buffer + len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   540
			(void) strlcpy(buffer, arg->key.pkey.keytype, len2);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   541
			*rlen = len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   542
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   543
		case 'a':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   544
			uptr = (nssuint_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   545
			len = sizeof (nssuint_t) * 2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   546
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   547
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   548
			*uptr++ = (nssuint_t)arg->key.netaddr.net;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   549
			*uptr++ = (nssuint_t)arg->key.netaddr.type;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   550
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   551
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   552
		case 'A':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   553
			pe = (_priv_execattr *)(arg->key.attrp);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   554
			if (pe == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   555
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   556
			/* for search flag */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   557
			len = sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   558
			/* for sizeof (_priv_execattr) static buffer */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   559
			/* Plus lots of slop just in case... */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   560
			slop = sizeof (nssuint_t) * 16;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   561
			len += slop;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   562
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   563
			len2 = len3 = len4 = len5 = 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   564
			if (pe->name != NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   565
				len2 = strlen(pe->name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   566
			if (pe->type != NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   567
				len3 = strlen(pe->type) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   568
			if (pe->id != NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   569
				len4 = strlen(pe->id) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   570
			if (pe->policy != NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   571
				len5 = strlen(pe->policy) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   572
			/* head_exec, prev_exec - are client side only... */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   573
			len += len2 + len3 + len4 + len5;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   574
			len = ROUND_UP(len, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   575
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   576
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   577
			(void) memset((void *)buffer, 0, slop);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   578
			uptr = (nssuint_t *)((void *)((char *)buffer + slop));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   579
			*uptr++ = (nssuint_t)pe->search_flag;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   580
			dptr = (char *)uptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   581
			if (len2 == 1)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   582
				*dptr++ = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   583
			else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   584
				(void) strlcpy(dptr, pe->name, len2);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   585
				dptr += len2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   586
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   587
			if (len3 == 1)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   588
				*dptr++ = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   589
			else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   590
				(void) strlcpy(dptr, pe->type, len3);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   591
				dptr += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   592
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   593
			if (len4 == 1)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   594
				*dptr++ = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   595
			else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   596
				(void) strlcpy(dptr, pe->id, len4);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   597
				dptr += len4;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   598
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   599
			if (len5 == 1)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   600
				*dptr++ = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   601
			else
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   602
				(void) strlcpy(dptr, pe->policy, len5);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   603
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   604
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   605
		case 'I':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   606
			gbm = (struct nss_groupsbymem *)arg;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   607
			if (gbm->username == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   608
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   609
			len = strlen(gbm->username) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   610
			len2 = sizeof (nssuint_t) * 4;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   611
			len2 += ROUND_UP(len, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   612
			if (len2 >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   613
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   614
			uptr = (nssuint_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   615
			*uptr++ = (nssuint_t)gbm->force_slow_way;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   616
			*uptr++ = (nssuint_t)gbm->maxgids;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   617
			*uptr++ = (nssuint_t)gbm->numgids;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   618
			if (gbm->numgids == 1) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   619
				*uptr++ = (nssuint_t)gbm->gid_array[0];
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   620
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   621
				*uptr++ = (nssuint_t)0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   622
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   623
			(void) strlcpy((void *)uptr, gbm->username, len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   624
			*rlen = len2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   625
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   626
		case 't':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   627
			pptr = (nss_pnetgr_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   628
			ing = (struct nss_innetgr_args *)arg;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   629
			len = sizeof (nss_pnetgr_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   630
			len2 = ing->arg[NSS_NETGR_MACHINE].argc +
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   631
			    ing->arg[NSS_NETGR_USER].argc +
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   632
			    ing->arg[NSS_NETGR_DOMAIN].argc +
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   633
			    ing->groups.argc;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   634
			len2 *= sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   635
			len3 = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   636
			for (j = 0; j < NSS_NETGR_N; j++) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   637
				cv = ing->arg[j].argv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   638
				for (i = ing->arg[j].argc; --i >= 0; ) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   639
					if (*cv)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   640
						len3 += strlen(*cv++) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   641
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   642
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   643
			cv = ing->groups.argv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   644
			for (i = ing->groups.argc; --i >= 0; ) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   645
				if (*cv)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   646
					len3 += strlen(*cv++) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   647
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   648
			len3 = ROUND_UP(len3, sizeof (nssuint_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   649
			/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   650
			 * Double argv space. Reason:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   651
			 *    First 1/2 offsets
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   652
			 *    Second 1/2 for client side pointer arrays
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   653
			 *    resolves malloc/free issues with unpacked argvs
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   654
			 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   655
			if ((len + (len2 << 1) + len3) >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   656
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   657
			*rlen = len + (len2 << 1) + len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   658
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   659
			pptr->machine_argc = ing->arg[NSS_NETGR_MACHINE].argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   660
			pptr->user_argc = ing->arg[NSS_NETGR_USER].argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   661
			pptr->domain_argc = ing->arg[NSS_NETGR_DOMAIN].argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   662
			pptr->groups_argc = ing->groups.argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   663
			offv = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   664
			uptr = (nssuint_t *)((void *)((char *)buffer + offv));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   665
			offc = len + (len2 << 1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   666
			dptr = (char *)buffer + offc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   667
			if (pptr->machine_argc == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   668
				pptr->machine_offv = (nssuint_t)0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   669
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   670
				pptr->machine_offv = offv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   671
				cv = ing->arg[NSS_NETGR_MACHINE].argv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   672
				i = pptr->machine_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   673
				offv += sizeof (nssuint_t) * i;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   674
				for (; --i >= 0; ) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   675
					*uptr++ = offc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   676
					len3 = strlen(*cv) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   677
					(void) strlcpy(dptr, *cv++, len3);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   678
					offc += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   679
					dptr += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   680
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   681
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   682
			if (pptr->user_argc == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   683
				pptr->user_offv = (nssuint_t)0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   684
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   685
				pptr->user_offv = offv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   686
				cv = ing->arg[NSS_NETGR_USER].argv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   687
				i = pptr->user_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   688
				offv += sizeof (nssuint_t) * i;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   689
				for (; --i >= 0; ) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   690
					*uptr++ = offc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   691
					len3 = strlen(*cv) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   692
					(void) strlcpy(dptr, *cv++, len3);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   693
					offc += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   694
					dptr += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   695
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   696
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   697
			if (pptr->domain_argc == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   698
				pptr->domain_offv = (nssuint_t)0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   699
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   700
				pptr->domain_offv = offv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   701
				cv = ing->arg[NSS_NETGR_DOMAIN].argv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   702
				i = pptr->domain_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   703
				offv += sizeof (nssuint_t) * i;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   704
				for (; --i >= 0; ) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   705
					*uptr++ = offc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   706
					len3 = strlen(*cv) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   707
					(void) strlcpy(dptr, *cv++, len3);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   708
					offc += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   709
					dptr += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   710
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   711
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   712
			if (pptr->groups_argc == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   713
				pptr->groups_offv = (nssuint_t)0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   714
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   715
				pptr->groups_offv = offv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   716
				cv = ing->groups.argv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   717
				i = pptr->groups_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   718
				offv += sizeof (nssuint_t) * i;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   719
				for (; --i >= 0; ) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   720
					*uptr++ = offc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   721
					len3 = strlen(*cv) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   722
					(void) strlcpy(dptr, *cv++, len3);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   723
					offc += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   724
					dptr += len3;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   725
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   726
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   727
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   728
		case 'T':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   729
			sng = (struct nss_setnetgrent_args *)arg;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   730
			if (sng->netgroup == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   731
				return (NSS_NOTFOUND);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   732
			len = strlen(sng->netgroup) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   733
			if (len >= length)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   734
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   735
			(void) strlcpy(buffer, sng->netgroup, len);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   736
			*rlen = len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   737
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   738
		default:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   739
			return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   740
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   741
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   742
	return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   743
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   744
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   745
nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   746
nss_default_key2str(void *buffer, size_t length, nss_XbyY_args_t *arg,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   747
	const char *dbname, int dbop, size_t *rlen)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   748
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   749
	int		index;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   750
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   751
	if (buffer == NULL || length == 0 || arg == NULL ||
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   752
	    dbname == NULL || rlen == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   753
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   754
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   755
	/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   756
	 * If this is not one of the well known getXbyYs
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   757
	 * (IE _printers special processing etc.) use a
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   758
	 * local (non-nscd) getXbyY lookup.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   759
	 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   760
	if ((index = nss_dbop_search(dbname, (uint32_t)dbop)) < 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   761
		return (NSS_TRYLOCAL);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   762
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   763
	return (nss_pack_key2str(buffer, length, arg, dbname,
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   764
	    dbop, rlen, getXbyY_to_dbop[index].tostr));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   765
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   766
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   767
/*ARGSUSED*/
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   768
void
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   769
nss_packed_set_status(void *buffer, size_t length, nss_status_t status,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   770
		nss_XbyY_args_t *arg)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   771
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   772
	nss_pheader_t 	*pbuf = (nss_pheader_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   773
	nss_dbd_t	*pdbd;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   774
	char		*dbn;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   775
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   776
	/* sidestep odd cases */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   777
	pdbd = (nss_dbd_t *)((void *)((char *)buffer + pbuf->dbd_off));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   778
	dbn = (char *)pdbd + pdbd->o_name;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   779
	if (pbuf->nss_dbop == NSS_DBOP_GROUP_BYMEMBER) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   780
		if (strcmp(dbn, NSS_DBNAM_GROUP) == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   781
			struct nss_groupsbymem *in =
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   782
			    (struct nss_groupsbymem *)arg;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   783
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   784
			if (in->numgids >= 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   785
				pbuf->p_status = NSS_SUCCESS;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   786
				pbuf->data_len = in->numgids *
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   787
				    sizeof (gid_t);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   788
				pbuf->p_herrno = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   789
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   790
				pbuf->p_status = status;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   791
				pbuf->p_errno = errno;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   792
				pbuf->data_len = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   793
				pbuf->p_herrno = (uint32_t)arg->h_errno;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   794
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   795
			return;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   796
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   797
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   798
	if (pbuf->nss_dbop == NSS_DBOP_NETGROUP_IN) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   799
		if (strcmp(dbn, NSS_DBNAM_NETGROUP) == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   800
			struct nss_innetgr_args *in =
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   801
			    (struct nss_innetgr_args *)arg;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   802
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   803
			/* tell nss_unpack() operation is successful */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   804
			pbuf->data_len = 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   805
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   806
			if (status != NSS_SUCCESS && status != NSS_NOTFOUND) {
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   807
				pbuf->p_status = status;
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   808
				pbuf->p_errno = errno;
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   809
				return;
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   810
			}
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   811
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   812
			if (in->status == NSS_NETGR_FOUND) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   813
				pbuf->p_status = NSS_SUCCESS;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   814
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   815
				pbuf->p_status = NSS_NOTFOUND;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   816
				pbuf->p_errno = errno;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   817
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   818
			return;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   819
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   820
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   821
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   822
	/* process normal cases */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   823
	if ((pbuf->p_status = status) != NSS_SUCCESS) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   824
		if (arg->erange == 1)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   825
			pbuf->p_errno = ERANGE;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   826
		else
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   827
			pbuf->p_errno = errno;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   828
	} else
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   829
		pbuf->p_errno = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   830
	if (arg != NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   831
		pbuf->p_herrno = (uint32_t)arg->h_errno;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   832
		pbuf->data_len = (nssuint_t)arg->returnlen;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   833
	} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   834
		pbuf->p_herrno = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   835
		pbuf->data_len = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   836
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   837
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   838
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   839
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   840
 * nss_upack_key2arg
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   841
 * Private string to key unpacking function for getXbyY routines
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   842
 * This routine performs a scanf/printf like parse over the packed
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   843
 * string, to uppack and re-assemble the key in the args structure.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   844
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   845
 * buffer - Start of the key buffer location [in packed buffer]
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   846
 * length - Length of key buffer component
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   847
 * Key offsets are relative to start of key buffer location.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   848
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   849
 * Unpack fields		Key
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   850
 *   key.name			n
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   851
 *   key.number			N
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   852
 *   key.uid			u
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   853
 *   key.gid			g
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   854
 *   key.hostaddr		h
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   855
 *   key.ipnode			i
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   856
 *   key.projid			p
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   857
 *   key.serv(name)		s
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   858
 *   key.serv(port)		S
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   859
 *   key.ether			e
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   860
 *   key.pkey			k
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   861
 *   key.netaddr		a
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   862
 *   key.attrp			A
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   863
 *   groupsbymember		I
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   864
 *   innetgr_args		t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   865
 *   setnetgr_args		T
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   866
 * Assumes arguments are all valid
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   867
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   868
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   869
/*ARGSUSED*/
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   870
static nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   871
nss_upack_key2arg(void *buffer, size_t length, char **dbname,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   872
		int *dbop, nss_XbyY_args_t *arg, int index)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   873
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   874
	nss_pheader_t 			*pbuf = (nss_pheader_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   875
	const char			*strtype = NULL;
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
   876
	nssuint_t 			off, *uptr, keysize;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   877
	size_t				len, slop;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   878
	int				i, j;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   879
	char				**cv, *bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   880
	struct nss_setnetgrent_args	*sng;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   881
	struct nss_innetgr_args		*ing;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   882
	struct nss_groupsbymem		*gbm;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   883
	nss_pnetgr_t			*pptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   884
	_priv_execattr			*pe;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   885
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
   886
	/* keysize is length of the key area */
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
   887
	keysize = pbuf->data_off - pbuf->key_off;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
   888
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   889
	off = pbuf->key_off;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   890
	bptr = (char *)buffer + off;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   891
	uptr = (nssuint_t *)((void *)bptr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   892
	strtype = getXbyY_to_dbop[index].tostr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   893
	if (strtype == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   894
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   895
	while (*strtype) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   896
		switch (*strtype++) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   897
		case 'n':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   898
			arg->key.name = (const char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   899
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   900
		case 'N':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   901
			arg->key.number = (int)(*uptr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   902
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   903
		case 'u':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   904
			arg->key.uid = (uid_t)(*uptr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   905
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   906
		case 'g':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   907
			arg->key.gid = (gid_t)(*uptr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   908
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   909
		case 'h':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   910
			arg->key.hostaddr.len = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   911
			arg->key.hostaddr.type = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   912
			arg->key.hostaddr.addr = (const char *)uptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   913
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   914
		case 'i':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   915
			arg->key.ipnode.af_family = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   916
			arg->key.ipnode.flags = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   917
			arg->key.ipnode.name = (const char *)uptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   918
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   919
		case 'p':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   920
			arg->key.projid = (projid_t)(*uptr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   921
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   922
		case 's':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   923
			arg->key.serv.serv.name = (const char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   924
			len = strlen(arg->key.serv.serv.name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   925
			bptr += len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   926
			if (*(const char *)bptr == '\0')
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   927
				arg->key.serv.proto = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   928
			else
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   929
				arg->key.serv.proto = (const char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   930
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   931
		case 'S':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   932
			arg->key.serv.serv.port = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   933
			if (pbuf->key_len == sizeof (nssuint_t)) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   934
				arg->key.serv.proto = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   935
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   936
				bptr += sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   937
				arg->key.serv.proto = (const char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   938
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   939
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   940
		case 'e':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   941
			arg->key.ether = bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   942
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   943
		case 'k':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   944
			arg->key.pkey.name = (const char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   945
			len = strlen(arg->key.pkey.name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   946
			bptr += len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   947
			arg->key.pkey.keytype = (const char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   948
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   949
		case 'a':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   950
			arg->key.netaddr.net = (uint32_t)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   951
			arg->key.netaddr.type = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   952
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   953
		case 'A':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   954
			pe = (_priv_execattr *)((void *)bptr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   955
			/* use slop space as priv_execattr structure */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   956
			arg->key.attrp = (void *)pe;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   957
			/* skip over slop ... */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   958
			slop = sizeof (nssuint_t) * 16;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   959
			uptr = (nssuint_t *)((void *)((char *)bptr + slop));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   960
			pe->search_flag = (int)*uptr++;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   961
			bptr = (char *)uptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   962
			if (*bptr == '\0') {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   963
				pe->name = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   964
				bptr++;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   965
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   966
				pe->name = (char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   967
				bptr += strlen(pe->name) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   968
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   969
			if (*bptr == '\0') {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   970
				pe->type = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   971
				bptr++;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   972
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   973
				pe->type = (char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   974
				bptr += strlen(pe->type) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   975
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   976
			if (*bptr == '\0') {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   977
				pe->id = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   978
				bptr++;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   979
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   980
				pe->id = (char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   981
				bptr += strlen(pe->id) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   982
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   983
			if (*bptr == '\0') {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   984
				pe->policy = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   985
			} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   986
				pe->policy = (char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   987
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   988
			pe->head_exec = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   989
			pe->prev_exec = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   990
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   991
		case 'I':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   992
			gbm = (struct nss_groupsbymem *)arg;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   993
			gbm->gid_array = (gid_t *)
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
   994
			    ((void *)((char *)pbuf + pbuf->data_off));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   995
			gbm->force_slow_way = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   996
			gbm->maxgids = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   997
			gbm->numgids = (int)(*uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   998
			if (gbm->numgids == 1) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
   999
				/* insert initial group into data area */
3099
df972f671b58 6462185 /etc/hosts parsing is still retarded and broken
michen
parents: 2830
diff changeset
  1000
				gbm->gid_array[0] = (gid_t)(*uptr++);
df972f671b58 6462185 /etc/hosts parsing is still retarded and broken
michen
parents: 2830
diff changeset
  1001
			} else
df972f671b58 6462185 /etc/hosts parsing is still retarded and broken
michen
parents: 2830
diff changeset
  1002
				uptr++;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1003
			gbm->username = (const char *)uptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1004
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1005
		case 't':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1006
			pptr = (nss_pnetgr_t *)((void *)bptr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1007
			ing = (struct nss_innetgr_args *)arg;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1008
			ing->arg[NSS_NETGR_MACHINE].argc = pptr->machine_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1009
			ing->arg[NSS_NETGR_USER].argc = pptr->user_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1010
			ing->arg[NSS_NETGR_DOMAIN].argc = pptr->domain_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1011
			ing->groups.argc = pptr->groups_argc;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1012
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1013
			/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1014
			 * Start of argv pointer storage
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1015
			 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1016
			off = ing->arg[NSS_NETGR_MACHINE].argc +
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1017
			    ing->arg[NSS_NETGR_USER].argc +
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1018
			    ing->arg[NSS_NETGR_DOMAIN].argc +
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1019
			    ing->groups.argc;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1020
			off *= sizeof (nssuint_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1021
			off += sizeof (nss_pnetgr_t);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1022
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1023
			cv = (char **)((void *)(bptr + off));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1024
			uptr = (nssuint_t *)
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1025
			    ((void *)(bptr + sizeof (nss_pnetgr_t)));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1026
			for (j = 0; j < NSS_NETGR_N; j++) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1027
				ing->arg[j].argv = cv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1028
				for (i = 0; i < ing->arg[j].argc; i++) {
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1029
					if (*uptr >= keysize)
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1030
						return (NSS_ERROR);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1031
					*cv++ = (bptr + *uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1032
				}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1033
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1034
			ing->groups.argv = cv;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1035
			for (i = 0; i < ing->groups.argc; i++) {
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1036
				if (*uptr >= keysize)
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1037
					return (NSS_ERROR);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1038
				*cv++ = (bptr + *uptr++);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1039
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1040
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1041
		case 'T':
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1042
			sng = (struct nss_setnetgrent_args *)arg;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1043
			sng->netgroup = (const char *)bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1044
			sng->iterator = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1045
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1046
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1047
		default:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1048
			return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1049
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1050
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1051
	return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1052
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1053
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1054
static nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1055
nss_pinit_funcs(int index, nss_db_initf_t *initf, nss_str2ent_t *s2e)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1056
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1057
	const char	*name;
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1058
	void		*htmp = NULL;
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1059
	void		*sym;
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1060
	static void	*handle = NULL;
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1061
	static mutex_t	handle_lock = DEFAULTMUTEX;
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1062
	static mutex_t	initf_lock = DEFAULTMUTEX;
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1063
	static mutex_t	s2e_lock = DEFAULTMUTEX;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1064
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1065
	if (handle == NULL) {
5914
4cb75cba32df 6655337 calling dlopen() while holding a lock with lmutex_lock() can cause an ASSERT() failure in libc
raf
parents: 5477
diff changeset
  1066
		htmp = dlopen((const char *)0, RTLD_LAZY);
4cb75cba32df 6655337 calling dlopen() while holding a lock with lmutex_lock() can cause an ASSERT() failure in libc
raf
parents: 5477
diff changeset
  1067
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1068
		lmutex_lock(&handle_lock);
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1069
		if (handle == NULL) {
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1070
			if (htmp == NULL) {
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1071
				lmutex_unlock(&handle_lock);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1072
				return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1073
			} else {
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1074
				membar_producer();
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1075
				handle = htmp;
5914
4cb75cba32df 6655337 calling dlopen() while holding a lock with lmutex_lock() can cause an ASSERT() failure in libc
raf
parents: 5477
diff changeset
  1076
				htmp = NULL;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1077
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1078
		}
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1079
		lmutex_unlock(&handle_lock);
5914
4cb75cba32df 6655337 calling dlopen() while holding a lock with lmutex_lock() can cause an ASSERT() failure in libc
raf
parents: 5477
diff changeset
  1080
		if (htmp)
11411
c2fe1bf96826 6894056 libc is not clean
Surya Prakki <Surya.Prakki@Sun.COM>
parents: 8765
diff changeset
  1081
			(void) dlclose(htmp);
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1082
	}
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1083
	membar_consumer();
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1084
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1085
	if (initf) {
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1086
		if (getXbyY_to_dbop[index].initfnp == NULL) {
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1087
			name = getXbyY_to_dbop[index].initfn;
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1088
			if ((sym = dlsym(handle, name)) == NULL)
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1089
				return (NSS_ERROR);
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1090
			lmutex_lock(&initf_lock);
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1091
			if (getXbyY_to_dbop[index].initfnp == NULL)
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1092
				getXbyY_to_dbop[index].initfnp = sym;
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1093
			membar_producer();
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1094
			lmutex_unlock(&initf_lock);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1095
		}
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1096
		membar_consumer();
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1097
		*initf = (nss_db_initf_t)getXbyY_to_dbop[index].initfnp;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1098
	}
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1099
	if (s2e) {
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1100
		if (getXbyY_to_dbop[index].strfnp == NULL) {
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1101
			name = getXbyY_to_dbop[index].strfn;
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1102
			if ((sym = dlsym(handle, name)) == NULL)
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1103
				return (NSS_ERROR);
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1104
			lmutex_lock(&s2e_lock);
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1105
			if (getXbyY_to_dbop[index].strfnp == NULL)
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1106
				getXbyY_to_dbop[index].strfnp = sym;
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1107
			membar_producer();
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1108
			lmutex_unlock(&s2e_lock);
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1109
		}
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1110
		membar_consumer();
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5914
diff changeset
  1111
		*s2e = (nss_str2ent_t)getXbyY_to_dbop[index].strfnp;
4046
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1112
	}
18a99a0d9b30 6496124 nscd: Unable to login with pam_unix_auth error
michen
parents: 3864
diff changeset
  1113
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1114
	return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1115
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1116
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1117
nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1118
nss_packed_getkey(void *buffer, size_t length, char **dbname,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1119
		int *dbop, nss_XbyY_args_t *arg)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1120
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1121
	nss_pheader_t 	*pbuf = (nss_pheader_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1122
	nss_dbd_t	*pdbd;
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1123
	nssuint_t 	off, dbdsize;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1124
	int		index;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1125
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1126
	if (buffer == NULL || length == 0 || dbop == NULL ||
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1127
	    arg == NULL || dbname == NULL)
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1128
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1129
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1130
	*dbop = pbuf->nss_dbop;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1131
	off = pbuf->dbd_off;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1132
	pdbd = (nss_dbd_t *)((void *)((char *)buffer + off));
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1133
	dbdsize = pbuf->key_off - pbuf->dbd_off;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1134
	if (pdbd->o_name >= dbdsize || pdbd->o_config_name >= dbdsize ||
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1135
	    pdbd->o_default_config >= dbdsize)
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1136
		return (NSS_ERROR);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1137
	*dbname = (char *)buffer + off + pdbd->o_name;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1138
	if ((index = nss_dbop_search(*dbname, (uint32_t)*dbop)) < 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1139
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1140
	return (nss_upack_key2arg(buffer, length, dbname, dbop, arg, index));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1141
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1142
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1143
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1144
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1145
 * str2packent: Standard format interposed str2X function for normal APIs
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1146
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1147
 * Return values: 0 = success, 1 = parse error, 2 = erange ...
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1148
 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1149
 * The structure pointer is ignored since this is a nscd side packed request.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1150
 * The client side routine does all the real parsing; we just check limits and
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1151
 * store the entry in the buffer we were passed by the caller.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1152
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1153
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1154
/*ARGSUSED*/
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1155
static int
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1156
str2packent(
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1157
    const char *instr,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1158
    int lenstr,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1159
    void *ent,		/* really (char *) */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1160
    char *buffer,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1161
    int buflen
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1162
)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1163
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1164
	if (buflen <= lenstr) {		/* not enough buffer */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1165
		return (NSS_STR_PARSE_ERANGE);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1166
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1167
	(void) memmove(buffer, instr, lenstr);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1168
	buffer[lenstr] = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1169
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1170
	return (NSS_STR_PARSE_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1171
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1172
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1173
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1174
 * Initialize db_root, initf, dbop and arg from a packed buffer
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1175
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1176
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1177
/*ARGSUSED*/
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1178
nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1179
nss_packed_arg_init(void *buffer, size_t length, nss_db_root_t *db_root,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1180
		nss_db_initf_t *initf, int *dbop, nss_XbyY_args_t *arg)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1181
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1182
	nss_pheader_t 		*pbuf = (nss_pheader_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1183
	nss_str2ent_t		s2e = str2packent;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1184
	nss_str2ent_t		real_s2e = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1185
	nss_dbd_t		*pdbd;
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1186
	nssuint_t		off, dbdsize;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1187
	char			*dbname, *bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1188
	size_t			len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1189
	int			index;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1190
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1191
	if (buffer == NULL || length == 0 ||
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1192
	    dbop == NULL || arg == NULL)
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1193
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1194
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1195
	/* init dbop */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1196
	*dbop = pbuf->nss_dbop;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1197
	off = pbuf->dbd_off;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1198
	pdbd = (nss_dbd_t *)((void *)((char *)buffer + off));
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1199
	dbdsize = pbuf->key_off - pbuf->dbd_off;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1200
	if (pdbd->o_name >= dbdsize || pdbd->o_config_name >= dbdsize ||
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1201
	    pdbd->o_default_config >= dbdsize)
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 4046
diff changeset
  1202
		return (NSS_ERROR);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1203
	dbname = (char *)buffer + off + pdbd->o_name;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1204
	if ((index = nss_dbop_search(dbname, (uint32_t)*dbop)) < 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1205
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1206
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1207
	/* db_root is initialized by nscd's based on door info */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1208
	/* do nothing here */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1209
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1210
	/* init key information - (and get dbname dbop etc...) */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1211
	if (nss_upack_key2arg(buffer, length, &dbname,
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1212
	    dbop, arg, index) != NSS_SUCCESS)
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1213
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1214
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1215
	/* possible audituser init */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1216
	if (strcmp(dbname, NSS_DBNAM_AUTHATTR) == 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1217
		arg->h_errno = (int)pbuf->p_herrno;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1218
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1219
	bptr = (char *)buffer + pbuf->data_off;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1220
	len = (size_t)pbuf->data_len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1221
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1222
	/* sidestep odd arg cases */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1223
	if (*dbop == NSS_DBOP_GROUP_BYMEMBER &&
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1224
	    strcmp(dbname, NSS_DBNAM_GROUP) == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1225
		/* get initf  and str2ent functions */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1226
		if (nss_pinit_funcs(index, initf, &real_s2e) != NSS_SUCCESS)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1227
			return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1228
		((struct nss_groupsbymem *)arg)->str2ent = real_s2e;
3099
df972f671b58 6462185 /etc/hosts parsing is still retarded and broken
michen
parents: 2830
diff changeset
  1229
		((struct nss_groupsbymem *)arg)->process_cstr = process_cstr;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1230
		return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1231
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1232
	if (pbuf->nss_dbop == NSS_DBOP_NETGROUP_IN &&
5477
0cf09bc2aa41 6602070 netgroup lookup should return NSS_UNAVAIL if only files backend is used
andra
parents: 4142
diff changeset
  1233
	    strcmp(dbname, NSS_DBNAM_NETGROUP) == 0) {
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1234
		return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1235
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1236
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1237
	/* get initf  and str2ent functions */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1238
	if (nss_pinit_funcs(index, initf, NULL) != NSS_SUCCESS)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1239
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1240
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1241
	/* init normal arg cases */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1242
	NSS_XbyY_INIT(arg, NULL, bptr, len, s2e);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1243
	arg->h_errno = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1244
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1245
	return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1246
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1247
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1248
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1249
 * Initialize db_root, initf, dbop, contextp and arg from a packed buffer
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1250
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1251
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1252
/*ARGSUSED*/
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1253
nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1254
nss_packed_context_init(void *buffer, size_t length, nss_db_root_t *db_root,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1255
		nss_db_initf_t *initf, nss_getent_t **contextp,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1256
		nss_XbyY_args_t *arg)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1257
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1258
	nss_pheader_t 	*pbuf = (nss_pheader_t *)buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1259
	nss_str2ent_t	s2e = str2packent;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1260
	char		*bptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1261
	size_t		len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1262
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1263
	/* init arg */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1264
	if (arg != NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1265
		bptr = (char *)buffer + pbuf->data_off;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1266
		len = (size_t)pbuf->data_len;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1267
		NSS_XbyY_INIT(arg, NULL, bptr, len, s2e);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1268
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1269
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1270
	return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
  1271
}