Das war zwar meine erste idee aber in deinem code segment verwendest du kein strlen auf data. das ist in der Funktion fifo_push aber nicht in der fifo_pop.

Wenn es läuft dann ist ja gut.

if(memcpy(data, fifo->data, fifo->fragment.size))

Damit kopierst du die fifo->fragment.size nach data wenn jetzt Data nur ein BYTE ist dann darf fragment.size nie grösser sein als 1. das war das was ich meinte.

wichtig währe in meinen augen halt das man variablen intialiseirt dann währe nämlich im zweiten beispiel das selbe passiert.

int8_t data = 0xFF;

int8_t *data = (int8_t*) malloc(1);
(*data) = 0xFF;

Erst jetzt hätte bei variablen den selben Inhalt.

Gruß