comparison dyncall/dyncall_aggregate.c @ 551:eef302b7a58d

- amendment fix for buffer overflow (see commit 0455834d29a1), to also handle non-standard struct packing, + better asserts - changelog wording tweaks for clarity - comment tweaks for clarity - (mostly pointless) microoptimization in aggr alignment calculation, avoiding a modulo, as alignment always a power of 2 - cleanups
author Tassilo Philipp
date Mon, 20 Jun 2022 14:57:49 +0200
parents ba70fb631bea
children 1539ebfabebb
comparison
equal deleted inserted replaced
550:5e1002095afa 551:eef302b7a58d
82 va_start(ap, array_len); 82 va_start(ap, array_len);
83 f->sub_aggr = va_arg(ap, const DCaggr*); 83 f->sub_aggr = va_arg(ap, const DCaggr*);
84 va_end(ap); 84 va_end(ap);
85 85
86 f->size = f->sub_aggr->size; 86 f->size = f->sub_aggr->size;
87 f->alignment = f->sub_aggr->alignment; 87 f->alignment = f->sub_aggr->alignment; /* field inherit's sub aggrs alignment*/
88 break; 88 break;
89 } 89 }
90 default: 90 default:
91 assert(0); 91 assert(0);
92 } 92 }
93 93
94 if(type != DC_SIGCHAR_AGGREGATE) 94 if(type != DC_SIGCHAR_AGGREGATE)
95 f->alignment = f->size; 95 f->alignment = f->size;
96 96
97 /* aggr's field alignment is relative largest field size */ 97 /* aggr's field alignment is relative to largest field size */
98 if(ag->alignment < f->alignment) 98 if(ag->alignment < f->alignment)
99 ag->alignment = f->alignment; 99 ag->alignment = f->alignment;
100 } 100 }
101 101
102 102