sstrip: fix a section length corruption bug (patch from #6847)
[openwrt-10.03/.git] / tools / sstrip / src / sstrip.c
index 60c12c972c8ef2979beaac73486ce4d23ff763c0..0508aaac81ec0a48ba524b444eaa368444ff2620 100644 (file)
 #include       <fcntl.h>
 #include       <elf.h>
 
-#ifdef __FreeBSD__
-/**
- * This seems to work on FreeBSD 5.3, should
- * work on all newer versions as well. I have
- * no idea if it will work on versions < 5.3
- *
- * Joe Estock (guru) <jestock at nutextonline.com>
- */
-#include <sys/endian.h>
-#define bswap_64 __bswap64
-#define bswap_32 __bswap32
-#define bswap_16 __bswap16
-#elif defined(__APPLE__)
-#include       <machine/endian.h>
-#include       <machine/byte_order.h>
-#define __BYTE_ORDER BYTE_ORDER
-#define __BIG_ENDIAN BIG_ENDIAN
-#define bswap_16(x) NXSwapShort(x)
-#define bswap_32(x) NXSwapInt(x)
-#define bswap_64(x) NXSwapLongLong(x)
-#else
-#include       <endian.h>
-#include       <byteswap.h>
-#endif 
-
-
 #ifndef TRUE
 #define        TRUE            1
 #define        FALSE           0
@@ -277,8 +251,7 @@ static int modifyheaders ## CLASS (Elf ## CLASS ## _Ehdr *ehdr, \
                        ESET(phdr->p_offset,newsize); \
                        ESET(phdr->p_filesz,0); \
                } else if (EGET(phdr->p_offset) + EGET(phdr->p_filesz) > newsize) { \
-                       newsize -= EGET(phdr->p_offset); \
-                       ESET(phdr->p_filesz, newsize); \
+                       ESET(phdr->p_filesz, newsize - EGET(phdr->p_offset)); \
                } \
        } \
  \