+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.
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
+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
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:
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;
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));
{
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.