Hi, all
I have built a arm uClibc toolchain from buildroot. The gcc version is 4.2.3
and uClibc used is snapshot.
Normally, I build busybox 1.7.2 with codesourcery toolchain and everything
works fine.
Then I tried to build buxybox 1.7.2 with arm uClibc toolchain. And it turns out
the telnetd for busybox 1.7.2
does not work functionally. When I telnet to the arm developement board, on
which linux and busybox 1.7.2 is
running, I got a shell prompt. But no matter which keyboard button I pressed,
the connect would be closed.
Consequently, I tried to build busybox 1.10.2 and it turned out that telnetd
for busybox 1.10.2 could work
correctly.
And then, I dig into the telnetd.c for both busybox 1.7.2 and 1.10.2, hoping to
find out why busybox 1.7.2
could not work with arm uClibc toolchain. The followings are my findings.
when busybox telnetd receives character from socketd, it would send the
character to pty. Before sending the
character, here are some statements in telnetd.c: char *ptr; /* Write to
pty from buffer 1. */ ptr = remove_iacs(ts, &num_totty); w =
safe_write(ts->ptyfd, ptr, num_totty);
Here is the statement used to return from remove_iacs in busybox 1.72.
return memmove(ptr - num_totty, ptr0, num_totty);
While the code used to return from remove_iacs in busybox 1.10.2 turns out to
be: if ((ptr - totty) == 0) /* 99.999% of cases */
return ptr0;
return memmove(ptr - num_totty, ptr0, num_totty);
It seems memmove returns value 0 so that when the following code attempts to
access *0, error occurs. Thus, it
could explain why busybox 1.7.2 fails but busybox 1.10.2 works since it returns
ptr0 which is safe.
However, according to GNU Libc definition, the prototype of memmove is: void
* memmove (void *to, const void *from, size_t size)
And the value returned by memmove should be the value of to.
Hence, I dig into the code of uClibc that implements memmove. And I found that
for the code of uClibc i386, memmove
does return the value of to. But for uClibc arm, memmove just simply jumps to a
function _memcpy which is implemented
by a bunch of assembly code. I suspected that uClibc arm code does not
implement memmove according to the GNU libc
definition and memmove does not return a value of to, instead, it returns 0
directly.
If so, busybox 1.10.2 might also be not totally safe. There still exists
possibility that remove_iacs uses memmove to
return.
Could anybody help me to provide me with some comments on my suspicion? Thanks
a lot.
With Regards,
Timothy
_________________________________________________________________
多个邮箱同步管理,live mail客户端万人抢用中
http://get.live.cn/product/mail.html_______________________________________________
uClibc mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/uclibc