On Thu, 2024-12-19 at 14:41 -0700, Daniel Xu wrote: [...] > > > I think that if test operates on a key like: > > > > > > valid key 15 > > > v > > > 0000000f <-- written to stack as a single u64 value > > > ^^^^^^^ > > > stack zero marks > > > > > > and is executed (e.g. using __retval annotation), > > > then CI passing for s390 should be enough. > > > > +1, something like that where for big-endian it will be all zero while > > for little endian it would be 0xf (and then make sure that the test > > should *fail* by making sure that 0xf is not a valid index, so NULL > > check is necessary) > > How would it work for LE to be 0xF but BE to be 0x0? > > The prog passes a pointer to the beginning of the u32 to > bpf_map_lookup_elem(). The kernel does a 4 byte read starting from that > address. On both BE and LE all 4 bytes will be interpreted. So set bits > cannot just go away. > > Am I missing something? Ok, thinking a bit more, the best test I can come up with is: u8 vals[8]; vals[0] = 0; ... vals[6] = 0; vals[7] = 0xf; p = bpf_map_lookup_elem(... vals ...); *p = 42; For LE vals as u32 should be 0x0f; For BE vals as u32 should be 0xf000_0000. Hence, it is not safe to remove null check for this program. What would verifier think about the value of such key? As far as I understand, there would be stack zero for for vals[0-6] and u8 stack spill for vals[7]. You were going to add a check for the spill size, which should help here. So, a negative test like above that checks that verifier complains that 'p' should be checked for nullness first? If anyone has better test in mind, please speak-up. [...]