]> 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:53 +0000 (07:13 +0000)
committerMark Andrews <marka@isc.org>
Wed, 19 May 2010 07:13:53 +0000 (07:13 +0000)
CHANGES
config.h.in
configure
configure.in
lib/dns/client.c

diff --git a/CHANGES b/CHANGES
index 12c68b3a71969712e00e35dc51b656a617583c57..812e9706b2fa751c3c2171b2c5a1e151b261129c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
 
        --- 9.7.1b1 released ---
 
+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 8116f4952fa326cb8c841ff514dae6ea71ddd416..54e185ee7982884de9971eddd5396f233dc99dd3 100644 (file)
@@ -16,7 +16,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: config.h.in,v 1.122.32.2 2010/05/12 08:25:52 marka Exp $ */
+/* $Id: config.h.in,v 1.122.32.3 2010/05/19 07:13:53 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 abcc3e68338041316770fa67bd3e34331f657236..653857fc7d4608613ce6175170e82605aa398242 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.473.22.2 2010/05/12 08:25:52 marka Exp $
+# $Id: configure,v 1.473.22.3 2010/05/19 07:13:53 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.489.22.3 .
+# From configure.in Revision: 1.489.22.4 .
 # 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 248779849ac8763c16072755a4af9d22ba644b79..43449f377d131cc11b559fac6da6d4398dc73640 100644 (file)
@@ -18,7 +18,7 @@ AC_DIVERT_PUSH(1)dnl
 esyscmd([sed "s/^/# /" COPYRIGHT])dnl
 AC_DIVERT_POP()dnl
 
-AC_REVISION($Revision: 1.489.22.3 $)
+AC_REVISION($Revision: 1.489.22.4 $)
 
 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 b791892fe86261751a9c34ec18453411ec5b947d..8b4e6ba7c551ae6e01d6b2745993eaf4596352de 100644 (file)
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: client.c,v 1.6.32.3 2010/04/14 22:10:04 jinmei Exp $ */
+/* $Id: client.c,v 1.6.32.4 2010/05/19 07:11:19 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;