Message ID | 20190116181119.96117-1-sdf@google.com |
---|---|
State | Changes Requested |
Delegated to: | BPF Maintainers |
Headers | show |
Series | [bpf,v2,1/3] bpf: don't assume build-id length is always 20 bytes | expand |
> On Jan 16, 2019, at 10:11 AM, Stanislav Fomichev <sdf@google.com> wrote: > > Build-id length is not fixed to 20, it can be (`man ld` /--build-id): > * 128-bit (uuid) > * 160-bit (sha1) > * any length specified in ld --build-id=0xhexstring > > To fix the issue of missing BPF_STACK_BUILD_ID_VALID for shorter build-ids, > assume that build-id is somewhere in the range of 1 .. 20. > Set the remaining bytes to zero. > > v2: > * don't introduce new "len = min(BPF_BUILD_ID_SIZE, nhdr->n_descsz)", > we already know that nhdr->n_descsz <= BPF_BUILD_ID_SIZE if we enter > this 'if' condition > > Fixes: 615755a77b24 ("bpf: extend stackmap to save binary_build_id+offset instead of address") > Signed-off-by: Stanislav Fomichev <sdf@google.com> Acked-by: Song Liu <songliubraving@fb.com> > --- > kernel/bpf/stackmap.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c > index d9e2483669d0..f9df545e92f6 100644 > --- a/kernel/bpf/stackmap.c > +++ b/kernel/bpf/stackmap.c > @@ -180,11 +180,14 @@ static inline int stack_map_parse_build_id(void *page_addr, > > if (nhdr->n_type == BPF_BUILD_ID && > nhdr->n_namesz == sizeof("GNU") && > - nhdr->n_descsz == BPF_BUILD_ID_SIZE) { > + nhdr->n_descsz > 0 && > + nhdr->n_descsz <= BPF_BUILD_ID_SIZE) { > memcpy(build_id, > note_start + note_offs + > ALIGN(sizeof("GNU"), 4) + sizeof(Elf32_Nhdr), > - BPF_BUILD_ID_SIZE); > + nhdr->n_descsz); > + memset(build_id + nhdr->n_descsz, 0, > + BPF_BUILD_ID_SIZE - nhdr->n_descsz); > return 0; > } > new_offs = note_offs + sizeof(Elf32_Nhdr) + > -- > 2.20.1.97.g81188d93c3-goog >
On 01/16/2019 07:11 PM, Stanislav Fomichev wrote: > Build-id length is not fixed to 20, it can be (`man ld` /--build-id): > * 128-bit (uuid) > * 160-bit (sha1) > * any length specified in ld --build-id=0xhexstring > > To fix the issue of missing BPF_STACK_BUILD_ID_VALID for shorter build-ids, > assume that build-id is somewhere in the range of 1 .. 20. > Set the remaining bytes to zero. > > v2: > * don't introduce new "len = min(BPF_BUILD_ID_SIZE, nhdr->n_descsz)", > we already know that nhdr->n_descsz <= BPF_BUILD_ID_SIZE if we enter > this 'if' condition > > Fixes: 615755a77b24 ("bpf: extend stackmap to save binary_build_id+offset instead of address") > Signed-off-by: Stanislav Fomichev <sdf@google.com> Hmm, looks like rest of the v2 series didn't make it to the list. Please double check; just in case simply resend the full v2 set so it properly ends up in patchwork. Thanks, Daniel
On 01/16, Daniel Borkmann wrote: > On 01/16/2019 07:11 PM, Stanislav Fomichev wrote: > > Build-id length is not fixed to 20, it can be (`man ld` /--build-id): > > * 128-bit (uuid) > > * 160-bit (sha1) > > * any length specified in ld --build-id=0xhexstring > > > > To fix the issue of missing BPF_STACK_BUILD_ID_VALID for shorter build-ids, > > assume that build-id is somewhere in the range of 1 .. 20. > > Set the remaining bytes to zero. > > > > v2: > > * don't introduce new "len = min(BPF_BUILD_ID_SIZE, nhdr->n_descsz)", > > we already know that nhdr->n_descsz <= BPF_BUILD_ID_SIZE if we enter > > this 'if' condition > > > > Fixes: 615755a77b24 ("bpf: extend stackmap to save binary_build_id+offset instead of address") > > Signed-off-by: Stanislav Fomichev <sdf@google.com> > > Hmm, looks like rest of the v2 series didn't make it to the list. > Please double check; just in case simply resend the full v2 set so > it properly ends up in patchwork. Oh, I didn't send the first two patches because I didn't change them, I'll resend full v2 series in a moment. > > Thanks, > Daniel
diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index d9e2483669d0..f9df545e92f6 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -180,11 +180,14 @@ static inline int stack_map_parse_build_id(void *page_addr, if (nhdr->n_type == BPF_BUILD_ID && nhdr->n_namesz == sizeof("GNU") && - nhdr->n_descsz == BPF_BUILD_ID_SIZE) { + nhdr->n_descsz > 0 && + nhdr->n_descsz <= BPF_BUILD_ID_SIZE) { memcpy(build_id, note_start + note_offs + ALIGN(sizeof("GNU"), 4) + sizeof(Elf32_Nhdr), - BPF_BUILD_ID_SIZE); + nhdr->n_descsz); + memset(build_id + nhdr->n_descsz, 0, + BPF_BUILD_ID_SIZE - nhdr->n_descsz); return 0; } new_offs = note_offs + sizeof(Elf32_Nhdr) +
Build-id length is not fixed to 20, it can be (`man ld` /--build-id): * 128-bit (uuid) * 160-bit (sha1) * any length specified in ld --build-id=0xhexstring To fix the issue of missing BPF_STACK_BUILD_ID_VALID for shorter build-ids, assume that build-id is somewhere in the range of 1 .. 20. Set the remaining bytes to zero. v2: * don't introduce new "len = min(BPF_BUILD_ID_SIZE, nhdr->n_descsz)", we already know that nhdr->n_descsz <= BPF_BUILD_ID_SIZE if we enter this 'if' condition Fixes: 615755a77b24 ("bpf: extend stackmap to save binary_build_id+offset instead of address") Signed-off-by: Stanislav Fomichev <sdf@google.com> --- kernel/bpf/stackmap.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)