sshd broken on arm?

John Hay jhay at meraka.org.za
Fri Jan 18 01:54:48 PST 2008


On Thu, Jan 17, 2008 at 12:58:54PM +0200, John Hay wrote:
> Hi Guys,
> 
> I just did a new build using RELENG_7 for the arm (Avila boards) and then
> found that I cannot ssh into them. The sshd crash with a bus error just
> after you entered your username and password. My build of mid November
> did not do it. Anybody got ideas?
> 
> The last part of "sshd -Dddd" on the arm board looks like this:
> 
> debug1: server_input_channel_req: channel 0 request pty-req reply 0
> debug1: session_by_channel: session 0 channel 0
> debug1: session_input_channel_req: session 0 req pty-req
> debug1: Allocating pty.
> debug3: mm_request_send entering: type 25
> debug3: monitor_read: checking request 25
> debug3: mm_answer_pty entering
> debug1: session_new: init
> debug1: session_new: session 0
> debug3: mm_pty_allocate: waiting for MONITOR_ANS_PTY
> debug3: mm_request_receive_expect entering: type 26
> debug3: mm_request_receive entering
> debug3: mm_request_send entering: type 26
> ssh_mm_receive_fd: recvmsg: expected received 1 got 0
> debug1: do_cleanup
> debug1: PAM: cleanup
> Bus error (core dumped)
> debug3: PAM: sshpam_thread_cleanup entering

Ok, I found the problem. It looks like something changed and now the
alignment for the char tmp[...] array in monitor_fdpass.c:mm_send_fd
and monitor_fdpass.c:mm_receive_fd is different and the arm processors
do not like it. Attached is my quick fix.

One question that I have is if we should just fix all of these "problems"
or should something be changed so that these things are aligned again? In
the last month or two I have come across quite a few of these things that
used to work on the arm and now do not anymore because of alignment
changes.

(I have cc'ed des@ because his name pitch up a lot in the openssh cvs logs.
:-)

John
-- 
John Hay -- John.Hay at meraka.csir.co.za / jhay at FreeBSD.org


Index: monitor_fdpass.c
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/monitor_fdpass.c,v
retrieving revision 1.1.1.7
diff -u -r1.1.1.7 monitor_fdpass.c
--- monitor_fdpass.c	10 Nov 2006 16:38:34 -0000	1.1.1.7
+++ monitor_fdpass.c	18 Jan 2008 08:45:19 -0000
@@ -49,7 +49,7 @@
 	char ch = '\0';
 	ssize_t n;
 #ifndef HAVE_ACCRIGHTS_IN_MSGHDR
-	char tmp[CMSG_SPACE(sizeof(int))];
+	char tmp[CMSG_SPACE(sizeof(int)) + sizeof(int)];
 	struct cmsghdr *cmsg;
 #endif
 
@@ -58,7 +58,7 @@
 	msg.msg_accrights = (caddr_t)&fd;
 	msg.msg_accrightslen = sizeof(fd);
 #else
-	msg.msg_control = (caddr_t)tmp;
+	msg.msg_control = (caddr_t)(_ALIGN(tmp));
 	msg.msg_controllen = CMSG_LEN(sizeof(int));
 	cmsg = CMSG_FIRSTHDR(&msg);
 	cmsg->cmsg_len = CMSG_LEN(sizeof(int));
@@ -94,7 +94,7 @@
 	char ch;
 	int fd;
 #ifndef HAVE_ACCRIGHTS_IN_MSGHDR
-	char tmp[CMSG_SPACE(sizeof(int))];
+	char tmp[CMSG_SPACE(sizeof(int)) + sizeof(int)];
 	struct cmsghdr *cmsg;
 #endif
 
@@ -107,8 +107,8 @@
 	msg.msg_accrights = (caddr_t)&fd;
 	msg.msg_accrightslen = sizeof(fd);
 #else
-	msg.msg_control = tmp;
-	msg.msg_controllen = sizeof(tmp);
+	msg.msg_control = (caddr_t)(_ALIGN(tmp));
+	msg.msg_controllen = CMSG_LEN(sizeof(int));
 #endif
 
 	if ((n = recvmsg(sock, &msg, 0)) == -1)


More information about the freebsd-arm mailing list