[1184] in Kerberos-V5-bugs

home help back first fref pref prev next nref lref last post

bug report for krb5 b4p3, src/lib/krb5/keytab/file/ktf_get_en.c

daemon@ATHENA.MIT.EDU (Paul Pomes)
Wed Mar 15 15:50:57 1995

Date: Wed, 15 Mar 1995 14:50:22 -0600
From: Paul Pomes <p-pomes@uiuc.edu>
To: krb5-bugs@MIT.EDU

I haven't wrapped my head all the way around this problem, but in debugging
why kprop wasn't working for me, I found this in krb5_ktfile_get_entry():

        if (krb5_principal_compare(principal, new_entry.principal)) {
                if (kvno == IGNORE_VNO) {
                        if (cur_entry.vno < new_entry.vno) {
                                krb5_kt_free_entry(&cur_entry);
                                cur_entry = new_entry;
+				break;
                        }
                } else {
                        cur_entry = new_entry;
                        break;
                }
        } else {


Until I added the break; statement, there was no way to get the v5 kprop/kpropd
programs to work.  I also need to make some changes to the programs themselves
as shown below.

*** /var/apps/src/security/krb5-b4.3/src/slave/kprop.c	Thu Sep 29 21:17:40 1994
--- kprop.c	Wed Mar 15 14:40:46 1995
***************
*** 416,436 ****
  	struct flock lock_arg;
  #endif
  
! 	if ((fd = open(data_fn, O_RDONLY)) < 0) {
  		com_err(progname, errno, "while trying to open %s",
  			data_fn);
  		exit(1);
  	}
  	
  #ifdef POSIX_FILE_LOCKS
! 	lock_arg.l_whence = 0;
! 	lock_arg.l_start = 0;
! 	lock_arg.l_len = 0;
  	if (fcntl(fd, F_SETLK, &lock_arg) == -1) {
  		if (errno == EACCES || errno == EAGAIN)
  			com_err(progname, 0, "database locked");
  		else
! 			com_err(progname, errno, "while trying to flock %s",
  				data_fn);
  		exit(1);
  	}
--- 416,435 ----
  	struct flock lock_arg;
  #endif
  
! 	if ((fd = open(data_fn, O_RDWR)) < 0) {
  		com_err(progname, errno, "while trying to open %s",
  			data_fn);
  		exit(1);
  	}
  	
  #ifdef POSIX_FILE_LOCKS
! 	memset(&lock_arg, 0, sizeof(lock_arg));
! 	lock_arg.l_type = F_WRLCK;
  	if (fcntl(fd, F_SETLK, &lock_arg) == -1) {
  		if (errno == EACCES || errno == EAGAIN)
  			com_err(progname, 0, "database locked");
  		else
! 			com_err(progname, errno, "while trying to fcntl %s",
  				data_fn);
  		exit(1);
  	}


On many systems, a fd has to be opened for writing to get an exclusive lock.
Also the lock type has to be specified.


*** /var/apps/src/security/krb5-b4.3/src/slave/kpropd.c	Thu Sep 15 11:49:32 1994
--- kpropd.c	Wed Mar 15 14:38:46 1995
***************
*** 195,200 ****
--- 195,201 ----
  	if (getpeername(fd, (struct sockaddr *) &from, &fromlen) < 0) {
  		fprintf(stderr, "%s: ", progname);
  		perror("getpeername");
+ 		syslog(LOG_ERR, "getpeername(): %m");
  		exit(1);
  	}
  	if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (caddr_t) &on,

home help back first fref pref prev next nref lref last post