/* Grok the augmentation string and its data. */
const uint8_t *data = info->augmentation_data;
- for (const char *ap = info->augmentation; *ap != '\0'; ++ap)
+ const char *ap = info->augmentation;
+ /* If present, 'z' must be the first char. */
+ if (*ap == 'z')
+ {
+ cie->sized_augmentation_data = true;
+ ap++;
+ }
+ for (; *ap != '\0'; ++ap)
{
uint8_t encoding;
switch (*ap)
{
- case 'z':
- cie->sized_augmentation_data = true;
- continue;
-
case 'S':
cie->signal_frame = true;
continue;
case 'L': /* LSDA pointer encoding byte. */
- cie->lsda_encoding = *data++;
+ if (cie->sized_augmentation_data)
+ cie->lsda_encoding = *data++;
if (!cie->sized_augmentation_data)
cie->fde_augmentation_data_size
+= encoded_value_size (&cache->data->d, cache->e_ident,
continue;
case 'R': /* FDE address encoding byte. */
- cie->fde_encoding = *data++;
+ if (cie->sized_augmentation_data)
+ cie->fde_encoding = *data++;
continue;
case 'P': /* Skip personality routine. */
- encoding = *data++;
- data += encoded_value_size (&cache->data->d, cache->e_ident,
- encoding, data);
+ if (cie->sized_augmentation_data)
+ {
+ encoding = *data++;
+ data += encoded_value_size (&cache->data->d, cache->e_ident,
+ encoding, data);
+ }
continue;
default: