aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ChangeLog5
-rw-r--r--include/ctf.h10
-rw-r--r--libctf/ChangeLog7
-rw-r--r--libctf/ctf-open.c18
4 files changed, 30 insertions, 10 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 8169b6a..81b6670 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-19 Nick Alcock <nick.alcock@oracle.com>
+
+ * ctf.h (ctf_slice_t): Make cts_offset and cts_bits unsigned
+ short, so following structures are properly aligned.
+
2019-06-14 Szabolcs Nagy <szabolcs.nagy@arm.com>
* elf/aarch64.h (R_AARCH64_P32_MOVW_PREL_G0): Define.
diff --git a/include/ctf.h b/include/ctf.h
index e99a673..2b35781 100644
--- a/include/ctf.h
+++ b/include/ctf.h
@@ -430,13 +430,17 @@ union
ctt_type, which must be a type which has an encoding (fp, int, or enum). We
also store the referenced type in here, because it is easier to keep the
ctt_size correct for the slice than to shuffle the size into here and keep
- the ctt_type where it is for other types. */
+ the ctt_type where it is for other types.
+
+ In a future version, where we loosen requirements on alignment in the CTF
+ file, the cts_offset and cts_bits will be chars: but for now they must be
+ shorts or everything after a slice will become unaligned. */
typedef struct ctf_slice
{
uint32_t cts_type;
- unsigned char cts_offset;
- unsigned char cts_bits;
+ unsigned short cts_offset;
+ unsigned short cts_bits;
} ctf_slice_t;
typedef struct ctf_array_v1
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index ad5685b..0d55ea0 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,12 @@
2019-06-19 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-open.c (get_vbytes_common): Return the new slice size.
+ (ctf_bufopen): Flip the endianness of the CTF-section header copy.
+ Remember to copy in the CTF data when opening an uncompressed
+ foreign-endian CTF file. Prune useless variable manipulation.
+
+2019-06-19 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-open.c (ctf_types): Fail when unidentified type kinds are
seen.
diff --git a/libctf/ctf-open.c b/libctf/ctf-open.c
index 14f7062..777a6b5 100644
--- a/libctf/ctf-open.c
+++ b/libctf/ctf-open.c
@@ -150,8 +150,7 @@ get_vbytes_common (unsigned short kind, ssize_t size _libctf_unused_,
case CTF_K_FLOAT:
return (sizeof (uint32_t));
case CTF_K_SLICE:
- return (offsetof (ctf_slice_t, cts_bits) +
- sizeof (((ctf_slice_t *)0)->cts_bits));
+ return (sizeof (ctf_slice_t));
case CTF_K_ENUM:
return (sizeof (ctf_enum_t) * vlen);
case CTF_K_FORWARD:
@@ -1208,7 +1207,7 @@ ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
const ctf_preamble_t *pp;
ctf_header_t hp;
ctf_file_t *fp;
- void *buf, *base;
+ void *base;
size_t size, hdrsz;
int foreign_endian = 0;
int err;
@@ -1317,6 +1316,7 @@ ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
uLongf dstlen;
const void *src;
int rc = Z_OK;
+ void *buf;
if ((base = ctf_alloc (size + hdrsz)) == NULL)
return (ctf_set_open_errno (errp, ECTF_ZALLOC));
@@ -1349,12 +1349,16 @@ ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
{
if ((base = ctf_alloc (size + hdrsz)) == NULL)
return (ctf_set_open_errno (errp, ECTF_ZALLOC));
+ memcpy (base, ctfsect->cts_data, size + hdrsz);
}
else
- {
- base = (void *) ctfsect->cts_data;
- buf = (unsigned char *) base + hdrsz;
- }
+ base = (void *) ctfsect->cts_data;
+
+ /* Flip the endianness of the copy of the header in the section, to avoid
+ ending up with a partially-endian-flipped file. */
+
+ if (foreign_endian)
+ flip_header ((ctf_header_t *) base);
/* Once we have uncompressed and validated the CTF data buffer, we can
proceed with allocating a ctf_file_t and initializing it.