On Thu, Nov 12, 2020 at 11:13 AM Daniel Xu <dxu@xxxxxxxxx> wrote: > > On Wed Nov 11, 2020 at 3:22 PM PST, Andrii Nakryiko wrote: > > On Wed, Nov 11, 2020 at 2:46 PM Daniel Xu <dxu@xxxxxxxxx> wrote: > > > > > > 6ae08ae3dea2 ("bpf: Add probe_read_{user, kernel} and probe_read_{user, > > > kernel}_str helpers") introduced a subtle bug where > > > bpf_probe_read_user_str() would potentially copy a few extra bytes after > > > the NUL terminator. > > > > > > This issue is particularly nefarious when strings are used as map keys, > > > as seemingly identical strings can occupy multiple entries in a map. > > > > > > This patchset fixes the issue and introduces a selftest to prevent > > > future regressions. > > > > > > v4 -> v5: > > > * don't read potentially uninitialized memory > > > > I think the bigger problem was that it could overwrite unintended > > memory. E.g., in BPF program, if you had something like: > > > > char my_buf[8 + 3]; > > char my_precious_data[5] = {1, 2, 3, 4, 5}; > > How does that happen? > > The > > while (max >= sizeof(unsigned long)) { > /* copy 4 bytes */ > > max -= sizeof(unsigned long) > } > > /* copy byte at a time */ > > where `max` is the user supplied length should prevent that kind of > corruption, right? Yes, you are right, I got confused. If the user specified the correct max, then this would have never happened. Never mind. > > [...]