Skip to content

[base] Always close user provided stream

FT_Open_Face documentation states "If FT_OPEN_STREAM is set in args->flags, the stream in args->stream is automatically closed before this function returns any error (including FT_Err_Invalid_Argument)." However, if the user provides a stream in args.stream with FT_OPEN_STREAM set and a close function but then for some reason passes NULL for aface and a non-negative face_index the error Invalid_Argument is returned but the close callback will not be called on the user provided stream. This may cause resource leaks if the caller is depending on the close callback to free resources.

The difficulty is that a user may fill out a FT_StreamRec and pass its address as args.stream, but the stream isn't really "live" until FT_Stream_New is called on it (and the memory is set). In particular, it cannot really be cleaned up properly in ft_open_face_internal until the stream pointer has been copied into the stream local variable.

  • src/base/ftobj.c (ft_open_face_internal): ensure user provided args.stream.close is called even with early errors

Merge request reports