From 5b02fc32d693bb811199308a40143df0adf818c1 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 19 May 2010 07:13:15 +0000 Subject: [PATCH] 2901. [port] Use AC_C_FLEXIBLE_ARRAY_MEMBER. [RT #21316] --- CHANGES | 2 ++ config.h.in | 11 ++++++- configure | 75 ++++++++++++++++++++++++++++++++++++++++++++++-- configure.in | 3 +- lib/dns/client.c | 26 ++++++++--------- 5 files changed, 100 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index 0be65bf389..7fc042f8bf 100644 --- 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] diff --git a/config.h.in b/config.h.in index 8bb7fafe96..26222754a6 100644 --- a/config.h.in +++ b/config.h.in @@ -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 diff --git a/configure b/configure index 8154621b73..937b735672 100755 --- 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 + #include + #include + 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() # diff --git a/configure.in b/configure.in index 5732e50a55..6d8d769e2f 100644 --- a/configure.in +++ b/configure.in @@ -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() diff --git a/lib/dns/client.c b/lib/dns/client.c index 0e9d1d9e2b..dfbb9130d3 100644 --- a/lib/dns/client.c +++ b/lib/dns/client.c @@ -14,10 +14,12 @@ * 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 +#include + #include #include #include @@ -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;