Still don't know what caused it but managed to resolve the error by changing from multiple allocations to a big allocation after calculating the need memory:
Code:
void* Setup64( segment_t *segv, u16 segments, u16 symbols, u16 headers, ... ) {
u16 size = 1, i = 0;
segment_t *ehead_seg = &segv[SEG_EHEAD];
segment_t *shead_seg = &segv[SEG_SHEAD];
segment_t *spool_seg = &segv[SEG_SPOOL];
segment_t *names_seg = &segv[SEG_NAMES];
segment_t *phead_seg = &segv[SEG_PHEAD];
segment_t *coded_seg = &segv[SEG_CODED];
segment_t *this, *prev;
char const *str = NULL;
char *pool;
va_list args;
va_start( args, headers );
str = va_arg( args, char const * );
while ( str ) {
segoffsetv[i] = strlen( str ) + 1;
size += segoffsetv[i++];
spool_seg->mem.upto++;
spool_seg->mem.used++;
str = va_arg( args, char const * );
} size += 1;
va_end( args );
ehead_seg->mem.size = sizeof(ehead64_t);
ehead_seg->mem.upto = ehead_seg->mem.used = 1;
shead_seg->mem.size = sizeof(shead64_t) * segments;
shead_seg->mem.upto = segments;
spool_seg->mem.size = size;
names_seg->mem.size = sizeof(named64_t) * symbols;
names_seg->mem.upto = symbols;
phead_seg->mem.size = sizeof(phead64_t) * headers;
phead_seg->mem.upto = headers;
coded_seg->mem.size = sizeof(begin_t);
coded_seg->mem.upto = coded_seg->mem.used = 1;
for ( i = 0, size = 0; i < SEG_COUNT; ++i ) {
size += segv[i].mem.size;
}
ehead_seg->mem.buff = calloc( 1, size );
if ( !ehead_seg->mem.buff ) return NULL;
for ( i = 1; i < SEG_COUNT; ++i ) {
prev = &segv[i-1];
this = &segv[i];
this->pos = prev->pos + prev->mem.size;
this->mem.buff = &(((char*)ehead_seg->mem.buff)[this->pos]);
}
va_start( args, headers );
str = va_arg( args, char const * );
pool = (char*)spool_seg->mem.buff;
i = 0;
while ( str ) {
strcpy( &pool[segoffsetv[i++]], str );
str = va_arg( args, char const * );
} size += 1;
va_end( args );
return ehead_seg->mem.buff;
}