Rework logic for using res_ninit() and friends to fall back to
authorTom Yu <tlyu@mit.edu>
Thu, 8 Sep 2005 23:13:39 +0000 (23:13 +0000)
committerTom Yu <tlyu@mit.edu>
Thu, 8 Sep 2005 23:13:39 +0000 (23:13 +0000)
res_init() if res_ndestroy() isn't available.

ticket: 3172
tags: pullup

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17377 dc483132-0cff-0310-8789-dd5450dbe970

src/ChangeLog
src/aclocal.m4
src/lib/krb5/os/ChangeLog
src/lib/krb5/os/dnsglue.c

index b2af644efbad0b822a3dc54cdd45c236eb6c2139..d422e889c99fb71755fa85c31836dbc0b75ce6f2 100644 (file)
@@ -1,3 +1,8 @@
+2005-09-08  Tom Yu  <tlyu@mit.edu>
+
+       * aclocal.m4 (AC_LIBRARY_NET): Check for a few more libresolv
+       functions.
+
 2005-08-20  Ken Raeburn  <raeburn@mit.edu>
 
        * aclocal.m4 (K5_AC_INIT, K5_BUGADDR): New macros.
index c02426bcb72cc9ed1db2ffe787e3acae0cf5b93a..77d876aa09a761bbfeceb4e08e1c83253e71ff80 100644 (file)
@@ -1427,16 +1427,8 @@ AC_DEFUN(AC_LIBRARY_NET, [
     # This may get us a gethostby* that doesn't respect nsswitch.
     AC_CHECK_LIB(resolv, main)
 
-    case $krb5_cv_host in
-    *-*-aix5*)
-       # AIX 5 has broken res_ninit due to resolv.h not having the correct
-       # size of struct __res_state; since we switch off of res_nsearch()
-       # rather than res_ninit(), pretend res_nsearch() is not available.
-       krb5_cv_func_res_nsearch=no
-       ;;
-    esac
-_KRB5_AC_CHECK_RES_FUNCS(res_nsearch res_search ns_initparse dnl
-ns_name_uncompress dn_skipname res_ndestroy)
+_KRB5_AC_CHECK_RES_FUNCS(res_ninit res_nclose res_ndestroy res_nsearch dnl
+ns_initparse ns_name_uncompress dn_skipname res_search)
     if test $krb5_cv_func_res_nsearch = no \
       && test $krb5_cv_func_res_search = no; then
        # Attempt to link with res_search(), in case it's not prototyped.
index 32429e756838478586e1797f838cd2535e937bb8..90cb599c5c6374211958413021c386a252feb20c 100644 (file)
@@ -1,3 +1,11 @@
+2005-09-08  Tom Yu  <tlyu@mit.edu>
+
+       * dnsglue.c: Implement better logic for choosing whether to use
+       res_ninit().  If res_ndestroy() doesn't exist, assume that
+       res_ninit() is broken and use res_init(), res_search(),
+       etc. instead, on the theory that the OS vendor has made the older
+       interfaces thread-safe.
+
 2005-06-09  Ken Raeburn  <raeburn@mit.edu>
 
        * sendto_kdc.c (service_fds): Don't create a select_state on the
index 5d2db36952642f9b7f0d3ed04a71f482df4cc21b..03419bf77965acd7af42abf121486b881181792d 100644 (file)
 
 #include "dnsglue.h"
 
+/*
+ * Only use res_ninit() if there's also a res_ndestroy(), to avoid
+ * memory leaks (Linux & Solaris) and outright corruption (AIX 4.x,
+ * 5.x).  While we're at it, make sure res_nsearch() is there too.
+ *
+ * In any case, it is probable that platforms having broken
+ * res_ninit() will have thread safety hacks for res_init() and _res.
+ */
+#if HAVE_RES_NINIT && HAVE_RES_NDESTROY && HAVE_RES_NSEARCH
+#define USE_RES_NINIT
+#endif
+
 /*
  * Opaque handle
  */
@@ -53,7 +65,7 @@ static int initparse(struct krb5int_dns_state *);
 /*
  * krb5int_dns_init()
  *
- * Initialize an opaue handl.  Do name lookup and initial parsing of
+ * Initialize an opaque handle.  Do name lookup and initial parsing of
  * reply, skipping question section.  Prepare to iterate over answer
  * section.  Returns -1 on error, 0 on success.
  */
@@ -61,7 +73,7 @@ int
 krb5int_dns_init(struct krb5int_dns_state **dsp,
                 char *host, int nclass, int ntype)
 {
-#if HAVE_RES_NSEARCH
+#if USE_RES_NINIT
     struct __res_state statbuf;
 #endif
     struct krb5int_dns_state *ds;
@@ -86,11 +98,13 @@ krb5int_dns_init(struct krb5int_dns_state **dsp,
     ds->cur_ans = 0;
 #endif
 
-#if HAVE_RES_NSEARCH
+#if USE_RES_NINIT
     ret = res_ninit(&statbuf);
+#else
+    ret = res_init();
+#endif
     if (ret < 0)
        return -1;
-#endif
 
     do {
        p = (ds->ansp == NULL)
@@ -103,7 +117,7 @@ krb5int_dns_init(struct krb5int_dns_state **dsp,
        ds->ansp = p;
        ds->ansmax = nextincr;
 
-#if HAVE_RES_NSEARCH
+#if USE_RES_NINIT
        len = res_nsearch(&statbuf, host, ds->nclass, ds->ntype,
                          ds->ansp, ds->ansmax);
 #else
@@ -134,12 +148,8 @@ krb5int_dns_init(struct krb5int_dns_state **dsp,
     ret = 0;
 
 errout:
-#if HAVE_RES_NSEARCH
-#if HAVE_RES_NDESTROY
+#if USE_RES_NINIT
     res_ndestroy(&statbuf);
-#else
-    res_nclose(&statbuf);
-#endif
 #endif
     if (ret < 0) {
        if (ds->ansp != NULL) {