From mboxrd@z Thu Jan 1 00:00:00 1970 From: behanw@converseincode.com Subject: [PATCH v3] net: netfilter: LLVMLinux: vlais-netfilter Date: Tue, 18 Mar 2014 18:50:41 -0700 Message-ID: <1395193841-2886-1-git-send-email-behanw@converseincode.com> References: <063D6719AE5E284EB5DD2968C1650D6D0F6E0286@AcuExch.aculab.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: pablo@netfilter.org, kaber@trash.net, kadlec@blackhole.kfki.hu, netfilter-devel@vger.kernel.org, netfilter@vger.kernel.org, coreteam@netfilter.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, torvalds@linux-foundation.org, dwmw2@infradead.org, pageexec@freemail.hu, David.Laight@ACULAB.COM, Mark Charlebois , Behan Webster , =?UTF-8?q?Vin=C3=ADcius=20Tinti?= To: davem@davemloft.net Return-path: In-Reply-To: <063D6719AE5E284EB5DD2968C1650D6D0F6E0286@AcuExch.aculab.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: netfilter-devel.vger.kernel.org =46rom: Mark Charlebois Replaced non-standard C use of Variable Length Arrays In Structs (VLAIS= ) in xt_repldata.h with a C99 compliant flexible array member and then calcu= lated offsets to the other struct members. These other members aren't referen= ced by name in this code, however this patch maintains the same memory layout = and padding as was previously accomplished using VLAIS. Had the original structure been ordered differently, with the entries V= LA at the end, then it could have been a flexible member, and this patch woul= d have been a lot simpler. However since the data stored in this structure is ultimately exported to userspace, the order of this structure can't be = changed. This patch makes no attempt to change the existing behavior, merely the= way in which the current layout is accomplished using standard C99 constructs.= As such the code can now be compiled with either gcc or clang. Author: Mark Charlebois Signed-off-by: Mark Charlebois Signed-off-by: Behan Webster Signed-off-by: Vin=C3=ADcius Tinti --- net/netfilter/xt_repldata.h | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/net/netfilter/xt_repldata.h b/net/netfilter/xt_repldata.h index 6efe4e5..343599e 100644 --- a/net/netfilter/xt_repldata.h +++ b/net/netfilter/xt_repldata.h @@ -5,23 +5,40 @@ * they serve as the hanging-off data accessed through repl.data[]. */ =20 +/* tbl has the following structure equivalent, but is C99 compliant: + * struct { + * struct type##_replace repl; + * struct type##_standard entries[nhooks]; + * struct type##_error term; + * } *tbl; + */ + #define xt_alloc_initial_table(type, typ2) ({ \ unsigned int hook_mask =3D info->valid_hooks; \ unsigned int nhooks =3D hweight32(hook_mask); \ unsigned int bytes =3D 0, hooknum =3D 0, i =3D 0; \ struct { \ struct type##_replace repl; \ - struct type##_standard entries[nhooks]; \ - struct type##_error term; \ - } *tbl =3D kzalloc(sizeof(*tbl), GFP_KERNEL); \ + struct type##_standard entries[]; \ + } *tbl; \ + struct type##_error *term; \ + size_t entries_end =3D offsetof(typeof(*tbl), \ + entries[nhooks-1]) + sizeof(tbl->entries[0]); \ + size_t term_offset =3D (entries_end + __alignof__(*term) - 1) \ + & ~(__alignof__(*term) - 1); \ + size_t term_end =3D term_offset + sizeof(*term); \ + size_t tbl_sz =3D (term_end + __alignof__(tbl->repl) - 1) \ + & ~(__alignof__(tbl->repl) - 1); \ + tbl =3D kzalloc(tbl_sz, GFP_KERNEL); \ if (tbl =3D=3D NULL) \ return NULL; \ + term =3D (struct type##_error *)&(((char *)tbl)[term_offset]); \ strncpy(tbl->repl.name, info->name, sizeof(tbl->repl.name)); \ - tbl->term =3D (struct type##_error)typ2##_ERROR_INIT; \ + *term =3D (struct type##_error)typ2##_ERROR_INIT; \ tbl->repl.valid_hooks =3D hook_mask; \ tbl->repl.num_entries =3D nhooks + 1; \ tbl->repl.size =3D nhooks * sizeof(struct type##_standard) + \ - sizeof(struct type##_error); \ + sizeof(struct type##_error); \ for (; hook_mask !=3D 0; hook_mask >>=3D 1, ++hooknum) { \ if (!(hook_mask & 1)) \ continue; \ --=20 1.8.3.2