32bit ELF can only represent up to UINT32_MAX bytes in d_size. Sanity
check that the uncompressed size isn't bigger so we don't silently
truncate it.

        * libelf/elf_compress_gnu.c (elf_compress_gnu): Check gsize
        fits UINT32_MAX for ELFCLASS32.

Signed-off-by: Mark Wielaard <[email protected]>
---
 libelf/elf_compress_gnu.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/libelf/elf_compress_gnu.c b/libelf/elf_compress_gnu.c
index 006e2ae4126d..a9fff07edc2d 100644
--- a/libelf/elf_compress_gnu.c
+++ b/libelf/elf_compress_gnu.c
@@ -168,8 +168,11 @@ elf_compress_gnu (Elf_Scn *scn, int inflate, unsigned int 
flags)
       /* One more sanity check, size should be bigger than original
         data size plus some overhead (4 chars ZLIB + 8 bytes size + 6
         bytes zlib stream overhead + 5 bytes overhead max for one 16K
-        block) and should fit into a size_t.  */
-      if (gsize + 4 + 8 + 6 + 5 < data->d_size || gsize > SIZE_MAX)
+        block) and should fit into a size_t (or in UINT32_MAX for
+        32bit ELF).  */
+      if (gsize + 4 + 8 + 6 + 5 < data->d_size
+         || gsize > SIZE_MAX
+         || (elfclass == ELFCLASS32 && gsize > UINT32_MAX))
        {
          __libelf_seterrno (ELF_E_NOT_COMPRESSED);
          return -1;
-- 
2.53.0

Reply via email to