Defensive programming like that is a very good idea especially for something network facing.
If you're sure it's always at most 46 bytes, make it 48 bytes and specify "#define BUD_MAX_HOST_IP_LEN (48)".
Very secure and compiler will probably replace those memcpys with a few SSE [1] instructions, because 48 is a multiply of 16.
Copying 48 bytes is always much faster than copying 1 byte with a dynamic length argument for memcpy.
[1]: Like 6x MOVDQU instructions. Probably interleaved with the rest of the code to hide latency.