[1210] in Kerberos-V5-bugs

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

krb5b4pl3: slave/kpropd.c enhancement: don't return success to the client until kdb5_edit succeeds

daemon@ATHENA.MIT.EDU (Jonathan I. Kamens)
Sun Mar 19 21:14:51 1995

From: "Jonathan I. Kamens" <jik@cam.ov.com>
Date: Sun, 19 Mar 1995 21:18:00 -0500
To: krb5-bugs@MIT.EDU

This patch modifies the code path of kpropd, so that it only returns
an indication of success to kprop after kdb5_edit is executed and
completes successfully.

--- slave/kpropd.c	1995/03/13 21:28:02	1.7
+++ slave/kpropd.c	1995/03/13 21:53:53	1.8
@@ -93,8 +93,9 @@
 void	doit();
 void	kerberos_authenticate();
 krb5_boolean authorized_principal();
-void	recv_database();
+int	recv_database();
 void	load_database();
+void	send_acknowledgement();
 void	send_error();
 void	recv_error();
 
@@ -214,6 +215,7 @@
 	struct hostent	*hp;
 	krb5_error_code	retval;
 	int	lock_fd;
+	int database_size;
 
 	fromlen = sizeof (from);
 	if (getpeername(fd, (struct sockaddr *) &from, &fromlen) < 0) {
@@ -300,8 +302,8 @@
 			temp_file_name);
 		exit(1);
 	}
-	recv_database(fd, database_fd);
-	if (close(fd) < 0) {
+	database_size = recv_database(fd, database_fd);
+	if (close(database_fd) < 0) {
 		com_err(progname, errno,
 			"while trying to close database file");
 		exit(1);
@@ -311,8 +313,13 @@
 			temp_file_name, file);
 		exit(1);
 	}
-	load_database(kdb5_edit, file);
+	load_database(fd, kdb5_edit, file);
 	close(lock_fd);
+	send_acknowledgement(fd, database_size);
+	if (close(fd) < 0) {
+	    com_err(progname, errno, "while closing socket from client");
+	    exit(1);
+	}
 	exit(0);
 }
 
@@ -558,7 +565,7 @@
     return FALSE;
 }
 
-void
+int
 recv_database(fd, database_fd)
 	int	fd;
 	int	database_fd;
@@ -643,12 +650,16 @@
 			sprintf(buf,
 				"while writing database block starting at offset %d",
 				received_size);
+			com_err(progname, errno, buf);
 			send_error(fd, errno, buf);
+			exit(1);
 		} else if (n != outbuf.length) {
 			sprintf(buf,
 				"incomplete write while writing database block starting at \noffset %d (%d written, %d expected)",
 				received_size, n, outbuf.length);
+			com_err(progname, KRB5KRB_ERR_GENERIC, buf);
 			send_error(fd, KRB5KRB_ERR_GENERIC, buf);
+			exit(1);
 		}
 		received_size += outbuf.length;
 	}
@@ -659,8 +670,20 @@
 		sprintf(buf,
 			"Received %d bytes, expected %d bytes for database file",
 			received_size, database_size);
+		com_err(progname, KRB5KRB_ERR_GENERIC, buf);
 		send_error(fd, KRB5KRB_ERR_GENERIC, buf);
+		exit(1);
 	}
+	return(database_size);
+}
+
+void
+send_acknowledgement(fd, database_size)
+	int fd, database_size;
+{
+	krb5_data inbuf, outbuf;
+	krb5_error_code retval;
+
 	/*
 	 * Send over acknowledgement of number of bytes receieved.
 	 */
@@ -677,7 +700,7 @@
 				  0,	/* no rcache when NOTIME */
 				  &outbuf)) {
 		com_err(progname, retval,
-			"while encoding # of receieved bytes");
+			"while encoding # of received bytes");
 		send_error(fd, retval,
 			   "while encoding # of received bytes");
 		exit(1);
@@ -685,7 +708,7 @@
 	if (retval = krb5_write_message((void *) &fd, &outbuf)) {
 		krb5_xfree(outbuf.data);
 		com_err(progname, retval,
-			"while sending # of receeived bytes");
+			"while sending # of received bytes");
 		exit(1);
 	}
 	krb5_xfree(outbuf.data);
@@ -763,7 +786,8 @@
 }
 
 void
-load_database(kdb5_edit, database_file_name)
+load_database(fd, kdb5_edit, database_file_name)
+	int	fd;
 	char	*kdb5_edit;
 	char	*database_file_name;
 {
@@ -783,6 +807,7 @@
 #endif
 	char	request[1024];
 	krb5_error_code	retval;
+	char buf[MAXPATHLEN+50];
 
 	if (debug)
 		printf("calling krb5_edit to load database\n");
@@ -796,8 +821,10 @@
 
 	switch(child_pid = fork()) {
 	case -1:
-		com_err(progname, errno, "while trying to fork %s",
-			kdb5_edit);
+		(void) sprintf(buf, "while trying to fork to start %s",
+			       kdb5_edit);
+		com_err(progname, errno, buf);
+		send_error(fd, errno, buf);
 		exit(1);
 	case 0:
 		if (!debug) {
@@ -822,15 +849,19 @@
 		if (debug)
 		    printf("Child PID is %d\n", child_pid);
 		if (wait(&waitb) < 0) {
-			com_err(progname, errno, "while waiting for %s",
-				kdb5_edit);
+			(void) sprintf(buf, "while waiting for %s",
+				       kdb5_edit);
+			com_err(progname, errno, buf);
+			send_error(fd, errno, buf);
 			exit(1);
 		}
 	}
 	
 	if (error_ret = WEXITSTATUS(waitb)) {
-		com_err(progname, 0, "%s returned a bad exit status (%d)",
-			kdb5_edit, error_ret);
+		(void) sprintf(buf, "%s returned a bad exit status (%d)",
+			       kdb5_edit, error_ret);
+		com_err(progname, 0, buf);
+		send_error(fd, 0, buf);
 		exit(1);
 	}
 	return;

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