Значение read
не добавляет 0-терминатор .Таким образом, ваш внутренний while
, несомненно, выходит за пределы выделенной памяти:
while(*tbuf) *p++ = *tbuf++;
Другая проблема заключается в том, что вы освобождаете то, что не получили через malloc.К тому времени, когда вы звоните бесплатно, вы увеличиваете как p
, так и tbuff
, которые вы пытаетесь освободить.
Весь процесс выделения buffer
выглядит бесполезным, поскольку вы его фактически нигде не используете.