[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] gnttab: avoid triggering assertion in radix_tree_ulong_to_ptr()
On 27/08/2021 09:21, Jan Beulich wrote: > Relevant quotes from the C11 standard: > > "Except where explicitly stated otherwise, for the purposes of this > subclause unnamed members of objects of structure and union type do not > participate in initialization. Unnamed members of structure objects > have indeterminate value even after initialization." > > "If there are fewer initializers in a brace-enclosed list than there are > elements or members of an aggregate, [...], the remainder of the > aggregate shall be initialized implicitly the same as objects that have > static storage duration." > > "If an object that has static or thread storage duration is not > initialized explicitly, then: > [...] > — if it is an aggregate, every member is initialized (recursively) > according to these rules, and any padding is initialized to zero > bits; > [...]" > > "A bit-field declaration with no declarator, but only a colon and a > width, indicates an unnamed bit-field." Footnote: "An unnamed bit-field > structure member is useful for padding to conform to externally imposed > layouts." > > "There may be unnamed padding within a structure object, but not at its > beginning." > > Which makes me conclude: > - Whether an unnamed bit-field member is an unnamed member or padding is > unclear, and hence also whether the last quote above would render the > big endian case of the structure declaration invalid. > - Whether the number of members of an aggregate includes unnamed ones is > also not really clear. > - The initializer in map_grant_ref() initializes all fields of the "cnt" > sub-structure of the union, so assuming the second quote above applies > here (indirectly), the compiler isn't required to implicitly > initialize the rest (i.e. in particular any padding) like would happen > for static storage duration objects. > > Gcc 7.4.1 can be observed (apparently in debug builds only) to translate > aforementioned initializer to a read-modify-write operation of a stack > variable, leaving unchanged the top two bits of whatever was previously > in that stack slot. Clearly if either of the two bits were set, > radix_tree_ulong_to_ptr()'s assertion would trigger. > > Therefore, to be on the safe side, add an explicit padding field for the > non-big-endian-bitfields case and give a dummy name to both padding > fields. > > Fixes: 9781b51efde2 ("gnttab: replace mapkind()") > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |