usr/src/lib/libc/port/gen/getxby_door.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 6812 febeba71273d
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: 1016
diff changeset
     5
 * Common Development and Distribution License (the "License").
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
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
 */
1016
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
    23
 * Copyright 2008 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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6351
diff changeset
    29
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/types.h>
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    32
#include <errno.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <pwd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <stdio.h>
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    36
#include <string.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <unistd.h>
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    41
#include <stdlib.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <getxby_door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/door.h>
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    44
#include <procfs.h>
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    45
#include <door.h>
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
    46
#include <sys/mman.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include "libc.h"
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    48
#include "tsd.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include "base_conversion.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    51
/* nss<->door hints */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    52
static mutex_t	hints_lock = DEFAULTMUTEX;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    53
static size_t	door_bsize = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    54
static size_t	door_nbsize = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    55
static int	proc_is_cache = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    56
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    57
/* library<->nscd door interaction apis */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    58
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * Routine that actually performs the door call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 * Note that we cache a file descriptor.  We do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 * the following to prevent disasters:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 * 1) Never use 0,1 or 2; if we get this from the open
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 *    we dup it upwards.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 * 2) Set the close on exec flags so descriptor remains available
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *    to child processes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 * 3) Verify that the door is still the same one we had before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *    by using door_info on the client side.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 *	Note that we never close the file descriptor if it isn't one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 *	we allocated; we check this with door info.  The rather tricky
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 *	logic is designed to be fast in the normal case (fd is already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 *	allocated and is ok) while handling the case where the application
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 *	closed it underneath us or where the nscd dies or re-execs itself
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
 *	and we're a multi-threaded application.  Note that we cannot protect
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 *	the application if it closes the fd and it is multi-threaded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 *
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    82
 *  int _nsc_trydoorcall(void *dptr, size_t *bufsize, size_t *actualsize);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 *      *dptr           IN: points to arg buffer OUT: points to results buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 *      *bufsize        IN: overall size of buffer OUT: overall size of buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 *      *actualsize     IN: size of call data OUT: size of return data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 *  Note that *dptr may change if provided space as defined by *bufsize is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 *  inadequate.  In this case the door call mmaps more space and places
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 *  the answer there and sets dptr to contain a pointer to the space, which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 *  should be freed with munmap.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 *  Returns 0 if the door call reached the server, -1 if contact was not made.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    97
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    98
 * Max size for list of db names supported by the private nscd
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
    99
 * No implied max here, any size will do, fixed size chosen to
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   100
 * reduce yet another malloc
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   101
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   102
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   103
#define	BD_BUFSIZE	1024
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   104
#define	BD_SEP		','
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   105
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   106
typedef struct _nsc_door_t {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   107
	int 		doorfd;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   108
	mutex_t		door_lock;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   109
	door_info_t 	doori;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   110
} nsc_door_t;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   111
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   112
static nsc_door_t	nsc_door[2] = {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   113
	{ -1, DEFAULTMUTEX, { 0 } },		/* front (fattached) door */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   114
	{ -1, DEFAULTMUTEX, { 0 } },		/* back (private) door */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   115
};
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   116
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   117
/* assumed to be locked by using nsc_door[1] mutex */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   118
static char	*nsc_db_buf = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   119
static char	**nsc_db_list = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   121
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   122
 * Check for a valid and matching db in the list.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   123
 * assume list is in the locked state.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   124
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   125
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   126
static int
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   127
_nsc_use_backdoor(char *db)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   128
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   129
	char 	**ndb;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   130
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   131
	if (db && nsc_db_buf != NULL && nsc_db_list != NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   132
		for (ndb = nsc_db_list; *ndb; ndb++) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   133
			if (strcmp(db, *ndb) == 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   134
				return (1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   135
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   136
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   137
	return (0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   138
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   139
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   140
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   141
 * flush private db lists
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   142
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   143
static void
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   144
_nsc_flush_private_db()
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
{
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   146
	if (nsc_db_buf != NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   147
		libc_free((void *)nsc_db_buf);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   148
		nsc_db_buf = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   149
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   150
	if (nsc_db_list != NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   151
		libc_free((void *)nsc_db_list);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   152
		nsc_db_list = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   153
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   154
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   155
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   156
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   157
 * init/update nsc_db_buf given buff containing list of
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   158
 * db's to be processed by a private nscd.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   159
 * This function assumes it has a well formed string from nscd.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   160
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   161
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   162
static int
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   163
_nsc_init_private_db(char *dblist)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   164
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   165
	char	*cp, **lp;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   166
	int	buflen = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   167
	int	arrlen = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   168
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   169
	if (dblist == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   170
		return (0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   171
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   172
	/* reset db list */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   173
	_nsc_flush_private_db();
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   174
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   175
	/* rebuild fresh list */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   176
	buflen = strlen(dblist) + 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   177
	for (cp = dblist; *cp; cp++)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   178
		if (*cp == BD_SEP)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   179
			arrlen++;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   180
	if (cp == dblist)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   181
		return (0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   182
	arrlen += 2;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   183
	nsc_db_buf = (char *)libc_malloc(buflen);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   184
	if (nsc_db_buf == (char *)NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   185
		return (0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   186
	nsc_db_list = (char **)libc_malloc(arrlen * sizeof (char *));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   187
	if (nsc_db_list == (char **)NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   188
		libc_free((void *)nsc_db_buf);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   189
		nsc_db_buf = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   190
		return (0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   191
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   192
	(void) memcpy(nsc_db_buf, dblist, buflen);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   193
	lp = nsc_db_list;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   194
	*lp++ = nsc_db_buf;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   195
	for (cp = nsc_db_buf; *cp; ) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   196
		if (*cp == BD_SEP) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   197
			*cp++ = '\0';
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   198
			*lp++ = cp;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   199
		} else
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   200
			cp++;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   201
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   202
	*lp = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   203
	return (1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   204
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   205
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   206
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   207
 * _nsc_initdoor_fp attempts to validate the given door and
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   208
 * confirm that it is still available for use.  The options are:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   209
 *	Front door:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   210
 *		If it's not open, attempt to open or error
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   211
 *		If it's open attempt to validate.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   212
 *		If it's not validatable, reset fd and try again.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   213
 *		Other wise it open and validated, return success
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   214
 *	Per user (back) door:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   215
 *		This door is passed to the client through th front door
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   216
 *		attempt to validate it.  If it can't be validated, it
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   217
 *		must be reset. Then send a NSS_ALTRESET error, so nscd can
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   218
 *		forward another fd if desired.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   219
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   220
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   221
static nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   222
_nsc_initdoor_fp(nsc_door_t *dp)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   223
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   224
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	door_info_t 		my_door;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   226
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   227
	if (dp == NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   228
		errno = ENOTCONN;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   229
		return (NSS_ERROR);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   230
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	/*
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   233
	 * the first time in we try and open and validate the front door.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   234
	 * A front door request may return an alternate private back door
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   235
	 * that the client should use instead.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   236
	 *
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   237
	 * To validate a door the door must have been created with
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   238
	 * the name service door cookie. The front door is file
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   239
	 * attached, owned by root and readonly by user, group and
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   240
	 * other.  If any of these validations fail we refuse to use
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   241
	 * the door.  A back door is delivered from the front door
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   242
	 * via a door_desc_t, and have the same cooke notification.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   245
	lmutex_lock(&dp->door_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
try_again:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   249
	if (dp->doorfd == -1 && dp == &nsc_door[0]) {	/* open front door */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		int		tbc[3];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		int		i;
1016
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   252
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   253
		dp->doorfd = open64(NAME_SERVICE_DOOR, O_RDONLY, 0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   254
		if (dp->doorfd == -1) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   255
			lmutex_unlock(&dp->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   256
			return (NSS_ERROR);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		 * dup up the file descriptor if we have 0 - 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
		 * to avoid problems with shells stdin/out/err
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   265
		while (dp->doorfd < 3) { /* we have a reserved fd */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   266
			tbc[i++] = dp->doorfd;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   267
			if ((dp->doorfd = dup(dp->doorfd)) < 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
				while (i--)
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   269
					(void) close(tbc[i]);
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   270
				dp->doorfd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   271
				lmutex_unlock(&dp->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   272
				return (NSS_ERROR);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		while (i--)
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   277
			(void) close(tbc[i]);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		 * mark this door descriptor as close on exec
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		 */
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   282
		(void) fcntl(dp->doorfd, F_SETFD, FD_CLOEXEC);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   283
		if (__door_info(dp->doorfd, &dp->doori) < 0 ||
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   284
		    (dp->doori.di_attributes & DOOR_REVOKED) ||
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   285
		    dp->doori.di_data != (uintptr_t)NAME_SERVICE_DOOR_COOKIE) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
			 * we should close doorfd because we just opened it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
			 */
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   289
			(void) close(dp->doorfd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   290
			dp->doorfd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   291
			(void) memset((void *)&dp->doori,
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   292
			    '\0', sizeof (door_info_t));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   293
			lmutex_unlock(&dp->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   294
			errno = ECONNREFUSED;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   295
			return (NSS_ERROR);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		}
1016
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   297
	} else {
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   298
		if (__door_info(dp->doorfd, &my_door) < 0 ||
1016
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   299
		    my_door.di_data != (uintptr_t)NAME_SERVICE_DOOR_COOKIE ||
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   300
		    my_door.di_uniquifier != dp->doori.di_uniquifier) {
1016
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   301
			/*
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   302
			 * don't close it -
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   303
			 * someone else has clobbered fd
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   304
			 */
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   305
			dp->doorfd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   306
			(void) memset((void *)&dp->doori,
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   307
			    '\0', sizeof (door_info_t));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   308
			if (dp == &nsc_door[1]) {	/* reset back door */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   309
				/* flush invalid db list */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   310
				_nsc_flush_private_db();
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   311
				lmutex_unlock(&dp->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   312
				return (NSS_ALTRESET);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   313
			}
1016
a2290e972fca 6350867 gcc and libc don't get along on sparc
raf
parents: 0
diff changeset
   314
			goto try_again;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		if (my_door.di_attributes & DOOR_REVOKED) {
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   318
			(void) close(dp->doorfd);	/* nscd exited .... */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   319
			dp->doorfd = -1;	/* try and restart connection */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   320
			(void) memset((void *)&dp->doori,
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   321
			    '\0', sizeof (door_info_t));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   322
			if (dp == &nsc_door[1]) {	/* back door reset */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   323
				/* flush invalid db list */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   324
				_nsc_flush_private_db();
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   325
				lmutex_unlock(&dp->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   326
				return (NSS_ALTRESET);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   327
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			goto try_again;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   332
	lmutex_unlock(&dp->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   333
	return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   334
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   335
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   336
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   337
 * Try the door request once only, to the specified connection.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   338
 * return the results or error.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   339
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   340
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   341
static nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   342
_nsc_try1door(nsc_door_t *dp, void **dptr, size_t *ndata,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   343
			size_t *adata, int *pdesc)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   344
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   345
	door_arg_t		param;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   346
	int			ret;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   347
	nss_pheader_t		*rp;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   348
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   349
	ret = _nsc_initdoor_fp(dp);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   350
	if (ret != NSS_SUCCESS)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   351
		return (ret);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	param.rbuf = (char *)*dptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	param.rsize = *ndata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	param.data_ptr = (char *)*dptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	param.data_size = *adata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	param.desc_ptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	param.desc_num = 0;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   359
	ret = __door_call(dp->doorfd, &param);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   360
	if (ret < 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   361
		return (NSS_ERROR);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	}
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   363
	*adata = param.data_size;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   364
	*ndata = param.rsize;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   365
	*dptr = (void *)param.data_ptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   366
	rp = (nss_pheader_t *)((void *)param.rbuf);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   367
	if (pdesc != NULL && rp && rp->p_status == NSS_ALTRETRY &&
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   368
	    param.desc_ptr != NULL && param.desc_num > 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   369
		if ((param.desc_ptr->d_attributes & DOOR_DESCRIPTOR) &&
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   370
		    param.desc_ptr->d_data.d_desc.d_descriptor >= 0 &&
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   371
		    param.desc_ptr->d_data.d_desc.d_id != 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   372
			/* have an alt descriptor */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   373
			*pdesc = param.desc_ptr->d_data.d_desc.d_descriptor;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   374
			/* got a NSS_ALTRETRY command */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   375
			return (NSS_ALTRETRY);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   376
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   377
		errno = EINVAL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   378
		return (NSS_ERROR);		/* other error? */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   379
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	if (*adata == 0 || *dptr == NULL) {
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   381
		errno = ENOTCONN;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   382
		return (NSS_ERROR);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   385
	if (rp->p_status == NSS_ALTRESET ||
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   386
	    rp->p_status == NSS_ALTRETRY ||
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   387
	    rp->p_status == NSS_TRYLOCAL)
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   388
		return (rp->p_status);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   389
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   390
	return (NSS_SUCCESS);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   391
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   392
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   393
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   394
 * Backwards compatible API
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   395
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   396
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   397
nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   398
_nsc_trydoorcall(void **dptr, size_t *ndata, size_t *adata)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   399
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   400
	return (_nsc_try1door(&nsc_door[0], dptr, ndata, adata, NULL));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
}
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   402
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   403
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   404
 * Send the request to the designated door, based on the supplied db
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   405
 * Retry on the alternate door fd if possible.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   406
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   407
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   408
nss_status_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   409
_nsc_trydoorcall_ext(void **dptr, size_t *ndata, size_t *adata)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   410
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   411
	int		ret = NSS_ALTRETRY;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   412
	nsc_door_t	*frontd = &nsc_door[0];
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   413
	nsc_door_t	*backd = &nsc_door[1];
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   414
	int		fd;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   415
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   416
	nss_pheader_t	*ph, ph_save;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   417
	char		*dbl;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   418
	char		*db = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   419
	nss_dbd_t	*dbd;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   420
	int		fb2frontd = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   421
	int		reset_frontd = 0;
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   422
	size_t		ndata_save = *ndata, adata_save = *adata;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   423
	void		*dptr_save = *dptr;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   424
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   425
	ph = (nss_pheader_t *)*dptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   426
	dbd = (nss_dbd_t *)((void *)((char *)ph + ph->dbd_off));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   427
	if (dbd->o_name != 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   428
		db = (char *)dbd + dbd->o_name;
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   429
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   430
	/*
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   431
	 * save away a copy of the header, in case the request needs
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   432
	 * to be sent to nscd more than once. In that case, this
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   433
	 * original header can be copied back to the door buffer
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   434
	 * to replace the possibly changed header
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   435
	 */
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   436
	ph_save = *ph;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   437
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   438
	while (ret == NSS_ALTRETRY || ret == NSS_ALTRESET) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   439
		/* try private (back) door first if it exists and applies */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   440
		if (db != NULL && backd->doorfd > 0 && fb2frontd == 0 &&
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   441
		    _nsc_use_backdoor(db)) {
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   442
			ret = _nsc_try1door(backd, dptr, ndata, adata, NULL);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   443
			if (ret == NSS_ALTRESET) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   444
				/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   445
				 * received NSS_ALTRESET command,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   446
				 * retry on front door
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   447
				 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   448
				lmutex_lock(&backd->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   449
				backd->doorfd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   450
				(void) memset((void *)&backd->doori,
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   451
				    '\0', sizeof (door_info_t));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   452
				/* flush now invalid db list */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   453
				_nsc_flush_private_db();
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   454
				lmutex_unlock(&backd->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   455
				continue;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   456
			} else if (ret == NSS_ALTRETRY) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   457
				/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   458
				 * received NSS_ALTRETRY command,
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   459
				 * fall back and retry on front door
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   460
				 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   461
				fb2frontd = 1;
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   462
				if (*dptr != dptr_save)
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   463
					(void) munmap((void *)*dptr, *ndata);
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   464
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   465
				/*
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   466
				 * restore the buffer size and header
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   467
				 * data so that the front door will
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   468
				 * see the original request
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   469
				 */
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   470
				*ndata = ndata_save;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   471
				*adata = adata_save;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   472
				*dptr = dptr_save;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   473
				ph =  (nss_pheader_t *)*dptr;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   474
				*ph = ph_save;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   475
				/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   476
				 * tell the front door server, this is
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   477
				 * a fallback call
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   478
				 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   479
				ph->p_status = NSS_ALTRETRY;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   480
				continue;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   481
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   482
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   483
			/* return the result or error */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   484
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   485
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   486
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   487
		/* try the front door */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   488
		fd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   489
		ret = _nsc_try1door(frontd, dptr, ndata, adata, &fd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   490
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   491
		if (ret != NSS_ALTRETRY) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   492
			/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   493
			 * got a success or failure result.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   494
			 * but front door should never send NSS_ALTRESET
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   495
			 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   496
			if (ret == NSS_ALTRESET)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   497
				/* reset the front door */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   498
				reset_frontd = 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   499
			else
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   500
				/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   501
				 * not NSS_ALTRETRY and not NSS_ALTRESET
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   502
				 * return the result or error
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   503
				 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   504
				break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   505
		} else if (fb2frontd == 1) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   506
			/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   507
			 * front door should never send NSS_ALTRETRY
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   508
			 * in a fallback call. Reset the front door.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   509
			 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   510
			reset_frontd = 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   511
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   512
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   513
		if (reset_frontd == 1) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   514
			lmutex_lock(&frontd->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   515
			frontd->doorfd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   516
			(void) memset((void *)&frontd->doori,
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   517
			    '\0', sizeof (door_info_t));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   518
			lmutex_unlock(&frontd->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   519
			/* error out */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   520
			ret = NSS_ERROR;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   521
			break;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   522
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   523
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   524
		/* process NSS_ALTRETRY request from front door */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   525
		if (fd < 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   526
			continue;	/* no new door given, try again */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   527
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   528
		/* update and try alternate door */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   529
		lmutex_lock(&backd->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   530
		if (backd->doorfd >= 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   531
			/* unexpected open alt door - clean up, continue */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   532
			_nsc_flush_private_db();
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   533
			(void) close(backd->doorfd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   534
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   535
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   536
		/* set up back door fd */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   537
		backd->doorfd = fd;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   538
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   539
		/* set up back door db list */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   540
		ph =  (nss_pheader_t *)*dptr;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   541
		dbl = ((char *)ph) + ph->data_off;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   542
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   543
		if (_nsc_init_private_db(dbl) == 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   544
			/* could not init db list, try again */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   545
			(void) close(backd->doorfd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   546
			backd->doorfd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   547
			lmutex_unlock(&backd->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   548
			continue;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   549
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   550
		if (door_info(backd->doorfd, &backd->doori) < 0 ||
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   551
		    (backd->doori.di_attributes & DOOR_REVOKED) ||
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   552
		    backd->doori.di_data !=
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   553
		    (uintptr_t)NAME_SERVICE_DOOR_COOKIE) {
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   554
			/* doorfd bad, or must not really be open */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   555
			(void) close(backd->doorfd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   556
			backd->doorfd = -1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   557
			(void) memset((void *)&backd->doori,
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   558
			    '\0', sizeof (door_info_t));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   559
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   560
		(void) fcntl(backd->doorfd, F_SETFD, FD_CLOEXEC);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   561
		lmutex_unlock(&backd->door_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   562
		/* NSS_ALTRETRY new back door */
4142
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   563
		if (*dptr != dptr_save)
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   564
			(void) munmap((void *)*dptr, *ndata);
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   565
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   566
		/*
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   567
		 * restore the buffer size and header
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   568
		 * data so that the back door will
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   569
		 * see the original request
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   570
		 */
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   571
		*ndata = ndata_save;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   572
		*adata = adata_save;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   573
		*dptr = dptr_save;
0d7fa83a8b00 6548196 Multiple memory corruption vulnerabilities in nscd(1M)
michen
parents: 2830
diff changeset
   574
		ph =  (nss_pheader_t *)*dptr;
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   575
		*ph = ph_save;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   576
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   577
	return (ret);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   578
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   579
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   580
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   581
 * Get the current (but growable) buffer size for a NSS2 packet.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   582
 * Heuristic algorithm used:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   583
 *	1) Make sure it's at least NSS_BUFLEN_DOOR in length (16k default)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   584
 *	2) if an incoming user buffer is > larger than the current size
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   585
 *	   Make the buffer at least NSS_BUFLEN_DOOR/2+user buffer size
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   586
 *	   This should account for any reasonable nss_pheader, keys
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   587
 *	   extended area etc.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   588
 *	3) keep the prototype/debugging (private)NSS_BUFLEN option
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   589
 *	   to change any preconfigured value if needed(?)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   590
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   591
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   592
static size_t
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   593
_nsc_getdoorbsize(size_t min_size)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   594
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   595
	if (!door_bsize) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   596
		lmutex_lock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   597
		if (!door_bsize) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   598
			/* future work - get nscd hint & use hint size */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   599
			door_bsize = ROUND_UP(door_bsize, NSS_BUFSIZ);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   600
			if (door_bsize < NSS_BUFLEN_DOOR) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   601
				door_bsize = NSS_BUFLEN_DOOR;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   602
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   603
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   604
		lmutex_unlock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   605
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   606
	if (min_size && door_bsize < (min_size + NSS_BUFLEN_DOOR/2)) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   607
		lmutex_lock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   608
		if (door_bsize < (min_size + NSS_BUFLEN_DOOR/2)) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   609
			min_size += NSS_BUFLEN_DOOR;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   610
			door_bsize = ROUND_UP(min_size, NSS_BUFSIZ);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   611
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   612
		lmutex_unlock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   613
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   614
	return (door_bsize);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   615
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   616
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   617
static void
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   618
_nsc_freedbuf(void *arg)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   619
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   620
	nss_XbyY_buf_t *tsdbuf = arg;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   621
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   622
	if (tsdbuf != NULL && tsdbuf->buffer != NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   623
		lfree(tsdbuf->buffer, (size_t)tsdbuf->buflen);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   624
		tsdbuf->result = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   625
		tsdbuf->buffer = NULL;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   626
		tsdbuf->buflen = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   627
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   628
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   629
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   630
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   631
 * _nsc_getdoorbuf - return the client side per thread door buffer
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   632
 * Elsewhere, it is assumed that the header is 0'd upon return from here.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   633
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   634
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   635
int
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   636
_nsc_getdoorbuf(void **doorptr, size_t *bufsize)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   637
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   638
	nss_XbyY_buf_t *tsdbuf;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   639
	char *bp;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   640
	size_t dsize;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   641
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   642
	if (doorptr == NULL || bufsize == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   643
		return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   644
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   645
	/* Get thread specific pointer to door buffer */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   646
	tsdbuf = tsdalloc(_T_DOORBUF, sizeof (nss_XbyY_buf_t), _nsc_freedbuf);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   647
	if (tsdbuf == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   648
		return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   649
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   650
	/* if door buffer does not exist create it */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   651
	if (tsdbuf->buffer == NULL) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   652
		dsize = _nsc_getdoorbsize(*bufsize);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   653
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   654
		/* setup a door buffer with a total length of dsize */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   655
		bp = lmalloc(dsize);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   656
		if (bp == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   657
			return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   658
		tsdbuf->buffer = bp;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   659
		tsdbuf->buflen = dsize;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   660
	} else {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   661
		/* check old buffer size and resize if needed */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   662
		if (*bufsize) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   663
			dsize = _nsc_getdoorbsize(*bufsize);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   664
			if (tsdbuf->buflen < dsize) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   665
				lfree(tsdbuf->buffer, (size_t)tsdbuf->buflen);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   666
				bp = lmalloc(dsize);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   667
				if (bp == NULL)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   668
					return (-1);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   669
				tsdbuf->buffer = bp;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   670
				tsdbuf->buflen = dsize;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   671
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   672
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   673
		/* freshly malloc'd door bufs are 0'd */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   674
		/* 0 header for now.  Zero entire buf(?) TDB */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   675
		(void) memset((void *)tsdbuf->buffer, 0,
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   676
		    (size_t)sizeof (nss_pheader_t));
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   677
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   678
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   679
	*doorptr = (void *)tsdbuf->buffer;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   680
	*bufsize = tsdbuf->buflen;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   681
	return (0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   682
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   683
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   684
void
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   685
_nsc_resizedoorbuf(size_t bsize)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   686
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   687
	/* signal to update if new door size is desired */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   688
	lmutex_lock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   689
	if (bsize > door_bsize && door_nbsize < bsize)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   690
		door_nbsize = bsize;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   691
	lmutex_unlock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   692
}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   693
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   694
/*
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   695
 * Check uid and /proc/PID/psinfo to see if this process is nscd
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   696
 * If it is set the appropriate flags and allow policy reconfiguration.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   697
 */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   698
int
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   699
_nsc_proc_is_cache()
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   700
{
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   701
	psinfo_t	pinfo;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   702
	char		fname[128];
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   703
	int		ret;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   704
	int		fd;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   705
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   706
	if (proc_is_cache >= 0)
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   707
		return (proc_is_cache);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   708
	lmutex_lock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   709
	if (proc_is_cache >= 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   710
		lmutex_unlock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   711
		return (proc_is_cache);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   712
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   713
	proc_is_cache = 0;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   714
	/* It can't be nscd if it's not running as root... */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   715
	if (getuid() != 0) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   716
		lmutex_unlock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   717
		return (0);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   718
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   719
	ret = snprintf(fname, 128, "/proc/%d/psinfo", getpid());
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   720
	if (ret > 0 && ret < 128) {
6351
8f8c84853810 6662310 libc can foul up perl's I/O redirection
andra
parents: 4142
diff changeset
   721
		if ((fd = open(fname,  O_RDONLY)) >= 0) {
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   722
			ret = read(fd, &pinfo, sizeof (psinfo_t));
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   723
			(void) close(fd);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   724
			if (ret == sizeof (psinfo_t) &&
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   725
			    (strcmp(pinfo.pr_fname, "nscd") == 0)) {
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   726
				/* process runs as root and is named nscd */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   727
				/* that's good enough for now */
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   728
				proc_is_cache = 1;
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   729
			}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   730
		}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   731
	}
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   732
	lmutex_unlock(&hints_lock);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   733
	return (proc_is_cache);
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 1016
diff changeset
   734
}