* Versions.def: Add GLIBC_2.1.1 to libpthread.
* iconvdata/Makefile (modules): Add KOI8-U.
(distribute): Add koi8-u.c.
(gen-8bit-gap-modules): Add koi8-u.
* iconvdata/gconv-modules: Add KOI8-U entries.
* iconvdata/koi8-u.c: New file.
1999-04-13 Thorsten Kukuk <kukuk@suse.de>
* sunrpc/auth_des.c: 64bit fixes, security fixes.
* sunrpc/auth_none.c: Pretty print.
* sunrpc/auth_unix.c: Likewise.
* sunrpc/authdes_prot.c: Likewise.
* sunrpc/authuxprot.c: Likewise.
* sunrpc/bindrsvprt.c: Likewise.
* sunrpc/clnt_gen.c: Likewise.
* sunrpc/rpc/xdr.h: Likewise.
* sunrpc/rpc/auth_des.h: Add rpc_timeval struct.
* sunrpc/rpc_cmsg.c: Don't use *long pointers.
* sunrpc/rtime.c: Use new rpc_timeval.
* sunrpc/svc_authux.c: Don't use *long pointers.
* sunrpc/svcauth_des.c: Likewise + security fixes.
* sunrpc/xdr_mem.c: Don't use *long pointers.
* sunrpc/xdr_rec.c: Likewise.
* sunrpc/xdr_sizeof.c: Likewise.
* sunrpc/xdr_stdio.c: Likewise.
1999-04-15 Ulrich Drepper <drepper@cygnus.com>
1999-04-15 Ulrich Drepper <drepper@cygnus.com>
+ * Versions.def: Add GLIBC_2.1.1 to libpthread.
+
+ * iconvdata/Makefile (modules): Add KOI8-U.
+ (distribute): Add koi8-u.c.
+ (gen-8bit-gap-modules): Add koi8-u.
+ * iconvdata/gconv-modules: Add KOI8-U entries.
+ * iconvdata/koi8-u.c: New file.
+
+1999-04-13 Thorsten Kukuk <kukuk@suse.de>
+
+ * sunrpc/auth_des.c: 64bit fixes, security fixes.
+ * sunrpc/auth_none.c: Pretty print.
+ * sunrpc/auth_unix.c: Likewise.
+ * sunrpc/authdes_prot.c: Likewise.
+ * sunrpc/authuxprot.c: Likewise.
+ * sunrpc/bindrsvprt.c: Likewise.
+ * sunrpc/clnt_gen.c: Likewise.
+ * sunrpc/rpc/xdr.h: Likewise.
+ * sunrpc/rpc/auth_des.h: Add rpc_timeval struct.
+ * sunrpc/rpc_cmsg.c: Don't use *long pointers.
+ * sunrpc/rtime.c: Use new rpc_timeval.
+ * sunrpc/svc_authux.c: Don't use *long pointers.
+ * sunrpc/svcauth_des.c: Likewise + security fixes.
+ * sunrpc/xdr_mem.c: Don't use *long pointers.
+ * sunrpc/xdr_rec.c: Likewise.
+ * sunrpc/xdr_sizeof.c: Likewise.
+ * sunrpc/xdr_stdio.c: Likewise.
+
+1999-04-15 Ulrich Drepper <drepper@cygnus.com>
+
* sunrpc/clnt_udp.c (clntudp_call): Move initialization of anyup
so that it is redone for each sending.
libpthread {
GLIBC_2.0
GLIBC_2.1 GLIBC_2.0
+ GLIBC_2.1.1 GLIBC_2.1
}
libresolv {
GLIBC_2.0
GOST_19768-74 GREEK-CCITT GREEK7 GREEK7-OLD INIS INIS-8 \
INIS-CYRILLIC ISO_6937-2 ISO_2033 ISO_5427 ISO_5427-EXT \
ISO_5428 ISO_10367-BOX MAC-IS MAC-UK NATS-DANO NATS-SEFI \
- SAMI-WS2 ISO-IR-197 TIS-620
+ SAMI-WS2 ISO-IR-197 TIS-620 KOI8-U
modules.so := $(addsuffix .so, $(modules))
jis0208.c jis0208.h jis0212.c jis0212.h johab.c koi-8.c \
koi8-r.c ksc5601.c ksc5601.h latin-greek.c latin-greek-1.c \
macintosh.c mac-is.c mac-uk.c nats-dano.c nats-sefi.c sjis.c \
- t.61.c uhc.c sami-ws2.c iso-ir-197.c tis-620.c
+ t.61.c uhc.c sami-ws2.c iso-ir-197.c tis-620.c koi8-u.c
# We build the transformation modules only when we build shared libs.
ifeq (yes,$(build-shared))
inis-cyrillic iso_2033 iso_5427 iso_5427-ext \
iso_5428 iso_10367-box mac-is nats-dano nats-sefi \
iso8859-13 iso8859-14 iso8859-15 mac-uk sami-ws2 \
- iso-ir-197 cp1258 tis-620
+ iso-ir-197 cp1258 tis-620 koi8-u
gen-special-modules := iso8859-7jp
alias ISO-IR-166// TIS-620//
module TIS-620// INTERNAL TIS-620 1
module INTERNAL TIS-620// TIS-620 1
+
+# from to module cost
+module KOI8-U// INTERNAL KOI8-U 1
+module INTERNAL KOI8-U// KOI8-U 1
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Conversion from and to KOI8-U.
+ Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#ifndef _SEMAPHORE_H
-# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
-#endif
+#include <stdint.h>
+/* Specify the conversion table. */
+#define TABLES <koi8-u.h>
-typedef struct {
- long int sem_status;
-} sem_t;
+#define CHARSET_NAME "KOI8-U//"
+#define HAS_HOLES 0 /* All 256 character are defined. */
+
+#include <8bit-gap.c>
linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \
Banner)
-headers := pthread.h semaphore.h bits/semaphore.h
+headers := pthread.h semaphore.h
distribute := internals.h queue.h restart.h spinlock.h
routines := weaks no-tsd
__libc_current_sigrtmin; __libc_current_sigrtmax;
__libc_allocate_rtsig;
}
+ GLIBC_2.1.1 {
+ sem_close; sem_open; sem_unlink;
+ }
}
errno = ENOSYS;
return -1;
}
- __pthread_init_lock((struct _pthread_fastlock *) &sem->sem_lock);
- sem->sem_value = value;
- sem->sem_waiting = NULL;
+ __pthread_init_lock((struct _pthread_fastlock *) &sem->__sem_lock);
+ sem->__sem_value = value;
+ sem->__sem_waiting = NULL;
return 0;
}
{
volatile pthread_descr self = thread_self();
- __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self);
- if (sem->sem_value > 0) {
- sem->sem_value--;
- __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
+ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
+ if (sem->__sem_value > 0) {
+ sem->__sem_value--;
+ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
return 0;
}
- enqueue(&sem->sem_waiting, self);
+ enqueue(&sem->__sem_waiting, self);
/* Wait for sem_post or cancellation */
- __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
+ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
suspend_with_cancellation(self);
/* This is a cancellation point */
if (THREAD_GETMEM(self, p_canceled)
&& THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
/* Remove ourselves from the waiting list if we're still on it */
- __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self);
- remove_from_queue(&sem->sem_waiting, self);
- __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
+ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
+ remove_from_queue(&sem->__sem_waiting, self);
+ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
pthread_exit(PTHREAD_CANCELED);
}
/* We got the semaphore */
{
int retval;
- __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, NULL);
- if (sem->sem_value == 0) {
+ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, NULL);
+ if (sem->__sem_value == 0) {
errno = EAGAIN;
retval = -1;
} else {
- sem->sem_value--;
+ sem->__sem_value--;
retval = 0;
}
- __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
+ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
return retval;
}
struct pthread_request request;
if (THREAD_GETMEM(self, p_in_sighandler) == NULL) {
- __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self);
- if (sem->sem_waiting == NULL) {
- if (sem->sem_value >= SEM_VALUE_MAX) {
+ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
+ if (sem->__sem_waiting == NULL) {
+ if (sem->__sem_value >= SEM_VALUE_MAX) {
/* Overflow */
errno = ERANGE;
- __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
+ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
return -1;
}
- sem->sem_value++;
- __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
+ sem->__sem_value++;
+ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
} else {
- th = dequeue(&sem->sem_waiting);
- __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
+ th = dequeue(&sem->__sem_waiting);
+ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
restart(th);
}
} else {
int sem_getvalue(sem_t * sem, int * sval)
{
- *sval = sem->sem_value;
+ *sval = sem->__sem_value;
return 0;
}
int sem_destroy(sem_t * sem)
{
- if (sem->sem_waiting != NULL) {
- errno = EBUSY;
+ if (sem->__sem_waiting != NULL) {
+ __set_errno (EBUSY);
return -1;
}
return 0;
}
+
+sem_t *sem_open(const char *name, int oflag, ...)
+{
+ __set_errno (ENOSYS);
+ return SEM_FAILED;
+}
+
+int sem_close(sem_t *sem)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+
+int sem_unlink(const char *name)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
#include <features.h>
#include <sys/types.h>
-#include <limits.h>
+#ifndef _PTHREAD_DESCR_DEFINED
+/* Thread descriptors. Needed for `sem_t' definition. */
+typedef struct _pthread_descr_struct *_pthread_descr;
+# define _PTHREAD_DESCR_DEFINED
+#endif
-#define SEM_VALUE_MAX INT_MAX
-
-typedef struct {
- struct { long status; int spinlock; } sem_lock;
- int sem_value;
- _pthread_descr sem_waiting;
+/* System specific semaphore definition. */
+typedef struct
+{
+ struct
+ {
+ long int status;
+ int spinlock;
+ } __sem_lock;
+ int __sem_value;
+ _pthread_descr __sem_waiting;
} sem_t;
+
+
+/* Value returned if `sem_open' failed. */
+#define SEM_FAILED ((sem_t *) NULL)
+
+/* Maximum value the semaphore can have. */
+#define SEM_VALUE_MAX ((int) ((~0u) >> 1))
+
+
__BEGIN_DECLS
-extern int sem_init __P((sem_t *__sem, int __pshared, unsigned int __value));
-extern int sem_destroy __P((sem_t *__sem));
-extern int sem_wait __P((sem_t *__sem));
-extern int sem_trywait __P((sem_t *__sem));
-extern int sem_post __P((sem_t *__sem));
-extern int sem_getvalue __P((sem_t *__sem, int *__sval));
+/* Initialize semaphore object SEM to VALUE. If PSHARED then share it
+ with other processes. */
+extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
+
+/* Free resources associated with semaphore object SEM. */
+extern int sem_destroy __P ((sem_t *__sem));
+
+/* Open a named semaphore NAME with open flaot OFLAG. */
+extern sem_t *sem_open __P ((__const char *__name, int __oflag, ...));
+
+/* Close descriptor for named semaphore SEM. */
+extern int sem_close __P ((sem_t *__sem));
+
+/* Remove named semaphore NAME. */
+extern int sem_unlink __P ((__const char *__name));
+
+/* Wait for SEM being posted. */
+extern int sem_wait __P ((sem_t *__sem));
+
+/* Test whether SEM is posted. */
+extern int sem_trywait __P ((sem_t *__sem));
+
+/* Post SEM. */
+extern int sem_post __P ((sem_t *__sem));
+
+/* Get current value of SEM and store it in *SVAL. */
+extern int sem_getvalue __P ((sem_t *__sem, int *__sval));
__END_DECLS
+++ /dev/null
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _SEMAPHORE_H
-# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
-#endif
-
-
-/* Due to the implementation of the load-locked/store-conditional
- instructions, we cannot pack semaphores closer than a cache line
- or risk threads deadlocking on unrelated semaphores. */
-
-typedef struct {
- long int sem_status;
- long int sem_reserved[3];
-} sem_t;
+++ /dev/null
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _SEMAPHORE_H
-# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
-#endif
-
-
-/* Due to the implementation of the load-locked/store-conditional
- instructions, we cannot pack semaphores closer than a cache line
- or risk threads deadlocking on unrelated semaphores. */
-
-typedef struct
- {
- int sem_status;
- int sem_reserved[7];
- } sem_t;
int __spinlock; /* For compare-and-swap emulation */
};
+#ifndef _PTHREAD_DESCR_DEFINED
/* Thread descriptors */
typedef struct _pthread_descr_struct *_pthread_descr;
+# define _PTHREAD_DESCR_DEFINED
+#endif
/* Attributes for threads. */
+++ /dev/null
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _SEMAPHORE_H
-# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
-#endif
-
-
-typedef struct {
- long int sem_status;
- int sem_spinlock;
-} sem_t;
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)auth_des.c 2.2 88/07/29 4.0 RPCSRC; from 1.9 88/02/08 SMI";
-#endif
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
#define debug(msg) /* printf("%s\n", msg) */
-extern int rtime (struct sockaddr_in *, struct timeval *, struct timeval *);
extern bool_t xdr_authdes_cred (XDR *, struct authdes_cred *);
extern bool_t xdr_authdes_verf (XDR *, struct authdes_verf *);
static bool_t authdes_validate (AUTH *, struct opaque_auth *);
static bool_t authdes_refresh (AUTH *);
static void authdes_destroy (AUTH *);
-static bool_t synchronize (struct sockaddr *, struct timeval *)
+static bool_t synchronize (struct sockaddr *, struct rpc_timeval *)
internal_function;
static struct auth_ops authdes_ops = {
uint32_t ad_window; /* client specified window */
bool_t ad_dosync; /* synchronize? */
struct sockaddr ad_syncaddr; /* remote host to synch with */
- struct timeval ad_timediff; /* server's time - client's time */
- u_long ad_nickname; /* server's nickname for client */
+ struct rpc_timeval ad_timediff; /* server's time - client's time */
+ uint32_t ad_nickname; /* server's nickname for client */
struct authdes_cred ad_cred; /* storage for credential */
struct authdes_verf ad_verf; /* storage for verifier */
- struct timeval ad_timestamp; /* timestamp sent */
+ struct rpc_timeval ad_timestamp; /* timestamp sent */
des_block ad_xkey; /* encrypted conversation key */
u_char ad_pkey[1024]; /* Servers actual public key */
};
netobj pkey;
if (!getpublickey (servername, pkey_data))
- return (NULL);
+ return NULL;
pkey.n_bytes = (char *) pkey_data;
pkey.n_len = strlen ((char *) pkey_data) + 1;
*/
auth = ALLOC (AUTH);
ad = ALLOC (struct ad_private);
+
+ if (auth == NULL || ad == NULL)
+ {
+ debug ("authdes_create: out of memory");
+ goto failed;
+ }
+
memset (ad, 0, sizeof (struct ad_private));
memcpy (ad->ad_pkey, pkey->n_bytes, pkey->n_len);
if (!getnetname (namebuf))
ad->ad_servernamelen = strlen (servername);
ad->ad_servername = mem_alloc (ad->ad_servernamelen + 1);
- if (auth == NULL || ad == NULL || ad->ad_fullname == NULL ||
- ad->ad_servername == NULL)
+ if (ad->ad_fullname == NULL || ad->ad_servername == NULL)
{
debug ("authdes_create: out of memory");
goto failed;
/*
* Set up private data
*/
- bcopy (namebuf, ad->ad_fullname, ad->ad_fullnamelen + 1);
- bcopy (servername, ad->ad_servername, ad->ad_servernamelen + 1);
+ memcpy (ad->ad_fullname, namebuf, ad->ad_fullnamelen + 1);
+ memcpy (ad->ad_servername, servername, ad->ad_servernamelen + 1);
ad->ad_timediff.tv_sec = ad->ad_timediff.tv_usec = 0;
if (syncaddr != NULL)
{
if (key_gendes (&auth->ah_key) < 0)
{
debug ("authdes_create: unable to gen conversation key");
- return (NULL);
+ return NULL;
}
}
else
if (!authdes_refresh (auth))
goto failed;
- return (auth);
+ return auth;
failed:
if (auth != NULL)
FREE (ad->ad_servername, ad->ad_servernamelen + 1);
FREE (ad, sizeof (struct ad_private));
}
- return (NULL);
+ return NULL;
}
/*
*/
/*ARGSUSED */
static void
-authdes_nextverf (AUTH * auth)
+authdes_nextverf (AUTH *auth)
{
/* what the heck am I supposed to do??? */
}
* 2. Marshal
*/
static bool_t
-authdes_marshal (AUTH * auth, XDR * xdrs)
+authdes_marshal (AUTH *auth, XDR *xdrs)
{
struct ad_private *ad = AUTH_PRIVATE (auth);
struct authdes_cred *cred = &ad->ad_cred;
des_block ivec;
int status;
unsigned int len;
- register long *ixdr;
+ register int32_t *ixdr;
+ struct timeval tval;
/*
* Figure out the "time", accounting for any time difference
* with the server if necessary.
*/
- __gettimeofday (&ad->ad_timestamp, (struct timezone *) NULL);
- ad->ad_timestamp.tv_sec += ad->ad_timediff.tv_sec;
- ad->ad_timestamp.tv_usec += ad->ad_timediff.tv_usec;
+ __gettimeofday (&tval, (struct timezone *) NULL);
+ ad->ad_timestamp.tv_sec = tval.tv_sec + ad->ad_timediff.tv_sec;
+ ad->ad_timestamp.tv_usec = tval.tv_usec + ad->ad_timediff.tv_usec;
if (ad->ad_timestamp.tv_usec >= MILLION)
{
ad->ad_timestamp.tv_usec -= MILLION;
* encrypt them.
* XXX We have a real Year 2038 problem here.
*/
- ixdr = (long *) cryptbuf;
- IXDR_PUT_LONG (ixdr, ad->ad_timestamp.tv_sec);
- IXDR_PUT_LONG (ixdr, ad->ad_timestamp.tv_usec);
+ ixdr = (int32_t *) cryptbuf;
+ IXDR_PUT_INT32 (ixdr, ad->ad_timestamp.tv_sec);
+ IXDR_PUT_INT32 (ixdr, ad->ad_timestamp.tv_usec);
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
{
IXDR_PUT_U_INT32 (ixdr, ad->ad_window);
2 * sizeof (des_block), DES_ENCRYPT | DES_HW, (char *) &ivec);
}
else
- {
- status = ecb_crypt ((char *) &auth->ah_key, (char *) cryptbuf,
- sizeof (des_block), DES_ENCRYPT | DES_HW);
- }
+ status = ecb_crypt ((char *) &auth->ah_key, (char *) cryptbuf,
+ sizeof (des_block), DES_ENCRYPT | DES_HW);
+
if (DES_FAILED (status))
{
debug ("authdes_marshal: DES encryption failure");
- return (FALSE);
+ return FALSE;
}
ad->ad_verf.adv_xtimestamp = cryptbuf[0];
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
* authentication data.
*/
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
- {
- len = ((1 + 1 + 2 + 1) * BYTES_PER_XDR_UNIT + ad->ad_fullnamelen);
- }
+ len = ((1 + 1 + 2 + 1) * BYTES_PER_XDR_UNIT + ad->ad_fullnamelen);
else
- {
- len = (1 + 1) * BYTES_PER_XDR_UNIT;
- }
+ len = (1 + 1) * BYTES_PER_XDR_UNIT;
if ((ixdr = xdr_inline (xdrs, 2 * BYTES_PER_XDR_UNIT)) != NULL)
{
ATTEMPT (xdr_putint32 (xdrs, &len));
}
ATTEMPT (xdr_authdes_verf (xdrs, verf));
+
return TRUE;
}
struct ad_private *ad = AUTH_PRIVATE (auth);
struct authdes_verf verf;
int status;
- register u_long *ixdr;
+ register uint32_t *ixdr;
if (rverf->oa_length != (2 + 1) * BYTES_PER_XDR_UNIT)
- return (FALSE);
+ return FALSE;
- ixdr = (u_long *) rverf->oa_base;
- verf.adv_xtimestamp.key.high = (u_long) * ixdr++;
- verf.adv_xtimestamp.key.low = (u_long) * ixdr++;
- verf.adv_int_u = (u_long) * ixdr++; /* nickname not XDR'd ! */
+ ixdr = (uint32_t *) rverf->oa_base;
+ verf.adv_xtimestamp.key.high = *ixdr++;
+ verf.adv_xtimestamp.key.low = *ixdr++;
+ verf.adv_int_u = *ixdr++; /* nickname not XDR'd ! */
/*
* Decrypt the timestamp
/*
* xdr the decrypted timestamp
*/
- ixdr = (u_long *) verf.adv_xtimestamp.c;
- verf.adv_timestamp.tv_sec = IXDR_GET_LONG (ixdr) + 1;
- verf.adv_timestamp.tv_usec = IXDR_GET_LONG (ixdr);
+ ixdr = (uint32_t *) verf.adv_xtimestamp.c;
+ verf.adv_timestamp.tv_sec = IXDR_GET_U_INT32 (ixdr) + 1;
+ verf.adv_timestamp.tv_usec = IXDR_GET_U_INT32 (ixdr);
/*
* validate
*/
if (memcmp ((char *) &ad->ad_timestamp, (char *) &verf.adv_timestamp,
- sizeof (struct timeval)) != 0)
+ sizeof (struct rpc_timeval)) != 0)
{
debug ("authdes_validate: verifier mismatch\n");
return FALSE;
struct ad_private *ad = AUTH_PRIVATE (auth);
struct authdes_cred *cred = &ad->ad_cred;
- if (ad->ad_dosync &&
- !synchronize (&ad->ad_syncaddr, &ad->ad_timediff))
+ if (ad->ad_dosync && !synchronize (&ad->ad_syncaddr, &ad->ad_timediff))
{
/*
* Hope the clocks are synced!
*/
static bool_t
internal_function
-synchronize (struct sockaddr *syncaddr, struct timeval *timep)
+synchronize (struct sockaddr *syncaddr, struct rpc_timeval *timep)
{
struct timeval mytime;
- struct timeval timeout;
+ struct rpc_timeval timeout;
timeout.tv_sec = RTIME_TIMEOUT;
timeout.tv_usec = 0;
-/* @(#)auth_none.c 2.1 88/07/29 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)auth_none.c 1.19 87/08/11 Copyr 1984 Sun Micro";
-#endif
-
+/*
+ * Copyright (C) 1984, Sun Microsystems, Inc.
+ */
/*
* auth_none.c
* Creates a client authentication handle for passing "null"
* credentials and verifiers to remote systems.
- *
- * Copyright (C) 1984, Sun Microsystems, Inc.
*/
#include <rpc/types.h>
static bool_t authnone_validate (AUTH *, struct opaque_auth *);
static bool_t authnone_refresh (AUTH *);
-static struct auth_ops ops =
-{
+static struct auth_ops ops = {
authnone_verf,
authnone_marshal,
authnone_validate,
};
static struct authnone_private
- {
- AUTH no_client;
- char marshalled_client[MAX_MARSHEL_SIZE];
- u_int mcnt;
- }
- *authnone_private;
+{
+ AUTH no_client;
+ char marshalled_client[MAX_MARSHEL_SIZE];
+ u_int mcnt;
+} *authnone_private;
AUTH *
authnone_create (void)
struct authnone_private *ap = authnone_private;
if (ap == 0)
- return (0);
- return ((*xdrs->x_ops->x_putbytes) (xdrs,
- ap->marshalled_client, ap->mcnt));
+ return 0;
+ return (*xdrs->x_ops->x_putbytes) (xdrs, ap->marshalled_client, ap->mcnt);
}
static void
-/* @(#)auth_unix.c 2.2 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)auth_unix.c 1.19 87/08/11 Copyr 1984 Sun Micro";
-#endif
-
/*
- * auth_unix.c, Implements UNIX style authentication parameters.
- *
* Copyright (C) 1984, Sun Microsystems, Inc.
+ */
+/*
+ * auth_unix.c, Implements UNIX style authentication parameters.
*
* The system is very weak. The client uses no encryption for it's
* credentials and only sends null verifiers. The server sends backs
* null verifiers or optionally a verifier that suggests a new short hand
* for the credentials.
- *
*/
#include <limits.h>
static bool_t authunix_refresh (AUTH *);
static void authunix_destroy (AUTH *);
-static struct auth_ops auth_unix_ops =
-{
+static struct auth_ops auth_unix_ops = {
authunix_nextverf,
authunix_marshal,
authunix_validate,
/*
* This struct is pointed to by the ah_private field of an auth_handle.
*/
-struct audata
- {
- struct opaque_auth au_origcred; /* original credentials */
- struct opaque_auth au_shcred; /* short hand cred */
- u_long au_shfaults; /* short hand cache faults */
- char au_marshed[MAX_AUTH_BYTES];
- u_int au_mpos; /* xdr pos at end of marshed */
- };
+struct audata {
+ struct opaque_auth au_origcred; /* original credentials */
+ struct opaque_auth au_shcred; /* short hand cred */
+ u_long au_shfaults; /* short hand cache faults */
+ char au_marshed[MAX_AUTH_BYTES];
+ u_int au_mpos; /* xdr pos at end of marshed */
+};
#define AUTH_PRIVATE(auth) ((struct audata *)auth->ah_private)
static bool_t marshal_new_auth (AUTH *) internal_function;
* Returns an auth handle with the given stuff in it.
*/
AUTH *
-authunix_create (machname, uid, gid, len, aup_gids)
- char *machname;
- uid_t uid;
- gid_t gid;
- int len;
- gid_t *aup_gids;
+authunix_create (char *machname, uid_t uid, gid_t gid, int len,
+ gid_t *aup_gids)
{
struct authunix_parms aup;
char mymem[MAX_AUTH_BYTES];
abort ();
au->au_origcred.oa_length = len = XDR_GETPOS (&xdrs);
au->au_origcred.oa_flavor = AUTH_UNIX;
- if ((au->au_origcred.oa_base = mem_alloc ((u_int) len)) == NULL)
+ au->au_origcred.oa_base = mem_alloc ((u_int) len);
+ if (au->au_origcred.oa_base == NULL)
{
- (void) fprintf (stderr, _("authunix_create: out of memory\n"));
+ (void) fputs (_("authunix_create: out of memory\n"), stderr);
return NULL;
}
- bcopy (mymem, au->au_origcred.oa_base, (u_int) len);
+ memcpy(au->au_origcred.oa_base, mymem, (u_int) len);
/*
* set auth handle to reflect new cred.
xdrmem_create (xdrs, au->au_marshed, MAX_AUTH_BYTES, XDR_ENCODE);
if ((!xdr_opaque_auth (xdrs, &(auth->ah_cred))) ||
(!xdr_opaque_auth (xdrs, &(auth->ah_verf))))
- {
- perror (_("auth_none.c - Fatal marshalling problem"));
- }
+ perror (_("auth_none.c - Fatal marshalling problem"));
else
- {
- au->au_mpos = XDR_GETPOS (xdrs);
- }
+ au->au_mpos = XDR_GETPOS (xdrs);
+
XDR_DESTROY (xdrs);
return TRUE;
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)authdes_prot.c 2.1 88/07/29 4.0 RPCSRC; from 1.6 88/02/08 SMI";
-#endif
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
/*
* Copyright (c) 1988 by Sun Microsystems, Inc.
*/
-
/*
* authdes_prot.c, XDR routines for DES authentication
*/
#define ATTEMPT(xdr_op) if (!(xdr_op)) return (FALSE)
bool_t
-xdr_authdes_cred (XDR * xdrs, struct authdes_cred *cred)
+xdr_authdes_cred (XDR *xdrs, struct authdes_cred *cred)
{
/*
* Unrolled xdr
bool_t
-xdr_authdes_verf (register XDR * xdrs, register struct authdes_verf * verf)
+xdr_authdes_verf (register XDR *xdrs, register struct authdes_verf *verf)
{
/*
* Unrolled xdr
-/* @(#)authunix_prot.c 2.1 88/07/29 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)authunix_prot.c 1.15 87/08/11 Copyr 1984 Sun Micro";
-#endif
-
+/*
+ * Copyright (C) 1984, Sun Microsystems, Inc.
+ */
/*
* authunix_prot.c
* XDR for UNIX style authentication parameters for RPC
- *
- * Copyright (C) 1984, Sun Microsystems, Inc.
*/
-
#include <rpc/types.h>
#include <rpc/xdr.h>
#include <rpc/auth.h>
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)bindresvport.c 2.2 88/07/29 4.0 RPCSRC 1.8 88/02/08 SMI";
-#endif
/*
* Copyright (c) 1987 by Sun Microsystems, Inc.
*/
+#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
-#include <sys/errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
int res;
static short port;
struct sockaddr_in myaddr;
-#ifndef errno
- extern int errno;
-#endif
int i;
#define STARTPORT 600
__set_errno (EPFNOSUPPORT);
return -1;
}
+
if (port == 0)
{
port = (__getpid () % NPORTS) + STARTPORT;
}
res = -1;
__set_errno (EADDRINUSE);
- for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; i++)
+
+ for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; ++i)
{
sin->sin_port = htons (port++);
if (port > ENDPORT)
}
res = bind (sd, sin, sizeof (struct sockaddr_in));
}
+
return res;
}
-/* @(#)clnt_generic.c 2.2 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI";
-#endif
/*
* Copyright (C) 1987, Sun Microsystems, Inc.
*/
+
#include <alloca.h>
#include <errno.h>
#include <string.h>
-/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
uint32_t adc_nickname;
};
+/* A timeval replacement for !32bit platforms */
+struct rpc_timeval
+ {
+ uint32_t tv_sec; /* Seconds. */
+ uint32_t tv_usec; /* Microseconds. */
+ };
+
/* A des authentication verifier */
struct authdes_verf
{
union
{
- struct timeval adv_ctime; /* clear time */
+ struct rpc_timeval adv_ctime; /* clear time */
des_block adv_xtime; /* crypt time */
}
adv_time_u;
extern int getsecretkey __P ((__const char *__name, char *__key,
__const char *__passwd));
-extern int rtime __P ((struct sockaddr_in *__addrp, struct timeval *__timep,
- struct timeval *__timeout));
+extern int rtime __P ((struct sockaddr_in *__addrp,
+ struct rpc_timeval *__timep,
+ struct rpc_timeval *__timeout));
__END_DECLS
-/* @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-/* @(#)xdr.h 1.19 87/04/22 SMI */
/*
* xdr.h, External Data Representation Serialization Routines.
/* returns bytes off from beginning */
bool_t (*x_setpostn) __PMT ((XDR *__xdrs, u_int pos));
/* lets you reposition the stream */
- long *(*x_inline) __PMT ((XDR *__xdrs, int len));
+ int32_t *(*x_inline) __PMT ((XDR *__xdrs, int len));
/* buf quick ptr to buffered data */
void (*x_destroy) __PMT ((XDR *__xdrs));
/* free privates of this xdr_stream */
* Operations defined on a XDR handle
*
* XDR *xdrs;
+ * int32_t *int32p;
* long *longp;
* caddr_t addr;
* u_int len;
bool_t
xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
{
- long *buf;
+ int32_t *buf;
struct opaque_auth *oa;
if (xdrs->x_op == XDR_ENCODE)
IXDR_PUT_LONG (buf, cmsg->rm_xid);
IXDR_PUT_ENUM (buf, cmsg->rm_direction);
if (cmsg->rm_direction != CALL)
- {
- return FALSE;
- }
+ return FALSE;
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_rpcvers);
if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION)
- {
- return FALSE;
- }
+ return FALSE;
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_prog);
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_vers);
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_proc);
oa = &cmsg->rm_call.cb_cred;
IXDR_PUT_ENUM (buf, oa->oa_flavor);
- IXDR_PUT_LONG (buf, oa->oa_length);
+ IXDR_PUT_INT32 (buf, oa->oa_length);
if (oa->oa_length)
{
bcopy (oa->oa_base, (caddr_t) buf, oa->oa_length);
- buf = (long *) ((char *) buf + RNDUP (oa->oa_length));
+ buf = (int32_t *) ((char *) buf + RNDUP (oa->oa_length));
}
oa = &cmsg->rm_call.cb_verf;
IXDR_PUT_ENUM (buf, oa->oa_flavor);
- IXDR_PUT_LONG (buf, oa->oa_length);
+ IXDR_PUT_INT32 (buf, oa->oa_length);
if (oa->oa_length)
{
bcopy (oa->oa_base, (caddr_t) buf, oa->oa_length);
cmsg->rm_call.cb_proc = IXDR_GET_LONG (buf);
oa = &cmsg->rm_call.cb_cred;
oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
- oa->oa_length = IXDR_GET_LONG (buf);
+ oa->oa_length = IXDR_GET_INT32 (buf);
if (oa->oa_length)
{
if (oa->oa_length > MAX_AUTH_BYTES)
- {
- return FALSE;
- }
+ return FALSE;
if (oa->oa_base == NULL)
{
oa->oa_base = (caddr_t)
{
if (xdr_opaque (xdrs, oa->oa_base,
oa->oa_length) == FALSE)
- {
- return FALSE;
- }
+ return FALSE;
}
else
{
else
{
oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
- oa->oa_length = IXDR_GET_LONG (buf);
+ oa->oa_length = IXDR_GET_INT32 (buf);
}
if (oa->oa_length)
{
if (oa->oa_length > MAX_AUTH_BYTES)
- {
- return FALSE;
- }
+ return FALSE;
if (oa->oa_base == NULL)
{
oa->oa_base = (caddr_t)
{
if (xdr_opaque (xdrs, oa->oa_base,
oa->oa_length) == FALSE)
- {
- return FALSE;
- }
+ return FALSE;
}
else
{
}
int
-rtime (struct sockaddr_in *addrp, struct timeval *timep,
- struct timeval *timeout)
+rtime (struct sockaddr_in *addrp, struct rpc_timeval *timep,
+ struct rpc_timeval *timeout)
{
int s;
struct pollfd fd;
-/* @(#)svc_auth_unix.c 2.3 88/08/01 4.0 RPCSRC; from 1.28 88/02/08 SMI */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)svc_auth_unix.c 1.28 88/02/08 Copyr 1984 Sun Micro";
-#endif
/*
* svc_auth_unix.c
enum auth_stat stat;
XDR xdrs;
struct authunix_parms *aup;
- long *buf;
+ int32_t *buf;
struct area
{
struct authunix_parms area_aup;
if (buf != NULL)
{
aup->aup_time = IXDR_GET_LONG (buf);
- str_len = IXDR_GET_U_LONG (buf);
+ str_len = IXDR_GET_U_INT32 (buf);
if (str_len > MAX_MACHINE_NAME)
{
stat = AUTH_BADCRED;
bcopy ((caddr_t) buf, aup->aup_machname, (u_int) str_len);
aup->aup_machname[str_len] = 0;
str_len = RNDUP (str_len);
- buf = (u_long *) ((char *) buf + str_len);
+ buf = (int32_t *) ((char *) buf + str_len);
aup->aup_uid = IXDR_GET_LONG (buf);
aup->aup_gid = IXDR_GET_LONG (buf);
- gid_len = IXDR_GET_U_LONG (buf);
+ gid_len = IXDR_GET_U_INT32 (buf);
if (gid_len > NGRPS)
{
stat = AUTH_BADCRED;
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)svcauth_des.c 2.3 89/07/11 4.0 RPCSRC; from 1.15 88/02/08 SMI";
-#endif
-
-/*
- * Copyright (c) 1988 by Sun Microsystems, Inc.
- */
-
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-
+/*
+ * Copyright (c) 1988 by Sun Microsystems, Inc.
+ */
/*
* svcauth_des.c, server-side des authentication
*
#define debug(msg) /*printf("svcauth_des: %s\n", msg) */
-#define USEC_PER_SEC ((u_long) 1000000L)
+#define USEC_PER_SEC ((uint32_t) 1000000L)
#define BEFORE(t1, t2) timercmp(t1, t2, <)
/*
des_block key; /* conversation key */
char *rname; /* client's name */
u_int window; /* credential lifetime window */
- struct timeval laststamp; /* detect replays of creds */
+ struct rpc_timeval laststamp; /* detect replays of creds */
char *localcred; /* generic local credential */
};
static struct cache_entry *authdes_cache /* [AUTHDES_CACHESZ] */ ;
-static short *authdes_lru /* [AUTHDES_CACHESZ] */ ;
+static int *authdes_lru /* [AUTHDES_CACHESZ] */ ;
static void cache_init (void) internal_function; /* initialize the cache */
-static short cache_spot (des_block *, char *, struct timeval *)
+static short cache_spot (des_block *, char *, struct rpc_timeval *)
internal_function; /* find an entry in the cache */
-static void cache_ref (short sid) internal_function;
+static void cache_ref (uint32_t sid) internal_function;
/* note that sid was ref'd */
static void invalidate (char *cred) internal_function;
enum auth_stat
_svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
{
- register long *ixdr;
+ register uint32_t *ixdr;
des_block cryptbuf[2];
register struct authdes_cred *cred;
struct authdes_verf verf;
int status;
register struct cache_entry *entry;
- short sid = 0;
+ uint32_t sid = 0;
des_block *sessionkey;
des_block ivec;
u_int window;
- struct timeval timestamp;
- u_long namelen;
+ struct rpc_timeval timestamp;
+ uint32_t namelen;
struct area
{
struct authdes_cred area_cred;
if (authdes_cache == NULL)
cache_init ();
+ if (authdes_cache == NULL) /* No free memory */
+ return AUTH_FAILED;
area = (struct area *) rqst->rq_clntcred;
cred = (struct authdes_cred *) &area->area_cred;
/*
* Get the credential
*/
- ixdr = (long *) msg->rm_call.cb_cred.oa_base;
+ if (msg->rm_call.cb_cred.oa_length <= 0 ||
+ msg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES)
+ return AUTH_BADCRED;
+
+ ixdr = (uint32_t *) msg->rm_call.cb_cred.oa_base;
cred->adc_namekind = IXDR_GET_ENUM (ixdr, enum authdes_namekind);
switch (cred->adc_namekind)
{
case ADN_FULLNAME:
- namelen = IXDR_GET_U_LONG (ixdr);
+ namelen = IXDR_GET_U_INT32 (ixdr);
if (namelen > MAXNETNAMELEN)
{
return AUTH_BADCRED;
}
cred->adc_fullname.name = area->area_netname;
- bcopy ((char *) ixdr, cred->adc_fullname.name,
- (u_int) namelen);
+ bcopy ((char *) ixdr, cred->adc_fullname.name, namelen);
cred->adc_fullname.name[namelen] = 0;
ixdr += (RNDUP (namelen) / BYTES_PER_XDR_UNIT);
- cred->adc_fullname.key.key.high = (u_long) * ixdr++;
- cred->adc_fullname.key.key.low = (u_long) * ixdr++;
- cred->adc_fullname.window = (u_long) * ixdr++;
+ cred->adc_fullname.key.key.high = *ixdr++;
+ cred->adc_fullname.key.key.low = *ixdr++;
+ cred->adc_fullname.window = *ixdr++;
break;
case ADN_NICKNAME:
- cred->adc_nickname = (u_long) * ixdr++;
+ cred->adc_nickname = *ixdr++;
break;
default:
return AUTH_BADCRED;
/*
* Get the verifier
*/
- ixdr = (long *) msg->rm_call.cb_verf.oa_base;
- verf.adv_xtimestamp.key.high = (u_long) * ixdr++;
- verf.adv_xtimestamp.key.low = (u_long) * ixdr++;
- verf.adv_int_u = (u_long) * ixdr++;
+ if (msg->rm_call.cb_verf.oa_length <= 0 ||
+ msg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES)
+ return AUTH_BADCRED;
+ ixdr = (uint32_t *) msg->rm_call.cb_verf.oa_base;
+ verf.adv_xtimestamp.key.high = *ixdr++;
+ verf.adv_xtimestamp.key.low = *ixdr++;
+ verf.adv_int_u = *ixdr++;
/*
* Get the conversation key
}
else
{ /* ADN_NICKNAME */
- sid = (short) cred->adc_nickname;
- if (sid >= AUTHDES_CACHESZ)
+ if (cred->adc_nickname >= AUTHDES_CACHESZ)
{
debug ("bad nickname");
return AUTH_BADCRED; /* garbled credential */
}
+ else
+ sid = cred->adc_nickname;
+
+ /* XXX This could be wrong, but else we have a
+ security problem */
+ if (authdes_cache[sid].rname == NULL)
+ return AUTH_BADCRED;
sessionkey = &authdes_cache[sid].key;
}
(char *) &ivec);
}
else
- {
- status = ecb_crypt ((char *) sessionkey, (char *) cryptbuf,
- sizeof (des_block), DES_DECRYPT | DES_HW);
- }
+ status = ecb_crypt ((char *) sessionkey, (char *) cryptbuf,
+ sizeof (des_block), DES_DECRYPT | DES_HW);
+
if (DES_FAILED (status))
{
debug ("decryption failure");
/*
* XDR the decrypted timestamp
*/
- ixdr = (long *) cryptbuf;
- timestamp.tv_sec = IXDR_GET_LONG (ixdr);
- timestamp.tv_usec = IXDR_GET_LONG (ixdr);
+ ixdr = (uint32_t *) cryptbuf;
+ timestamp.tv_sec = IXDR_GET_INT32 (ixdr);
+ timestamp.tv_usec = IXDR_GET_INT32 (ixdr);
/*
* Check for valid credentials and verifiers.
if (cred->adc_namekind == ADN_FULLNAME)
{
- window = IXDR_GET_U_LONG (ixdr);
- winverf = IXDR_GET_U_LONG (ixdr);
+ short tmp_spot;
+
+ window = IXDR_GET_U_INT32 (ixdr);
+ winverf = IXDR_GET_U_INT32 (ixdr);
if (winverf != window - 1)
{
debug ("window verifier mismatch");
return AUTH_BADCRED; /* garbled credential */
}
- sid = cache_spot (sessionkey, cred->adc_fullname.name,
- ×tamp);
- if (sid < 0)
+ tmp_spot = cache_spot (sessionkey, cred->adc_fullname.name,
+ ×tamp);
+ if (tmp_spot < 0 || tmp_spot > AUTHDES_CACHESZ)
{
debug ("replayed credential");
return AUTH_REJECTEDCRED; /* replay */
}
+ sid = tmp_spot;
nick = 0;
}
else
nick = 1;
}
- if ((u_long) timestamp.tv_usec >= USEC_PER_SEC)
+ if (timestamp.tv_usec >= USEC_PER_SEC)
{
debug ("invalid usecs");
/* cached out (bad key), or garbled verifier */
return nick ? AUTH_REJECTEDVERF : AUTH_BADVERF;
}
- if (nick && BEFORE (×tamp,
- &authdes_cache[sid].laststamp))
+ if (nick && BEFORE (×tamp, &authdes_cache[sid].laststamp))
{
debug ("timestamp before last seen");
- return (AUTH_REJECTEDVERF); /* replay */
+ return AUTH_REJECTEDVERF; /* replay */
}
__gettimeofday (¤t, (struct timezone *) NULL);
current.tv_sec -= window; /* allow for expiration */
/*
* Set up the reply verifier
*/
- verf.adv_nickname = (u_long) sid;
+ verf.adv_nickname = sid;
/*
* xdr the timestamp before encrypting
*/
- ixdr = (long *) cryptbuf;
- IXDR_PUT_LONG (ixdr, timestamp.tv_sec - 1);
- IXDR_PUT_LONG (ixdr, timestamp.tv_usec);
+ ixdr = (int32_t *) cryptbuf;
+ IXDR_PUT_INT32 (ixdr, timestamp.tv_sec - 1);
+ IXDR_PUT_INT32 (ixdr, timestamp.tv_usec);
/*
* encrypt the timestamp
/*
* Serialize the reply verifier, and update rqst
*/
- ixdr = (long *) msg->rm_call.cb_verf.oa_base;
- *ixdr++ = (long) verf.adv_xtimestamp.key.high;
- *ixdr++ = (long) verf.adv_xtimestamp.key.low;
- *ixdr++ = (long) verf.adv_int_u;
+ ixdr = (uint32_t *) msg->rm_call.cb_verf.oa_base;
+ *ixdr++ = verf.adv_xtimestamp.key.high;
+ *ixdr++ = verf.adv_xtimestamp.key.low;
+ *ixdr++ = verf.adv_int_u;
rqst->rq_xprt->xp_verf.oa_flavor = AUTH_DES;
rqst->rq_xprt->xp_verf.oa_base = msg->rm_call.cb_verf.oa_base;
size_t full_len;
cred->adc_fullname.window = window;
- cred->adc_nickname = (u_long) sid; /* save nickname */
+ cred->adc_nickname = sid; /* save nickname */
if (entry->rname != NULL)
- {
- mem_free (entry->rname, strlen (entry->rname) + 1);
- }
+ mem_free (entry->rname, strlen (entry->rname) + 1);
full_len = strlen (cred->adc_fullname.name) + 1;
entry->rname = mem_alloc ((u_int) full_len);
if (entry->rname != NULL)
- {
- memcpy (entry->rname, cred->adc_fullname.name, full_len);
- }
+ memcpy (entry->rname, cred->adc_fullname.name, full_len);
else
{
debug ("out of memory");
+ return AUTH_FAILED; /* out of memory is bad */
}
entry->key = *sessionkey;
entry->window = window;
authdes_cache = (struct cache_entry *)
mem_alloc (sizeof (struct cache_entry) * AUTHDES_CACHESZ);
+ if (authdes_cache == NULL)
+ return;
__bzero ((char *) authdes_cache,
sizeof (struct cache_entry) * AUTHDES_CACHESZ);
- authdes_lru = (short *) mem_alloc (sizeof (short) * AUTHDES_CACHESZ);
+ authdes_lru = (int *) mem_alloc (sizeof (int) * AUTHDES_CACHESZ);
/*
* Initialize the lru list
*/
- for (i = 0; i < AUTHDES_CACHESZ; i++)
- {
- authdes_lru[i] = i;
- }
+ for (i = 0; i < AUTHDES_CACHESZ; ++i)
+ authdes_lru[i] = i;
}
static short
cache_victim (void)
{
- return (authdes_lru[AUTHDES_CACHESZ - 1]);
+ return authdes_lru[AUTHDES_CACHESZ - 1];
}
/*
*/
static void
internal_function
-cache_ref (register short sid)
+cache_ref (register uint32_t sid)
{
register int i;
- register short curr;
- register short prev;
+ register int curr;
+ register int prev;
prev = authdes_lru[0];
authdes_lru[0] = sid;
- for (i = 1; prev != sid; i++)
+ for (i = 1; prev != sid; ++i)
{
curr = authdes_lru[i];
authdes_lru[i] = prev;
}
}
-
/*
* Find a spot in the cache for a credential containing
* the items given. Return -1 if a replay is detected, otherwise
*/
static short
internal_function
-cache_spot (register des_block * key, char *name, struct timeval *timestamp)
+cache_spot (register des_block *key, char *name,
+ struct rpc_timeval *timestamp)
{
register struct cache_entry *cp;
register int i;
- register u_long hi;
+ register uint32_t hi;
hi = key->key.high;
- for (cp = authdes_cache, i = 0; i < AUTHDES_CACHESZ; i++, cp++)
+ for (cp = authdes_cache, i = 0; i < AUTHDES_CACHESZ; ++i, ++cp)
{
if (cp->key.key.high == hi &&
cp->key.key.low == key->key.low &&
{
if (BEFORE (timestamp, &cp->laststamp))
{
- svcauthdes_stats.ncachereplays++;
+ ++svcauthdes_stats.ncachereplays;
return -1; /* replay */
}
- svcauthdes_stats.ncachehits++;
+ ++svcauthdes_stats.ncachehits;
return i; /* refresh */
}
}
- svcauthdes_stats.ncachemisses++;
+ ++svcauthdes_stats.ncachemisses;
return cache_victim (); /* new credential */
}
-
/*
* Local credential handling stuff.
* NOTE: bsd unix dependent.
*uid = cred->uid = i_uid;
*gid = cred->gid = i_gid;
*grouplen = cred->grouplen = i_grouplen;
- for (i = i_grouplen - 1; i >= 0; i--)
- {
- cred->groups[i] = groups[i]; /* int to short */
- }
+ for (i = i_grouplen - 1; i >= 0; --i)
+ cred->groups[i] = groups[i]; /* int to short */
return 1;
}
else if (cred->grouplen == UNKNOWN)
*uid = cred->uid;
*gid = cred->gid;
*grouplen = cred->grouplen;
- for (i = cred->grouplen - 1; i >= 0; i--)
- {
- groups[i] = cred->groups[i]; /* short to int */
- }
+ for (i = cred->grouplen - 1; i >= 0; --i)
+ groups[i] = cred->groups[i]; /* short to int */
return 1;
}
invalidate (char *cred)
{
if (cred == NULL)
- {
- return;
- }
+ return;
((struct bsdcred *) cred)->grouplen = INVALID;
}
-/* @(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
-#endif
/*
* xdr_mem.h, XDR implementation using memory buffers.
*
*/
-
#include <string.h>
#include <rpc/rpc.h>
static bool_t xdrmem_putbytes (XDR *, const char *, u_int);
static u_int xdrmem_getpos (const XDR *);
static bool_t xdrmem_setpos (XDR *, u_int);
-static long *xdrmem_inline (XDR *, int);
+static int32_t *xdrmem_inline (XDR *, int);
static void xdrmem_destroy (XDR *);
static bool_t xdrmem_getint32 (XDR *, int32_t *);
static bool_t xdrmem_putint32 (XDR *, const int32_t *);
* memory buffer.
*/
void
-xdrmem_create (xdrs, addr, size, op)
- XDR *xdrs;
- const caddr_t addr;
- u_int size;
- enum xdr_op op;
+xdrmem_create (XDR *xdrs, const caddr_t addr, u_int size, enum xdr_op op)
{
-
xdrs->x_op = op;
/* We have to add the const since the `struct xdr_ops' in `struct XDR'
is not `const'. */
* point at the next element. Neither object pointed to is const
*/
static bool_t
-xdrmem_getlong (xdrs, lp)
- XDR *xdrs;
- long *lp;
+xdrmem_getlong (XDR *xdrs, long *lp)
{
-
if ((xdrs->x_handy -= 4) < 0)
return FALSE;
*lp = (int32_t) ntohl ((*((int32_t *) (xdrs->x_private))));
* long pointed at is const
*/
static bool_t
-xdrmem_putlong (xdrs, lp)
- XDR *xdrs;
- const long *lp;
+xdrmem_putlong (XDR *xdrs, const long *lp)
{
-
if ((xdrs->x_handy -= 4) < 0)
return FALSE;
*(int32_t *) xdrs->x_private = htonl (*lp);
* a good idea. None of the things pointed to are const.
*/
static bool_t
-xdrmem_getbytes (xdrs, addr, len)
- XDR *xdrs;
- caddr_t addr;
- u_int len;
+xdrmem_getbytes (XDR *xdrs, caddr_t addr, u_int len)
{
-
if ((xdrs->x_handy -= len) < 0)
return FALSE;
bcopy (xdrs->x_private, addr, len);
* unaligned data. The source address is const.
*/
static bool_t
-xdrmem_putbytes (xdrs, addr, len)
- XDR *xdrs;
- const char *addr;
- u_int len;
+xdrmem_putbytes (XDR *xdrs, const char *addr, u_int len)
{
-
if ((xdrs->x_handy -= len) < 0)
return FALSE;
bcopy (addr, xdrs->x_private, len);
* of xdrs. **FIXME** does this not assume u_int == u_long?
*/
static u_int
-xdrmem_getpos (xdrs)
- const XDR *xdrs;
+xdrmem_getpos (const XDR *xdrs)
{
-
return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
}
/*
* xdrs modified
*/
-static long *
-xdrmem_inline (xdrs, len)
- XDR *xdrs;
- int len;
+static int32_t *
+xdrmem_inline (XDR *xdrs, int len)
{
- long *buf = 0;
+ int32_t *buf = 0;
if (xdrs->x_handy >= len)
{
xdrs->x_handy -= len;
- buf = (long *) xdrs->x_private;
+ buf = (int32_t *) xdrs->x_private;
xdrs->x_private += len;
}
return buf;
static bool_t
xdrmem_getint32 (XDR *xdrs, int32_t *ip)
{
-
if ((xdrs->x_handy -= 4) < 0)
return FALSE;
*ip = ntohl ((*((int32_t *) (xdrs->x_private))));
static bool_t
xdrmem_putint32 (XDR *xdrs, const int32_t *ip)
{
-
if ((xdrs->x_handy -= 4) < 0)
return FALSE;
*(int32_t *) xdrs->x_private = htonl (*ip);
-/* @(#)xdr_rec.c 2.2 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro";
-#endif
/*
* xdr_rec.c, Implements TCP/IP based XDR streams with a "record marking"
static bool_t xdrrec_putbytes (XDR *, const char *, u_int);
static u_int xdrrec_getpos (const XDR *);
static bool_t xdrrec_setpos (XDR *, u_int);
-static long *xdrrec_inline (XDR *, int);
+static int32_t *xdrrec_inline (XDR *, int);
static void xdrrec_destroy (XDR *);
static bool_t xdrrec_getint32 (XDR *, int32_t *);
static bool_t xdrrec_putint32 (XDR *, const int32_t *);
*/
static bool_t
-xdrrec_getlong (xdrs, lp)
- XDR *xdrs;
- long *lp;
+xdrrec_getlong (XDR *xdrs, long *lp)
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
int32_t *buflp = (int32_t *) rstrm->in_finger;
}
static bool_t
-xdrrec_putlong (xdrs, lp)
- XDR *xdrs;
- const long *lp;
+xdrrec_putlong (XDR *xdrs, const long *lp)
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
int32_t *dest_lp = (int32_t *) rstrm->out_finger;
}
static bool_t
-xdrrec_putbytes (xdrs, addr, len)
- XDR *xdrs;
- const char *addr;
- u_int len;
+xdrrec_putbytes (XDR *xdrs, const char *addr, u_int len)
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
u_int current;
}
static bool_t
-xdrrec_setpos (xdrs, pos)
- XDR *xdrs;
- u_int pos;
+xdrrec_setpos (XDR *xdrs, u_int pos)
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
u_int currpos = xdrrec_getpos (xdrs);
return FALSE;
}
-static long *
+static int32_t *
xdrrec_inline (XDR *xdrs, int len)
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
- long *buf = NULL;
+ int32_t *buf = NULL;
switch (xdrs->x_op)
{
case XDR_ENCODE:
if ((rstrm->out_finger + len) <= rstrm->out_boundry)
{
- buf = (long *) rstrm->out_finger;
+ buf = (int32_t *) rstrm->out_finger;
rstrm->out_finger += len;
}
break;
if ((len <= rstrm->fbtbc) &&
((rstrm->in_finger + len) <= rstrm->in_boundry))
{
- buf = (long *) rstrm->in_finger;
+ buf = (int32_t *) rstrm->in_finger;
rstrm->fbtbc -= len;
rstrm->in_finger += len;
}
}
static void
-xdrrec_destroy (xdrs)
- XDR *xdrs;
+xdrrec_destroy (XDR *xdrs)
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
return FALSE;
}
-static long *
+static int32_t *
x_inline (XDR *xdrs, int len)
{
if (len == 0)
- {
- return NULL;
- }
+ return NULL;
if (xdrs->x_op != XDR_ENCODE)
- {
- return NULL;
- }
+ return NULL;
if (len < (int) xdrs->x_base)
{
/* x_private was already allocated */
xdrs->x_handy += len;
- return (long *) xdrs->x_private;
+ return (int32_t *) xdrs->x_private;
}
else
{
}
xdrs->x_base = (caddr_t) len;
xdrs->x_handy += len;
- return (long *) xdrs->x_private;
+ return (int32_t *) xdrs->x_private;
}
}
-/* @(#)xdr_stdio.c 2.1 88/07/29 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#if !defined(lint) && defined(SCCSIDS)
-static char sccsid[] = "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";
-#endif
/*
* xdr_stdio.c, XDR implementation on standard i/o file.
static bool_t xdrstdio_putbytes (XDR *, const char *, u_int);
static u_int xdrstdio_getpos (const XDR *);
static bool_t xdrstdio_setpos (XDR *, u_int);
-static long *xdrstdio_inline (XDR *, int);
+static int32_t *xdrstdio_inline (XDR *, int);
static void xdrstdio_destroy (XDR *);
static bool_t xdrstdio_getint32 (XDR *, int32_t *);
static bool_t xdrstdio_putint32 (XDR *, const int32_t *);
* Operation flag is set to op.
*/
void
-xdrstdio_create (xdrs, file, op)
- XDR *xdrs;
- FILE *file;
- enum xdr_op op;
+xdrstdio_create (XDR *xdrs, FILE *file, enum xdr_op op)
{
-
xdrs->x_op = op;
/* We have to add the const since the `struct xdr_ops' in `struct XDR'
is not `const'. */
* Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
*/
static void
-xdrstdio_destroy (xdrs)
- XDR *xdrs;
+xdrstdio_destroy (XDR *xdrs)
{
(void) fflush ((FILE *) xdrs->x_private);
/* xx should we close the file ?? */
};
static bool_t
-xdrstdio_getlong (xdrs, lp)
- XDR *xdrs;
- long *lp;
+xdrstdio_getlong (XDR *xdrs, long *lp)
{
int32_t mycopy;
static bool_t
xdrstdio_putlong (XDR *xdrs, const long *lp)
{
-
long mycopy = htonl (*lp);
lp = &mycopy;
if (fwrite ((caddr_t) lp, 4, 1, (FILE *) xdrs->x_private) != 1)
}
static bool_t
-xdrstdio_getbytes (xdrs, addr, len)
- XDR *xdrs;
- const caddr_t addr;
- u_int len;
+xdrstdio_getbytes (XDR *xdrs, const caddr_t addr, u_int len)
{
-
- if ((len != 0) && (fread (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
+ if ((len != 0) && (fread (addr, (int) len, 1,
+ (FILE *) xdrs->x_private) != 1))
return FALSE;
return TRUE;
}
static bool_t
xdrstdio_putbytes (XDR *xdrs, const char *addr, u_int len)
{
- if ((len != 0) && (fwrite (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
+ if ((len != 0) && (fwrite (addr, (int) len, 1,
+ (FILE *) xdrs->x_private) != 1))
return FALSE;
return TRUE;
}
return fseek ((FILE *) xdrs->x_private, (long) pos, 0) < 0 ? FALSE : TRUE;
}
-static long *
+static int32_t *
xdrstdio_inline (XDR *xdrs, int len)
{
-
/*
* Must do some work to implement this: must insure
* enough data in the underlying stdio buffer,