On Thu, Oct 08, 2020 at 06:46:40PM +0200, Jan Engelhardt wrote: > On Thursday 2020-10-08 18:07, Phil Sutter wrote: > >> iptables does not rely or even do such embedding nonsense. When we > >> have a flexible array member T x[0] or T x[] somewhere, we really do > >> mean that Ts follow, not some Us like in the RDMA case. > > > >In fact, struct ipt_replace has a zero-length array as last field of > >type struct ipt_entry which in turn has a zero-length array as last > >field. :) > > In the RDMA thread, I was informed that the trailing members' only > purpose is to serve as something of a shorthand: > > Shortcut: > struct ipt_entry *e = replace->elements; > The long way: > struct ipt_entry *e = (void *)((char *)replace + sizeof(*replace)); > > But such gritty detail is often stowed away in some nice accessor > functions or macros. That's what's currently missing in spots > apprently. > > struct ipt_entry *next = get_next_blah(replace); > > Then the get_next can do that arithmetic, we won't need > ipt_replace::elements, and could do away with the flexible array > member altogether, especially when it's not used with equal-sized > elements, and ipt_entry is of variadic size. Since this is UAPI though, we can't get rid of the problematic fields, no? Cheers, Phil