owns the surface and should call cairo.surface.Surface.destroy when done with it.
This function always returns a valid pointer, but it will return a pointer to a "nil" surface if an error such as out of memory occurs. You can use cairo.surface.Surface.status to check for this.