[前][次][番号順一覧][スレッド一覧]

ruby-changes:27202

From: akr <ko1@a...>
Date: Fri, 15 Feb 2013 20:30:30 +0900 (JST)
Subject: [ruby-changes:27202] akr:r39254 (trunk): * ext/socket/sockport.h (SET_SIN_LEN): defined for strict-aliasing

akr	2013-02-15 20:30:19 +0900 (Fri, 15 Feb 2013)

  New Revision: 39254

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39254

  Log:
    * ext/socket/sockport.h (SET_SIN_LEN): defined for strict-aliasing
      rule.
      (INIT_SOCKADDR_IN): ditto.
    
    * ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR_IN.
      (addrinfo_ipv6_to_ipv4): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/raddrinfo.c
    trunk/ext/socket/sockport.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 39253)
+++ ChangeLog	(revision 39254)
@@ -1,3 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Fri Feb 15 20:29:11 2013  Tanaka Akira  <akr@f...>
+
+	* ext/socket/sockport.h (SET_SIN_LEN): defined for strict-aliasing
+	  rule.
+	  (INIT_SOCKADDR_IN): ditto.
+
+	* ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR_IN.
+	  (addrinfo_ipv6_to_ipv4): ditto.
+
 Fri Feb 15 18:24:48 2013  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/mkmf.rb (MakeMakefile#try_run): bail out explicitly if cross
Index: ext/socket/raddrinfo.c
===================================================================
--- ext/socket/raddrinfo.c	(revision 39253)
+++ ext/socket/raddrinfo.c	(revision 39254)
@@ -253,7 +253,7 @@ make_inetaddr(unsigned int host, char *b https://github.com/ruby/ruby/blob/trunk/ext/socket/raddrinfo.c#L253
 {
     struct sockaddr_in sin;
 
-    INIT_SOCKADDR((struct sockaddr *)&sin, AF_INET, sizeof(sin));
+    INIT_SOCKADDR_IN(&sin, AF_INET, sizeof(sin));
     sin.sin_addr.s_addr = host;
     make_ipaddr0((struct sockaddr*)&sin, sizeof(sin), buf, buflen);
 }
@@ -1929,7 +1929,7 @@ addrinfo_ipv6_to_ipv4(VALUE self) https://github.com/ruby/ruby/blob/trunk/ext/socket/raddrinfo.c#L1929
     addr = &((struct sockaddr_in6 *)&rai->addr)->sin6_addr;
     if (IN6_IS_ADDR_V4MAPPED(addr) || IN6_IS_ADDR_V4COMPAT(addr)) {
         struct sockaddr_in sin4;
-        INIT_SOCKADDR((struct sockaddr *)&sin4, AF_INET, sizeof(sin4));
+        INIT_SOCKADDR_IN(&sin4, AF_INET, sizeof(sin4));
         memcpy(&sin4.sin_addr, (char*)addr + sizeof(*addr) - sizeof(sin4.sin_addr), sizeof(sin4.sin_addr));
         return rsock_addrinfo_new((struct sockaddr *)&sin4, (socklen_t)sizeof(sin4),
                                   PF_INET, rai->socktype, rai->protocol,
Index: ext/socket/sockport.h
===================================================================
--- ext/socket/sockport.h	(revision 39253)
+++ ext/socket/sockport.h	(revision 39254)
@@ -22,6 +22,13 @@ https://github.com/ruby/ruby/blob/trunk/ext/socket/sockport.h#L22
 # define SET_SA_LEN(sa, len) (void)(len)
 #endif
 
+/* for strict-aliasing rule */
+#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
+# define SET_SIN_LEN(sa, len) (void)((sa)->sin_len = (len))
+#else
+# define SET_SIN_LEN(sa, len) SET_SA_LEN((struct sockaddr *)(sa), (len))
+#endif
+
 #define INIT_SOCKADDR(addr, family, len) \
   do { \
     struct sockaddr *init_sockaddr_ptr = (addr); \
@@ -31,6 +38,15 @@ https://github.com/ruby/ruby/blob/trunk/ext/socket/sockport.h#L38
     SET_SA_LEN(init_sockaddr_ptr, init_sockaddr_len); \
   } while (0)
 
+#define INIT_SOCKADDR_IN(addr, family, len) \
+  do { \
+    struct sockaddr_in *init_sockaddr_ptr = (addr); \
+    socklen_t init_sockaddr_len = (len); \
+    memset(init_sockaddr_ptr, 0, init_sockaddr_len); \
+    init_sockaddr_ptr->sin_family = (family); \
+    SET_SIN_LEN(init_sockaddr_ptr, init_sockaddr_len); \
+  } while (0)
+
 #ifndef IN_MULTICAST
 # define IN_CLASSD(i)	(((long)(i) & 0xf0000000) == 0xe0000000)
 # define IN_MULTICAST(i)	IN_CLASSD(i)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]