On Fri, Dec 21, 2007 at 09:12:52PM +0100, Bernhard Fischer wrote:
>On Wed, Dec 19, 2007 at 11:57:28AM -0500, Daniel Jacobowitz wrote:
>>MontaVista noticed that when their kernels were configured to trap
>>on unaligned access gethostbyname_r could mysteriously crash. I
>>tracked this down to an unaligned buffer being passed to
>>gethostbyname_r from some other part of uClibc (afraid I don't
>>remember where from any more). We have to pad the beginning of
>>the buffer to a pointer alignment before we store pointers in
>>it.
>>
>>Is this patch OK?
>>
>>--
>>Daniel Jacobowitz
>>CodeSourcery
>>
>>--- libc/inet/resolv.c (revision 189757)
>>+++ libc/inet/resolv.c (local)
>>@@ -1534,6 +1534,15 @@ int attribute_hidden __read_etc_hosts_r(
>> char *cp, **alias;
>> int aliases, i, ret = HOST_NOT_FOUND;
>>
>>+ /* Align to at least the size of a char * so we can put
>>+ pointers in it. */
>>+ i = (unsigned long) buf % sizeof(char *);
>>+ i = (sizeof(char *) - i) % sizeof(char *);
>>+ if (buflen < i)
>>+ return ERANGE;
>>+ buf+=i;
>>+ buflen-=i;
>>+
>> if (buflen < sizeof(char *)*(ALIAS_DIM))
>> return ERANGE;
>> alias = (char **)buf;
>>@@ -2030,6 +2039,16 @@ int gethostbyname_r(const char * name,
>> DPRINTF("Nothing found in /etc/hosts\n");
>>
>> *h_errnop = NETDB_INTERNAL;
>>+
>>+ /* Align to at least the size of a char * so we can put
>>+ pointers in it. */
>>+ i = (unsigned long) buf % sizeof(char *);
>>+ i = (sizeof(char *) - i) % sizeof(char *);
>>+ if (buflen < i)
>>+ return ERANGE;
>>+ buf+=i;
>>+ buflen-=i;
>>+
>
>This sounds OK to me
[provided you wrap that in som commonly useable whatever_range_check()
for reuse -- i ment to type before sending. This pops up too often for
inlining it.]
>> . Please install it along a testcase if you tested it and
>found it to be good on all platforms in most common configurations with
>no regressions.
_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc