Alignment fixups for gethostbyname_r

Bernhard Fischer rep.dot.nop at gmail.com
Fri Dec 21 20:18:11 UTC 2007


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.



More information about the uClibc mailing list