This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix to output_strlen_unroll - avoids compiler core dump
- To: gcc-patches@gcc.gnu.org
- Subject: Fix to output_strlen_unroll - avoids compiler core dump
- From: Jim Kingdon <kingdon@redhat.com>
- Date: Tue, 31 Aug 1999 12:31:36 -0400
If you read output_strlen_unroll in config/i386/i386.c, you'll see
that there is a code path (in which the alignment of operands[1] is
known to be 2 and QI_REG_P (xops[1]) is false) in which the compiler
uses xops[7] without setting it (and thus will dump core). I've
enclosed a test case (for egcs 1.1.2 - this test case doesn't hit the
bug for gcc 2.96.x, but from inspection of the source, the bug would
seem to still be around). I've also enclosed a patch (which just
copies over the code from the case in which QI_REG_P (xops[1]) is
true).
This test case is taken from kerberos5 (bug #4402 in bugzilla at
http://developer.redhat.com/).
Shouldn't need copyright paperwork for this, but just as a status
update the paperwork seems to be proceeding at the usual snail's pace
(our lawyer is out of town this week).
Tue Aug 31 11:51:06 1999 Jim Kingdon <http://developer.redhat.com>
* config/i386/i386.c (output_strlen_unroll): Don't write xops[7]
label if it wasn't set.
*** i386.c~ Thu Aug 19 23:24:17 1999
--- i386.c Tue Aug 31 11:50:53 1999
***************
*** 5153,5158 ****
--- 5153,5161 ----
output_asm_insn (AS1 (je,%l12), xops);
output_asm_insn (AS1 (inc%L0,%0), xops);
+ /* Not needed with an alignment of 2 */
+ if (GET_CODE (operands[1]) != CONST_INT || INTVAL (operands[1]) != 2)
+ {
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
CODE_LABEL_NUMBER (xops[7]));
output_asm_insn (AS2 (cmp%B13,%2,%13), xops);
***************
*** 5161,5166 ****
--- 5164,5171 ----
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L",
CODE_LABEL_NUMBER (xops[6]));
+ }
+
output_asm_insn (AS2 (cmp%B13,%2,%13), xops);
}
$ cc1 make_egcs_crash.c -mcpu=i486 -march=i486 -quiet -dumpbase
make_egcs_crash.c -m486 -O2 -version -fPIC -fno-strength-reduce
[various errors, which are OK, followed by a core dump, which is not OK]
$ cat make_egcs_crash.c
# 1 "./g_in_tkt.c"
# 1 "../../include/kerberosIV/mit-copyright.h" 1
# 11 "./g_in_tkt.c" 2
# 1 "../../include/kerberosIV/krb.h" 1
# 1 "../../include/kerberosIV/des.h" 1
typedef unsigned char des_cblock[8];
typedef struct des_ks_struct { des_cblock _; } des_key_schedule[16];
typedef struct des_ks_struct bit_64;
# 31 "../../include/kerberosIV/krb.h" 2
extern const char *const krb_err_txt[256 ];
struct ktext {
int length;
unsigned char dat[1250 ];
unsigned long mbz;
};
typedef struct ktext *KTEXT;
typedef struct ktext KTEXT_ST;
struct auth_dat {
unsigned char k_flags;
char pname[40 ];
char pinst[40 ];
char prealm[40 ];
unsigned long checksum;
des_cblock session;
int life;
unsigned long time_sec;
unsigned long address;
KTEXT_ST reply;
};
typedef struct auth_dat AUTH_DAT;
struct credentials {
char service[40 ];
char instance[40 ];
char realm[40 ];
des_cblock session;
int lifetime;
int kvno;
KTEXT_ST ticket_st;
long issue_date;
char pname[40 ];
char pinst[40 ];
};
typedef struct credentials CREDENTIALS;
struct msg_dat {
unsigned char *app_data;
unsigned long app_length;
unsigned long hash;
int swap;
long time_sec;
unsigned char time_5ms;
};
typedef struct msg_dat MSG_DAT;
# 302 "../../include/kerberosIV/krb.h"
# 313 "../../include/kerberosIV/krb.h"
char *tkt_string();
# 378 "../../include/kerberosIV/krb.h"
# 1 "/usr/include/sys/types.h" 1 3
# 1 "/usr/include/features.h" 1 3
# 165 "/usr/include/features.h" 3
# 1 "/usr/include/sys/cdefs.h" 1 3
# 71 "/usr/include/sys/cdefs.h" 3
# 103 "/usr/include/sys/cdefs.h" 3
# 249 "/usr/include/features.h" 2 3
# 1 "/usr/include/gnu/stubs.h" 1 3
# 277 "/usr/include/features.h" 2 3
# 26 "/usr/include/sys/types.h" 2 3
# 1 "/usr/include/bits/types.h" 1 3
# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
typedef unsigned int size_t;
# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 29 "/usr/include/bits/types.h" 2 3
typedef unsigned char __u_char;
typedef unsigned short __u_short;
typedef unsigned int __u_int;
typedef unsigned long __u_long;
__extension__ typedef unsigned long long int __u_quad_t;
__extension__ typedef long long int __quad_t;
# 48 "/usr/include/bits/types.h" 3
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
__extension__ typedef signed long long int __int64_t;
__extension__ typedef unsigned long long int __uint64_t;
typedef __quad_t *__qaddr_t;
typedef __u_quad_t __dev_t;
typedef __u_int __uid_t;
typedef __u_int __gid_t;
typedef __u_long __ino_t;
typedef __u_int __mode_t;
typedef __u_int __nlink_t;
typedef long int __off_t;
typedef __quad_t __loff_t;
typedef int __pid_t;
typedef int __ssize_t;
typedef long int __rlim_t;
typedef __quad_t __rlim64_t;
typedef __u_int __id_t;
typedef struct
{
int __val[2];
} __fsid_t;
typedef int __daddr_t;
typedef char *__caddr_t;
typedef long int __time_t;
typedef long int __swblk_t;
typedef long int __clock_t;
typedef unsigned long int __fd_mask;
typedef struct
{
__fd_mask fds_bits[1024 / (8 * sizeof (__fd_mask)) ];
} __fd_set;
typedef int __key_t;
typedef unsigned short int __ipc_pid_t;
typedef __u_long __blkcnt_t;
typedef __u_quad_t __blkcnt64_t;
typedef long int __fsblkcnt_t;
typedef __quad_t __fsblkcnt64_t;
typedef __u_long __fsfilcnt_t;
typedef __u_quad_t __fsfilcnt64_t;
typedef __u_long __ino64_t;
typedef __loff_t __off64_t;
typedef int __t_scalar_t;
typedef unsigned int __t_uscalar_t;
typedef int __intptr_t;
# 1 "/usr/include/bits/pthreadtypes.h" 1 3
# 1 "/usr/include/bits/sched.h" 1 3
# 62 "/usr/include/bits/sched.h" 3
struct __sched_param
{
int sched_priority;
};
# 23 "/usr/include/bits/pthreadtypes.h" 2 3
struct _pthread_fastlock
{
long int __status;
int __spinlock;
};
typedef struct _pthread_descr_struct *_pthread_descr;
typedef struct
{
int __detachstate;
int __schedpolicy;
struct __sched_param __schedparam;
int __inheritsched;
int __scope;
size_t __guardsize;
int __stackaddr_set;
void *__stackaddr;
size_t __stacksize;
} pthread_attr_t;
typedef struct
{
struct _pthread_fastlock __c_lock;
_pthread_descr __c_waiting;
} pthread_cond_t;
typedef struct
{
int __dummy;
} pthread_condattr_t;
typedef unsigned int pthread_key_t;
typedef struct
{
int __m_reserved;
int __m_count;
_pthread_descr __m_owner;
int __m_kind;
struct _pthread_fastlock __m_lock;
} pthread_mutex_t;
typedef struct
{
int __mutexkind;
} pthread_mutexattr_t;
typedef int pthread_once_t;
typedef struct
{
struct _pthread_fastlock __rw_lock;
int __rw_readers;
_pthread_descr __rw_writer;
_pthread_descr __rw_read_waiting;
_pthread_descr __rw_write_waiting;
int __rw_kind;
int __rw_pshared;
} pthread_rwlock_t;
typedef struct
{
int __lockkind;
int __pshared;
} pthread_rwlockattr_t;
typedef unsigned long int pthread_t;
# 150 "/usr/include/bits/types.h" 2 3
# 30 "/usr/include/sys/types.h" 2 3
typedef __u_char u_char;
typedef __u_short u_short;
typedef __u_int u_int;
typedef __u_long u_long;
typedef __quad_t quad_t;
typedef __u_quad_t u_quad_t;
typedef __fsid_t fsid_t;
typedef __loff_t loff_t;
typedef __ino_t ino_t;
typedef __ino64_t ino64_t;
typedef __dev_t dev_t;
typedef __gid_t gid_t;
typedef __mode_t mode_t;
typedef __nlink_t nlink_t;
typedef __uid_t uid_t;
typedef __off_t off_t;
typedef __off64_t off64_t;
typedef __pid_t pid_t;
typedef __id_t id_t;
typedef __ssize_t ssize_t;
typedef __daddr_t daddr_t;
typedef __caddr_t caddr_t;
typedef __key_t key_t;
# 1 "/usr/include/time.h" 1 3
# 51 "/usr/include/time.h" 3
typedef __clock_t clock_t;
typedef __time_t time_t;
# 89 "/usr/include/time.h" 3
# 279 "/usr/include/time.h" 3
# 121 "/usr/include/sys/types.h" 2 3
# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 188 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 124 "/usr/include/sys/types.h" 2 3
typedef unsigned long int ulong;
typedef unsigned short int ushort;
typedef unsigned int uint;
# 158 "/usr/include/sys/types.h" 3
typedef int int8_t __attribute__ ((__mode__ ( __QI__ ))) ;
typedef int int16_t __attribute__ ((__mode__ ( __HI__ ))) ;
typedef int int32_t __attribute__ ((__mode__ ( __SI__ ))) ;
typedef int int64_t __attribute__ ((__mode__ ( __DI__ ))) ;
typedef unsigned int u_int8_t __attribute__ ((__mode__ ( __QI__ ))) ;
typedef unsigned int u_int16_t __attribute__ ((__mode__ ( __HI__ ))) ;
typedef unsigned int u_int32_t __attribute__ ((__mode__ ( __SI__ ))) ;
typedef unsigned int u_int64_t __attribute__ ((__mode__ ( __DI__ ))) ;
typedef int register_t __attribute__ ((__mode__ (__word__)));
# 1 "/usr/include/endian.h" 1 3
# 1 "/usr/include/bits/endian.h" 1 3
# 35 "/usr/include/endian.h" 2 3
# 190 "/usr/include/sys/types.h" 2 3
# 1 "/usr/include/sys/select.h" 1 3
# 1 "/usr/include/bits/select.h" 1 3
# 37 "/usr/include/bits/select.h" 3
# 57 "/usr/include/bits/select.h" 3
# 73 "/usr/include/bits/select.h" 3
# 31 "/usr/include/sys/select.h" 2 3
# 1 "/usr/include/bits/sigset.h" 1 3
typedef int __sig_atomic_t;
typedef struct
{
unsigned long int __val[(1024 / (8 * sizeof (unsigned long int))) ];
} __sigset_t;
# 125 "/usr/include/bits/sigset.h" 3
# 34 "/usr/include/sys/select.h" 2 3
# 1 "/usr/include/time.h" 1 3
# 51 "/usr/include/time.h" 3
# 62 "/usr/include/time.h" 3
# 73 "/usr/include/time.h" 3
struct timespec
{
long int tv_sec;
long int tv_nsec;
};
# 279 "/usr/include/time.h" 3
# 38 "/usr/include/sys/select.h" 2 3
struct timeval;
typedef __fd_mask fd_mask;
typedef __fd_set fd_set;
extern int __select (int __nfds, __fd_set *__readfds,
__fd_set *__writefds, __fd_set *__exceptfds,
struct timeval *__timeout) ;
extern int select (int __nfds, __fd_set *__readfds,
__fd_set *__writefds, __fd_set *__exceptfds,
struct timeval *__timeout) ;
extern int pselect (int __nfds, __fd_set *__readfds,
__fd_set *__writefds, __fd_set *__exceptfds,
const struct timespec *__timeout,
const __sigset_t *__sigmask) ;
# 193 "/usr/include/sys/types.h" 2 3
# 1 "/usr/include/sys/sysmacros.h" 1 3
# 196 "/usr/include/sys/types.h" 2 3
typedef __blkcnt_t blkcnt_t;
typedef __fsblkcnt_t fsblkcnt_t;
typedef __fsfilcnt_t fsfilcnt_t;
typedef __blkcnt64_t blkcnt64_t;
typedef __fsblkcnt64_t fsblkcnt64_t;
typedef __fsfilcnt64_t fsfilcnt64_t;
# 414 "../../include/kerberosIV/krb.h" 2
# 428 "../../include/kerberosIV/krb.h"
extern int krb_ignore_ip_address;
extern int errno;
typedef int (*key_proc_type) (char *, char *, char *,
char *, des_cblock ) ;
typedef int (*decrypt_tkt_type) (char *, char *, char *, char *,
key_proc_type, KTEXT *) ;
# 12 "./g_in_tkt.c" 2
# 1 "../../include/kerberosIV/prot.h" 1
# 1 "../../include/kerberosIV/krb_conf.h" 1
extern int krbONE;
# 26 "../../include/kerberosIV/prot.h" 2
KTEXT create_auth_reply();
KTEXT create_death_packet();
KTEXT pkt_cipher();
# 14 "./g_in_tkt.c" 2
# 1 "/usr/include/string.h" 1 3
# 1 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 1 3
# 19 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 61 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 131 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 188 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 271 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 283 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 317 "/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h" 3
# 33 "/usr/include/string.h" 2 3
extern void * memcpy (void * __dest,
__const void * __src, size_t __n) ;
extern void * memmove (void * __dest, __const void * __src,
size_t __n) ;
extern void * memccpy (void * __dest, __const void * __src,
int __c, size_t __n) ;
extern void * memset (void * __s, int __c, size_t __n) ;
extern int memcmp (__const void * __s1, __const void * __s2,
size_t __n) ;
extern void * memchr (__const void * __s, int __c, size_t __n) ;
extern void * rawmemchr (__const void * __s, int __c) ;
extern char *strcpy (char * __dest,
__const char * __src) ;
extern char *strncpy (char * __dest,
__const char * __src, size_t __n) ;
extern char *strcat (char * __dest,
__const char * __src) ;
extern char *strncat (char * __dest,
__const char * __src, size_t __n) ;
extern int strcmp (__const char *__s1, __const char *__s2) ;
extern int strncmp (__const char *__s1, __const char *__s2, size_t __n) ;
extern int strcoll (__const char *__s1, __const char *__s2) ;
extern size_t strxfrm (char * __dest,
__const char * __src, size_t __n) ;
# 1 "/usr/include/xlocale.h" 1 3
typedef struct __locale_struct
{
struct locale_data *__locales[6];
const unsigned short int *__ctype_b;
const int *__ctype_tolower;
const int *__ctype_toupper;
} *__locale_t;
# 99 "/usr/include/string.h" 2 3
extern int __strcoll_l (__const char *__s1, __const char *__s2,
__locale_t __l) ;
extern size_t __strxfrm_l (char *__dest, __const char *__src, size_t __n,
__locale_t __l) ;
extern char *__strdup (__const char *__s) ;
extern char *strdup (__const char *__s) ;
extern char *strndup (__const char *__string, size_t __n) ;
# 143 "/usr/include/string.h" 3
extern char *strchr (__const char *__s, int __c) ;
extern char *strrchr (__const char *__s, int __c) ;
extern size_t strcspn (__const char *__s, __const char *__reject) ;
extern size_t strspn (__const char *__s, __const char *__accept) ;
extern char *strpbrk (__const char *__s, __const char *__accept) ;
extern char *strstr (__const char *__haystack, __const char *__needle) ;
extern char *__strcasestr (__const char *__haystack,
__const char *__needle) ;
extern char *strcasestr (__const char *__haystack,
__const char *__needle) ;
extern char *strtok (char * __s,
__const char * __delim) ;
extern char *__strtok_r (char * __s,
__const char * __delim,
char ** __save_ptr) ;
extern char *strtok_r (char * __s,
__const char * __delim,
char ** __save_ptr) ;
extern void * memmem (__const void * __haystack, size_t __haystacklen,
__const void * __needle, size_t __needlelen) ;
extern void * __mempcpy (void * __dest,
__const void * __src, size_t __n) ;
extern void * mempcpy (void * __dest,
__const void * __src, size_t __n) ;
extern size_t strlen (__const char *__s) ;
extern size_t strnlen (__const char *__string, size_t __maxlen) ;
extern char *strerror (int __errnum) ;
extern char *__strerror_r (int __errnum, char *__buf, size_t __buflen) ;
extern char *strerror_r (int __errnum, char *__buf, size_t __buflen) ;
extern void __bzero (void * __s, size_t __n) ;
extern void bcopy (__const void * __src, void * __dest, size_t __n) ;
extern void bzero (void * __s, size_t __n) ;
extern int bcmp (__const void * __s1, __const void * __s2, size_t __n) ;
extern char *index (__const char *__s, int __c) ;
extern char *rindex (__const char *__s, int __c) ;
extern int __ffs (int __i) __attribute__ ((const));
extern int ffs (int __i) __attribute__ ((const));
extern int ffsl (long int __l) __attribute__ ((const));
__extension__ extern int ffsll (long long int __ll)
__attribute__ ((const));
extern int __strcasecmp (__const char *__s1, __const char *__s2) ;
extern int strcasecmp (__const char *__s1, __const char *__s2) ;
extern int strncasecmp (__const char *__s1, __const char *__s2,
size_t __n) ;
extern int __strcasecmp_l (__const char *__s1, __const char *__s2,
__locale_t __loc) ;
extern int __strncasecmp_l (__const char *__s1, __const char *__s2,
size_t __n, __locale_t __loc) ;
extern char *strsep (char ** __stringp,
__const char * __delim) ;
extern int strverscmp (__const char *__s1, __const char *__s2) ;
extern char *strsignal (int __sig) ;
extern char *__stpcpy (char * __dest,
__const char * __src) ;
extern char *stpcpy (char * __dest,
__const char * __src) ;
extern char *__stpncpy (char * __dest,
__const char * __src, size_t __n) ;
extern char *stpncpy (char * __dest,
__const char * __src, size_t __n) ;
extern char *strfry (char *__string) ;
extern void * memfrob (void * __s, size_t __n) ;
extern char *basename (__const char *__filename) ;
# 341 "/usr/include/string.h" 3
# 16 "./g_in_tkt.c" 2
extern int swap_bytes;
static int
decrypt_tkt(user, instance, realm, arg, key_proc, cipp)
char *user;
char *instance;
char *realm;
char *arg;
key_proc_type key_proc;
KTEXT *cipp;
{
KTEXT cip = *cipp;
des_cblock key;
des_key_schedule key_s;
{
register int rc;
rc = (*key_proc) (user,instance,realm,arg,key);
if (rc)
return(rc);
}
des_key_sched (key,key_s);
des_pcbc_encrypt ((des_cblock *)cip->dat,(des_cblock *)cip->dat,
(long) cip->length,key_s,(des_cblock *)key,0);
memset((char *)key, 0,sizeof(key));
memset((char *)key_s, 0,sizeof(key_s));
return(0);
}
int
krb_mk_in_tkt_preauth(user, instance, realm, service, sinstance, life,
preauth_p, preauth_len, cip)
char *user;
char *instance;
char *realm;
char *service;
char *sinstance;
int life;
char *preauth_p;
int preauth_len;
KTEXT cip;
{
KTEXT_ST pkt_st;
KTEXT pkt = &pkt_st;
KTEXT_ST rpkt_st;
KTEXT rpkt = &rpkt_st;
unsigned char *v = pkt->dat;
unsigned char *t = (pkt->dat+1);
int msg_byte_order;
int kerror;
unsigned long rep_err_code;
unsigned int t_switch;
unsigned long t_local;
*v = (unsigned char) 4 ;
*t = (unsigned char) 1<<1 ;
*t |= (* (char *) &krbONE) ;
(void) strcpy((char *)(pkt->dat+2),user);
pkt->length = 3 + strlen(user);
(void) strcpy((char *)(pkt->dat+pkt->length),
instance);
pkt->length += 1 + strlen(instance);
(void) strcpy((char *)(pkt->dat+pkt->length),realm);
pkt->length += 1 + strlen(realm);
t_local = unix_time_gmt_unixsec((unsigned long *)0) ;
memcpy((char *)(pkt->dat+pkt->length), (char *)&t_local, 4);
pkt->length += 4;
*(pkt->dat+(pkt->length)++) = (char) life;
(void) strcpy((char *)(pkt->dat+pkt->length),service);
pkt->length += 1 + strlen(service);
(void) strcpy((char *)(pkt->dat+pkt->length),sinstance);
pkt->length += 1 + strlen(sinstance);
if (preauth_len)
memcpy((char *)(pkt->dat+pkt->length), preauth_p, preauth_len);
pkt->length += preauth_len;
rpkt->length = 0;
if (kerror = send_to_kdc(pkt, rpkt, realm)) return(kerror);
if ((unsigned int) *( rpkt ->dat) != 4 )
return(63 );
msg_byte_order = (unsigned int) *( rpkt ->dat+1) & 1;
swap_bytes = 0;
if (msg_byte_order != (* (char *) &krbONE) ) {
swap_bytes++;
}
t_switch = (unsigned int) *( rpkt ->dat+1) ;
t_switch &= ~1;
switch (t_switch) {
case 2<<1 :
break;
case 5<<1 :
memcpy((char *) &rep_err_code, ( (char *) ( rpkt ->dat+9+strlen((char *
)( rpkt ->dat+2) ) + strlen((char *)( rpkt ->dat+3+strlen((char *)( rpkt
->dat+2) )) ) + strlen((char *)(( rpkt ->dat+3+strlen((char *)( rpkt
->dat+2) )) +1+strlen((char *)( rpkt ->dat+3+strlen((char *)( rpkt
->dat+2) )) )) ))) , 4);
if (swap_bytes) { unsigned long _krb_swap_tmp[4]; swab((char *) & r
ep_err_code , ((char *) _krb_swap_tmp) +2 ,2); swab(((char *) & rep_err_cod
e ) +2,((char *) _krb_swap_tmp),2); rep_err_code = _krb_swap_tmp[0]; } ;
return((int)rep_err_code);
default:
return(63 );
}
cip->length = pkt_clen(rpkt);
if ((cip->length < 0) || (cip->length > sizeof(cip->dat)))
return(70 );
memcpy((char *)(cip->dat), (char *) pkt_cipher(rpkt), cip->length);
return 0 ;
}
int
krb_parse_in_tkt(user, instance, realm, service, sinstance, life, cip)
char *user;
char *instance;
char *realm;
char *service;
char *sinstance;
int life;
KTEXT cip;
{
char *ptr;
des_cblock ses;
int kvno;
char s_name[40 ];
char s_instance[40 ];
char rlm[40 ];
KTEXT_ST tkt_st;
KTEXT tkt = &tkt_st;
unsigned long kdc_time;
unsigned long t_local;
long t_diff;
int kerror;
int lifetime;
ptr = (char *) cip->dat;
memcpy((char *)ses, ptr, 8);
ptr += 8;
if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length)
return(62 );
(void) strncpy(s_name,ptr, sizeof(s_name)-1);
s_name[sizeof(s_name)-1] = '\0';
ptr += strlen(s_name) + 1;
if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length)
return(62 );
(void) strncpy(s_instance,ptr, sizeof(s_instance)-1);
s_instance[sizeof(s_instance)-1] = '\0';
ptr += strlen(s_instance) + 1;
if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length)
return(62 );
(void) strncpy(rlm,ptr, sizeof(rlm));
rlm[sizeof(rlm)-1] = '\0';
ptr += strlen(rlm) + 1;
lifetime = (unsigned char) ptr[0];
kvno = (unsigned char) ptr[1];
tkt->length = (unsigned char) ptr[2];
ptr += 3;
if ((tkt->length < 0) ||
((tkt->length + (ptr - (char *) cip->dat)) > cip->length))
return(62 );
memcpy((char *)(tkt->dat), ptr, tkt->length);
ptr += tkt->length;
if (strcmp(s_name, service) || strcmp(s_instance, sinstance) ||
strcmp(rlm, realm))
return(70 );
memcpy((char *)&kdc_time, ptr, 4);
if (swap_bytes) { unsigned long _krb_swap_tmp[4]; swab((char *) & kdc_t
ime , ((char *) _krb_swap_tmp) +2 ,2); swab(((char *) & kdc_time ) +2,((cha
r *) _krb_swap_tmp),2); kdc_time = _krb_swap_tmp[0]; } ;
ptr += 4;
t_local = unix_time_gmt_unixsec((unsigned long *)0) ;
t_diff = t_local - kdc_time;
if (t_diff < 0) t_diff = -t_diff;
if (t_diff > 5*60 ) {
return(37 );
}
if (in_tkt(user,instance) != 0 )
return(70 );
if (kerror = krb_save_credentials(s_name, s_instance, rlm, ses,
lifetime, kvno, tkt, t_local))
return(kerror);
return(0 );
}
int
krb_get_in_tkt_preauth(user, instance, realm, service, sinstance, life,
key_proc, decrypt_proc, arg, preauth_p, preauth_len)
char *user;
char *instance;
char *realm;
char *service;
char *sinstance;
int life;
key_proc_type key_proc;
decrypt_tkt_type decrypt_proc;
char *arg;
char *preauth_p;
int preauth_len;
{
KTEXT_ST cip_st;
KTEXT cip = &cip_st;
int kerror;
if (kerror = krb_mk_in_tkt_preauth(user, instance, realm,
service, sinstance,
life, preauth_p, preauth_len, cip))
return kerror;
if (decrypt_proc == ((void *)0) )
decrypt_tkt (user, instance, realm, arg, key_proc, &cip);
else
(*decrypt_proc)(user, instance, realm, arg, key_proc, &cip);
return
krb_parse_in_tkt(user, instance, realm, service, sinstance,
life, cip);
}
int
krb_get_in_tkt(user, instance, realm, service, sinstance, life,
key_proc, decrypt_proc, arg)
char *user;
char *instance;
char *realm;
char *service;
char *sinstance;
int life;
key_proc_type key_proc;
decrypt_tkt_type decrypt_proc;
char *arg;
{
return krb_get_in_tkt_preauth(user, instance, realm,
service, sinstance, life,
key_proc, decrypt_proc, arg, (char *)0, 0);
}
$