Bug in irc_res.c

Immo 'FaUl' Wehrenberg immo at bundessicherheitsministerium.de
Tue Feb 7 12:13:52 EST 2006


Hi,
I've invested a bit of time in investigating a bug which causes a
bus-error on any client-connect on some Platforms (in my case sparc64).
The problem is in res_readreply(), the buf is unaligned. The problem is
that some platforms (Sparc, Alpha and possible a few more require 
aligned Memory to access. In this case it's header->id, which is a
uint_16_t, that requires the uint_16_t to be aligned to 16 bits. 

Hovewer the following patch, not so nice though, fixes this (but depends
on gcc).

HTH

FaUl
-- 
[Felix von Leitner in dcsm]
SuSE verscheuert eine Bastardisierung eines zusammenkopierten
Softwarehaufens, wo zufällig auch der Linux Kernel drin vorkommt.
-------------- next part --------------
diff -urp ircd-hybrid-7.2.0/src/irc_res.c ircd-hybrid-7.2.0.fixed/src/irc_res.c
--- ircd-hybrid-7.2.0/src/irc_res.c	2005-12-09 05:52:53.000000000 +0000
+++ ircd-hybrid-7.2.0.fixed/src/irc_res.c	2006-02-07 13:18:55.000000000 +0000
@@ -762,7 +762,15 @@ proc_answer(struct reslist *request, HEA
 static void
 res_readreply(fde_t *fd, void *data)
 {
-  char buf[sizeof(HEADER) + MAXPACKET];
+  char buf[sizeof(HEADER) + MAXPACKET]
+	/* Sparc and alpha need 16bit-alignment for accessing header->id 
+	 * (which is uint16_t). Because of the header = (HEADER*) buf; 
+	 * lateron, this is neeeded. --FaUl
+	 */
+#if defined(__sparc__) || defined(__alpha__)  
+	  __attribute__((aligned (16)))
+#endif 
+	  ;
   HEADER *header;
   struct reslist *request = NULL;
   struct DNSReply *reply  = NULL;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.ircd-hybrid.org/pipermail/hybrid/attachments/20060207/7249ab46/attachment.pgp>


More information about the hybrid mailing list