List:Commits« Previous MessageNext Message »
From:Alexander Nozdrin Date:April 5 2011 6:51pm
Subject:bzr commit into mysql-5.5 branch (alexander.nozdrin:3421) Bug#12325375
View as plain text  
#At file:///home/alik/MySQL/bzr/00/bug12325375/mysql-5.5-bug12325375/ based on revid:georgi.kodinov@stripped

 3421 Alexander Nozdrin	2011-04-05
      A patch for Bug#12325375: THE SERVER ON WINXP DOES NOT ALLOW CONNECTIONS
      IF NO DNS-SERVER AVAILABLE.
      
      The thing is that on Windows XP getnameinfo() returns WSANO_DATA
      when hostname-lookup is not available. The problem was that
      this error code was treated as serious error and the client
      connection got rejected.
      
      The fix is to treat all errors from getnameinfo() as not ciritical,
      but add IP-address to the host cache only for EAI_NONAME (or WSANO_DATA).

    modified:
      include/violite.h
      sql/hostname.cc
      vio/viosocket.c
=== modified file 'include/violite.h'
--- a/include/violite.h	2010-06-07 14:01:39 +0000
+++ b/include/violite.h	2011-04-05 18:51:21 +0000
@@ -93,6 +93,8 @@ ssize_t vio_pending(Vio *vio);
 my_bool vio_get_normalized_ip_string(const struct sockaddr *addr, int addr_length,
                                      char *ip_string, size_t ip_string_size);
 
+my_bool vio_is_no_name_error(int err_code);
+
 int vio_getnameinfo(const struct sockaddr *sa,
                     char *hostname, size_t hostname_size,
                     char *port, size_t port_size,

=== modified file 'sql/hostname.cc'
--- a/sql/hostname.cc	2010-07-23 20:17:55 +0000
+++ b/sql/hostname.cc	2011-04-05 18:51:21 +0000
@@ -366,41 +366,33 @@ bool ip_to_hostname(struct sockaddr_stor
   err_code= vio_getnameinfo(ip, hostname_buffer, NI_MAXHOST, NULL, 0,
                             NI_NAMEREQD);
 
-  if (err_code == EAI_NONAME)
+  if (err_code)
   {
-    /*
-      There is no reverse address mapping for the IP address. A host name
-      can not be resolved.
-    */
+    DBUG_PRINT("error", ("IP address '%s' could not be resolved: %s.",
+                         (const char *) ip_key,
+                         (const char *) gai_strerror(err_code)));
 
-    DBUG_PRINT("error", ("IP address '%s' could not be resolved: "
-                         "no reverse address mapping.",
-                         (const char *) ip_key));
+    sql_print_warning("IP address '%s' could not be resolved: %s.",
+                      (const char *) ip_key,
+                      (const char *) gai_strerror(err_code));
 
-    sql_print_warning("IP address '%s' could not be resolved: "
-                      "no reverse address mapping.",
-                      (const char *) ip_key);
+    if (vio_is_no_name_error(err_code))
+    {
+      /*
+        The no-name error means that there is no reverse address mapping
+        for the IP address. A host name can not be resolved.
 
-    err_status= add_hostname(ip_key, NULL);
+        If it is not the no-name error, we should not cache the hostname
+        (or rather its absence), because the failure might be transient.
+      */
 
-    *hostname= NULL;
-    *connect_errors= 0; /* New IP added to the cache. */
+      add_hostname(ip_key, NULL);
 
-    DBUG_RETURN(err_status);
-  }
-  else if (err_code)
-  {
-    DBUG_PRINT("error", ("IP address '%s' could not be resolved: "
-                         "getnameinfo() returned %d.",
-                         (const char *) ip_key,
-                         (int) err_code));
-
-    sql_print_warning("IP address '%s' could not be resolved: "
-                      "getnameinfo() returned error (code: %d).",
-                      (const char *) ip_key,
-                      (int) err_code);
+      *hostname= NULL;
+      *connect_errors= 0; /* New IP added to the cache. */
+    }
 
-    DBUG_RETURN(TRUE);
+    DBUG_RETURN(FALSE);
   }
 
   DBUG_PRINT("info", ("IP '%s' resolved to '%s'.",

=== modified file 'vio/viosocket.c'
--- a/vio/viosocket.c	2010-08-16 12:50:27 +0000
+++ b/vio/viosocket.c	2011-04-05 18:51:21 +0000
@@ -1060,6 +1060,34 @@ ssize_t vio_pending(Vio *vio)
 
 
 /**
+  Checks if the error code, returned by vio_getnameinfo(), means it was the
+  "No-name" error.
+
+  Windows-specific note: getnameinfo() returns WSANO_DATA instead of
+  EAI_NODATA or EAI_NONAME when no reverse mapping is available at the host
+  (i.e. Windows can't get hostname by IP-address). This error should be
+  treated as EAI_NONAME.
+
+  @return if the error code is actually EAI_NONAME.
+  @retval true if the error code is EAI_NONAME.
+  @retval false otherwise.
+*/
+
+my_bool vio_is_no_name_error(int err_code)
+{
+#ifdef __WIN__
+
+  return err_code == WSANO_DATA || err_code == EAI_NONAME;
+
+#else
+
+  return err_code == EAI_NONAME;
+
+#endif
+}
+
+
+/**
   This is a wrapper for the system getnameinfo(), because different OS
   differ in the getnameinfo() implementation:
     - Solaris 10 requires that the 2nd argument (salen) must match the


Attachment: [text/bzr-bundle] bzr/alexander.nozdrin@oracle.com-20110405185121-00a2f7i9rybavkw9.bundle
Thread
bzr commit into mysql-5.5 branch (alexander.nozdrin:3421) Bug#12325375Alexander Nozdrin5 Apr