Долго не мог понять что не так. (увы нет компилятора под рукой)
В общем чисто "на глаз", если я не ошибся нигде:
Если вы делаете два вызова с буфером размера 3. (а реальная длинна строки 5), то втором вызове ваша функция вернет вам NULL и вы (вероятно) нигде это не проверяете (проверьте на всякий случай что я тут не ошибся)
Поясню - если буфер длиннее файла, то вы столкнувшись с тем что больше нечего читать т.е. при прочтении 0 байтов (а у вас их именно 0 будет прочитано, если файл кончился) возвращаете NULL вместо того, чтобы вернуть то, что смогли прочитать или еще что-нибудь сделать
И, к стати, допускаете утечку - вы под line выделили память, но в случае ошибки не очищаете ее и никуда не возвращаете.
см.
https://man7.org/linux/man-pages/man2/read.2.html
Ну и опустим тот момент что у вас строка будет распилена на несколько если не влезет в заданный размер буфера.
Как вариант читать строку пока не кончится, по мере исчерпания буфера вызывать realloc (например с шагом в BUFFER_SIZE). Если буфер будет чуть больше полученой строки это не трагедия (опять же, если вдруг все-таки трагедия - realloc в помощь).