aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2020-06-03 17:31:44 +0100
committerNick Alcock <nick.alcock@oracle.com>2020-07-22 17:57:54 +0100
commitec388c16cd4217a64907e4e133d2102cc4fe608a (patch)
treeb2843ad6885d24e75b5351487b008fe2598fa3d0
parent67d4cc671b7b3c49f748546a510005333fcbc465 (diff)
downloadbinutils-ec388c16cd4217a64907e4e133d2102cc4fe608a.zip
binutils-ec388c16cd4217a64907e4e133d2102cc4fe608a.tar.gz
binutils-ec388c16cd4217a64907e4e133d2102cc4fe608a.tar.bz2
libctf: error out on corrupt CTF with invalid header flags
If corrupt CTF with invalid header flags is passed in, return the new error ECTF_FLAGS. include/ * ctf-api.h (ECTF_FLAGS): New. (ECTF_NERR): Adjust. * ctf.h (CTF_F_MAX): New. libctf/ * ctf-open.c (ctf_bufopen_internal): Diagnose invalid flags.
-rw-r--r--include/ChangeLog6
-rw-r--r--include/ctf-api.h5
-rw-r--r--include/ctf.h3
-rw-r--r--libctf/ChangeLog4
-rw-r--r--libctf/ctf-open.c3
5 files changed, 18 insertions, 3 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 9f47c8b..8a48d00 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,5 +1,11 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-api.h (ECTF_FLAGS): New.
+ (ECTF_NERR): Adjust.
+ * ctf.h (CTF_F_MAX): New.
+
+2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-api.h (ECTF_NEXT_END): New error.
(ECTF_NEXT_WRONGFUN): Likewise.
(ECTF_NEXT_WRONGFP): Likewise.
diff --git a/include/ctf-api.h b/include/ctf-api.h
index 47a1f73..760b1e4 100644
--- a/include/ctf-api.h
+++ b/include/ctf-api.h
@@ -207,10 +207,11 @@ enum
ECTF_NONREPRESENTABLE, /* Type not representable in CTF. */
ECTF_NEXT_END, /* End of iteration. */
ECTF_NEXT_WRONGFUN, /* Wrong iteration function called. */
- ECTF_NEXT_WRONGFP /* Iteration entity changed in mid-iterate. */
+ ECTF_NEXT_WRONGFP, /* Iteration entity changed in mid-iterate. */
+ ECTF_FLAGS /* CTF header contains flags unknown to libctf. */
};
-#define ECTF_NERR (ECTF_NEXT_WRONGFP - ECTF_BASE + 1) /* Count of CTF errors. */
+#define ECTF_NERR (ECTF_FLAGS - ECTF_BASE + 1) /* Count of CTF errors. */
/* The CTF data model is inferred to be the caller's data model or the data
model of the given object, unless ctf_setmodel() is explicitly called. */
diff --git a/include/ctf.h b/include/ctf.h
index 168092b..f251759 100644
--- a/include/ctf.h
+++ b/include/ctf.h
@@ -199,7 +199,8 @@ typedef struct ctf_header
#define CTF_VERSION_3 4
#define CTF_VERSION CTF_VERSION_3 /* Current version. */
-#define CTF_F_COMPRESS 0x1 /* Data buffer is compressed by libctf. */
+#define CTF_F_COMPRESS 0x1 /* Data buffer is compressed by libctf. */
+#define CTF_F_MAX CTF_F_COMPRESS /* The greatest flag value in use. */
typedef struct ctf_lblent
{
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 4a10f63..45caf21 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,9 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-open.c (ctf_bufopen_internal): Diagnose invalid flags.
+
+2020-07-22 Nick Alcock <nick.alcock@oracle.com>
+
ctf-decls.h (ctf_qsort_compar_thunk): Fix arg passing.
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
diff --git a/libctf/ctf-open.c b/libctf/ctf-open.c
index b7846bd..f8eeaab 100644
--- a/libctf/ctf-open.c
+++ b/libctf/ctf-open.c
@@ -1384,6 +1384,9 @@ ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
if (pp->ctp_version < CTF_VERSION_3)
hdrsz = sizeof (ctf_header_v2_t);
+ if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
+ return (ctf_set_open_errno (errp, ECTF_FLAGS));
+
if (ctfsect->cts_size < hdrsz)
return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));