diff options
Diffstat (limited to 'libelf/note_xlate.h')
| -rw-r--r-- | libelf/note_xlate.h | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/libelf/note_xlate.h b/libelf/note_xlate.h index bc9950ff..7e2784b0 100644 --- a/libelf/note_xlate.h +++ b/libelf/note_xlate.h @@ -47,13 +47,25 @@ elf_cvt_note (void *dest, const void *src, size_t len, int encode, note_len += n->n_namesz; note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); if (note_len > len || note_len < sizeof *n) - break; + { + /* Header was translated, nothing else. */ + len -= sizeof *n; + src += sizeof *n; + dest += sizeof *n; + break; + } /* data as a whole needs to be aligned. */ note_len += n->n_descsz; note_len = nhdr8 ? NOTE_ALIGN8 (note_len) : NOTE_ALIGN4 (note_len); if (note_len > len || note_len < sizeof *n) - break; + { + /* Header was translated, nothing else. */ + len -= sizeof *n; + src += sizeof *n; + dest += sizeof *n; + break; + } /* Copy or skip the note data. */ size_t note_data_len = note_len - sizeof *n; |
