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

Reply via email to