This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Fix to output_strlen_unroll - avoids compiler core dump


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);

}


$ 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]