allow using an existing buffer (for zero copy)