]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2901. [port] Use AC_C_FLEXIBLE_ARRAY_MEMBER. [RT #21316]
authorMark Andrews <marka@isc.org>
Wed, 19 May 2010 07:13:15 +0000 (07:13 +0000)
committerMark Andrews <marka@isc.org>
Wed, 19 May 2010 07:13:15 +0000 (07:13 +0000)
CHANGES
config.h.in
configure
configure.in
lib/dns/client.c

diff --git a/CHANGES b/CHANGES
index 0be65bf3894aab104d57090a72782ac1fce231cc..7fc042f8bf6645646d2cd397dfc32391b308ab3b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+2901.  [port]          Use AC_C_FLEXIBLE_ARRAY_MEMBER. [RT #21316]
+
 2900.  [bug]           The placeholder negative caching element was not
                        properly constructed triggering a INSIST in 
                        dns_ncache_towire(). [RT #21346]
index 8bb7fafe964dbd79d43749c5aa24db8c62cc4651..26222754a68f244ca01ed824093278879da6ebeb 100644 (file)
@@ -16,7 +16,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: config.h.in,v 1.124 2010/05/12 08:25:21 marka Exp $ */
+/* $Id: config.h.in,v 1.126 2010/05/26 23:44:27 marka Exp $ */
 
 /*! \file */
 
@@ -160,6 +160,15 @@ int sigwait(const unsigned int *set, int *sig);
 /* Solaris hack to get select_large_fdset. */
 #undef FD_SETSIZE
 
+/* Define to nothing if C supports flexible array members, and to 1 if it does
+   not. That way, with a declaration like `struct s { int n; double
+   d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99
+   compilers. When computing the size of such an object, don't use 'sizeof
+   (struct s)' as it overestimates the size. Use 'offsetof (struct s, d)'
+   instead. Don't use 'offsetof (struct s, d[0])', as this doesn't work with
+   MSVC and with C++ compilers. */
+#undef FLEXIBLE_ARRAY_MEMBER
+
 /* Define to 1 if you have the `chroot' function. */
 #undef HAVE_CHROOT
 
index 8154621b7340c8f12bd62414defee8dc9b89f815..937b7356725c753ffebf2ec47c51a2ca4a3521d3 100755 (executable)
--- a/configure
+++ b/configure
@@ -14,7 +14,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 #
-# $Id: configure,v 1.475 2010/05/12 08:25:21 marka Exp $
+# $Id: configure,v 1.476 2010/05/19 07:13:15 marka Exp $
 #
 # Portions Copyright (C) 1996-2001  Nominum, Inc.
 #
@@ -29,7 +29,7 @@
 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-# From configure.in Revision: 1.492 .
+# From configure.in Revision: 1.493 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.62.
 #
@@ -21227,6 +21227,77 @@ _ACEOF
 fi
 
 
+  { $as_echo "$as_me:$LINENO: checking for flexible array members" >&5
+$as_echo_n "checking for flexible array members... " >&6; }
+if test "${ac_cv_c_flexmember+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+           #include <stdio.h>
+           #include <stddef.h>
+           struct s { int n; double d[]; };
+int
+main ()
+{
+int m = getchar ();
+           struct s *p = malloc (offsetof (struct s, d)
+                                 + m * sizeof (double));
+           p->d[0] = 0.0;
+           return p->d != (double *) NULL;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_flexmember=yes
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_flexmember=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_flexmember" >&5
+$as_echo "$ac_cv_c_flexmember" >&6; }
+  if test $ac_cv_c_flexmember = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define FLEXIBLE_ARRAY_MEMBER /**/
+_ACEOF
+
+  else
+    cat >>confdefs.h <<\_ACEOF
+#define FLEXIBLE_ARRAY_MEMBER 1
+_ACEOF
+
+  fi
+
+
 #
 # Older versions of HP/UX don't define seteuid() and setegid()
 #
index 5732e50a55e40f01bc8c3569106f842244d6b8c7..6d8d769e2f2e855178efe430eb13ecf7ca202ecd 100644 (file)
@@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl
 esyscmd([sed "s/^/# /" COPYRIGHT])dnl
 AC_DIVERT_POP()dnl
 
-AC_REVISION($Revision: 1.492 $)
+AC_REVISION($Revision: 1.493 $)
 
 AC_INIT(lib/dns/name.c)
 AC_PREREQ(2.59)
@@ -282,6 +282,7 @@ AC_C_CONST
 AC_C_INLINE
 AC_C_VOLATILE
 AC_CHECK_FUNC(sysctlbyname, AC_DEFINE(HAVE_SYSCTLBYNAME))
+AC_C_FLEXIBLE_ARRAY_MEMBER
 
 #
 # Older versions of HP/UX don't define seteuid() and setegid()
index 0e9d1d9e2b364b259e3fb18c21133c92ae580a1d..dfbb9130d3d6d632d1b040b7dfc8b59c06e891e1 100644 (file)
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: client.c,v 1.9 2010/04/14 22:08:47 jinmei Exp $ */
+/* $Id: client.c,v 1.10 2010/05/19 07:09:25 marka Exp $ */
 
 #include <config.h>
 
+#include <stddef.h>
+
 #include <isc/app.h>
 #include <isc/mem.h>
 #include <isc/mutex.h>
@@ -2878,7 +2880,7 @@ typedef struct {
        dns_rdata_t     rdata;
        size_t          size;
        isc_mem_t *     mctx;
-       unsigned char   data[0];
+       unsigned char   data[FLEXIBLE_ARRAY_MEMBER];
 } dns_client_updaterec_t;
 
 isc_result_t
@@ -2888,9 +2890,8 @@ dns_client_updaterec(dns_client_updateop_t op, dns_name_t *owner,
                     dns_rdataset_t *rdataset, dns_rdatalist_t *rdatalist,
                     dns_rdata_t *rdata, isc_mem_t *mctx)
 {
-       dns_client_updaterec_t *updaterec;
-       size_t size = sizeof(dns_client_updaterec_t);
-       isc_buffer_t *b = NULL;
+       dns_client_updaterec_t *updaterec = NULL;
+       size_t size = offsetof(dns_client_updaterec_t, data);
 
        REQUIRE(op < updateop_max);
        REQUIRE(owner != NULL);
@@ -2919,16 +2920,15 @@ dns_client_updaterec(dns_client_updateop_t op, dns_name_t *owner,
                dns_rdataset_init(rdataset);
                dns_rdatalist_init(&updaterec->rdatalist);
                dns_rdata_init(&updaterec->rdata);
-               isc_buffer_init(b, b + 1,
-                               size - sizeof(dns_client_updaterec_t));
-               dns_name_copy(owner, target, b);
+               isc_buffer_init(&updaterec->buffer, updaterec->data,
+                               size - offsetof(dns_client_updaterec_t, data));
+               dns_name_copy(owner, target, &updaterec->buffer);
                if (source != NULL) {
                        isc_region_t r;
                        dns_rdata_clone(source, rdata);
                        dns_rdata_toregion(rdata, &r);
-                       rdata->data = isc_buffer_used(b);
-                       isc_buffer_copyregion(b, &r);
-
+                       rdata->data = isc_buffer_used(&updaterec->buffer);
+                       isc_buffer_copyregion(&updaterec->buffer, &r);
                }
                updaterec->mctx = NULL;
                isc_mem_attach(mctx, &updaterec->mctx);
@@ -2968,9 +2968,9 @@ dns_client_updaterec(dns_client_updateop_t op, dns_name_t *owner,
        ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
        dns_rdatalist_tordataset(rdatalist, rdataset);
        ISC_LIST_APPEND(target->list, rdataset, link);
-       if (b != NULL) {
+       if (updaterec != NULL) {
                target->attributes |= DNS_NAMEATTR_HASUPDATEREC;
-               dns_name_setbuffer(target, b);
+               dns_name_setbuffer(target, &updaterec->buffer);
        }
        if (op == updateop_add || op == updateop_delete)
                target->attributes |= DNS_NAMEATTR_UPDATE;