У вас есть два варианта: один, передать char * в somefunction и использовать его вместо распределения внутри somefunction, или два, освободить возвращаемое значение позже.
Первый вариант:
char *somefunction(char *str, int somearg){
//some code
return str;
}
// Elsewhere...
char *str = (char *) malloc....;
somefunction(str, 123);
// Code...
free(str);
Второй вариант:
char *somestr = somefunction(123);
// Do something...
free(somestr);
Я лично предлагаю первый вариант, так как немного легче избежать утечки памяти, когда она не выделяется в произвольных функциях.