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. 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.

thanks..
>       if (buflen < sizeof(*in))
>               return ERANGE;
>       in = (struct in_addr*)buf;
_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc

Reply via email to