Не похоже, что вы выделяете TEMP достаточно большим
TEMP = malloc( sizeof(char)*( strlen(direntp->d_name) + 25 ) );
должно быть:
TEMP = malloc( sizeof(char)*( strlen(direntp->d_name)*3 + 25 + 1 ) );
Вы печатаете d_name три раза, и вам также необходим дополнительный байт для нулевого терминатора.
Аналогично, в этой строке:
f.name = malloc( sizeof(char)*( strlen(direntp->d_name)*2 + 3 ) );
должно быть
f.name = malloc( sizeof(char)*( strlen(direntp->d_name)*2 + 3 + 1) );
для учета нулевого терминатора.
Использование таких утверждений может помочь убедиться в правильности ваших расчетов:
int TEMP_size = strlen(direntp->d_name)*3 + 25 + 1;
TEMP = malloc(sizeof(char)*TEMP_size);
if ( TEMP == NULL ) {
perror("Malloc Error: ");
exit(1);
}
if ( sprintf(TEMP, "\n%s/%s.a: force\n\t$(MAKE) -C %s\n",direntp->d_name, direntp->d_name, direntp->d_name) < 0 ) {
perror("Sprintf Error: ");
exit(1);
}
assert(strlen(TEMP)+1==TEMP_size);