This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] BFD: Don't crash if the size of a reloc is 3.


* bfd/libbfd.c (bfd_get_24): New function.
* bfd/libbfd.c (bfd_put_24): New function.
* bfd/bfd-in2.h: regen.
* bfd/reloc.c (_bfd_clear_contents): Deal with the case when reloc size is 3
---
 bfd/bfd-in2.h | 23 +++++++++++++++++++++++
 bfd/libbfd.c  | 23 +++++++++++++++++++++++
 bfd/reloc.c   |  6 ++++++
 3 files changed, 52 insertions(+)

diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 93745bd..1b74872 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1160,6 +1160,29 @@ char *bfd_follow_build_id_debuglink (bfd *abfd, const char *dir);
 #define bfd_get_signed_16(abfd, ptr) \
   BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
 
+#define bfd_put_24(abfd, val, ptr) \
+do \
+{ \
+if (bfd_big_endian ((abfd))) \
+{ \
+  bfd_put_8 ((abfd), (val) >> 0,  (ptr) + 2); \
+  bfd_put_8 ((abfd), (val) >> 8,  (ptr) + 1); \
+  bfd_put_8 ((abfd), (val) >> 16, (ptr) + 0); \
+} \
+else \
+{ \
+  bfd_put_8 ((abfd), (val) >> 0,  (ptr) + 0); \
+  bfd_put_8 ((abfd), (val) >> 8,  (ptr) + 1); \
+  bfd_put_8 ((abfd), (val) >> 16, (ptr) + 2); \
+} \
+} \
+while (0)
+
+#define bfd_get_24(abfd, ptr) \
+  ((bfd_get_8 ((abfd), (ptr) + 0) << (bfd_big_endian ((abfd)) ? 16 : 0)) | \
+   (bfd_get_8 ((abfd), (ptr) + 1) << 8) | \
+   (bfd_get_8 ((abfd), (ptr) + 2) << (bfd_big_endian ((abfd)) ? 0 : 16))) \
+
 #define bfd_put_32(abfd, val, ptr) \
   BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
 #define bfd_put_signed_32 \
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
index 971be4f..d31a2dc 100644
--- a/bfd/libbfd.c
+++ b/bfd/libbfd.c
@@ -458,6 +458,29 @@ DESCRIPTION
 .#define bfd_get_signed_16(abfd, ptr) \
 .  BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
 .
+.#define bfd_put_24(abfd, val, ptr) \
+.do \
+.{ \
+.if (bfd_big_endian ((abfd))) \
+.{ \
+.  bfd_put_8 ((abfd), (val) >> 0,  (ptr) + 2); \
+.  bfd_put_8 ((abfd), (val) >> 8,  (ptr) + 1); \
+.  bfd_put_8 ((abfd), (val) >> 16, (ptr) + 0); \
+.} \
+.else \
+.{ \
+.  bfd_put_8 ((abfd), (val) >> 0,  (ptr) + 0); \
+.  bfd_put_8 ((abfd), (val) >> 8,  (ptr) + 1); \
+.  bfd_put_8 ((abfd), (val) >> 16, (ptr) + 2); \
+.} \
+.} \
+.while (0)
+.
+.#define bfd_get_24(abfd, ptr) \
+.  ((bfd_get_8 ((abfd), (ptr) + 0) << (bfd_big_endian ((abfd)) ? 16 : 0)) | \
+.   (bfd_get_8 ((abfd), (ptr) + 1) << 8) | \
+.   (bfd_get_8 ((abfd), (ptr) + 2) << (bfd_big_endian ((abfd)) ? 0 : 16))) \
+.
 .#define bfd_put_32(abfd, val, ptr) \
 .  BFD_SEND (abfd, bfd_putx32, ((val),(ptr)))
 .#define bfd_put_signed_32 \
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 68bc8a8..535c43d 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -1636,6 +1636,9 @@ _bfd_clear_contents (reloc_howto_type *howto,
     case 2:
       x = bfd_get_16 (input_bfd, location);
       break;
+    case 3:
+      x = bfd_get_24 (input_bfd, location);
+      break;
     case 4:
       x = bfd_get_32 (input_bfd, location);
       break;
@@ -1670,6 +1673,9 @@ _bfd_clear_contents (reloc_howto_type *howto,
     case 2:
       bfd_put_16 (input_bfd, x, location);
       break;
+    case 3:
+      bfd_put_24 (input_bfd, x, location);
+      break;
     case 4:
       bfd_put_32 (input_bfd, x, location);
       break;
-- 
2.1.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]