If you call these functions, you do not necessarily need to dynamically allocate memory. If you just pass in a sufficiently large buffer there is no problem. E.g. if you know you are retrieving a path you can declare a buffer on the stack that can contain the largest path supported by the file system.

If you don't know the size of buffer you need, you pass in a null buffer, and allocate a buffer of the size the return value indicates (this is what br -objects does in this branch). 

We could allocate a buffer for every string returned, which is workable but means the string is always dynamically allocated, and we (the OpenBR library) cannot manage the memory in a safe way (since we don't know the scope in which it is being used).
I don't care for this at all, it forces every use of these functions to deal with dynamically allocated memory which is undesirable since careless use of the functions will cause memory leaks, and from a performance perspective since it means the buffers always have to be re-allocated, when the calling program could otherwise re-use a buffer if they wanted.