[PATCH 0/2] MR616: winegstreamer: Always check the return value from mf_media_type_from_wg_format().
mf_media_type_from_wg_format() may return NULL. Fix Airborne Kingdom crash at start because WG_AUDIO_FORMAT_UNKNOWN is passed to mf_media_type_from_wg_format(). Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/616
From: Zhiyi Zhang <zzhang(a)codeweavers.com> mf_media_type_from_wg_format() may return NULL. Fix Airborne Kingdom crash at start because WG_AUDIO_FORMAT_UNKNOWN is passed to mf_media_type_from_wg_format(). Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/winegstreamer/media_source.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index f07b83f413e..5961097b643 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -879,6 +879,9 @@ static HRESULT media_stream_init_desc(struct media_stream *stream) IMFMediaType *base_type = mf_media_type_from_wg_format(&format); GUID base_subtype; + if (!base_type) + goto done; + IMFMediaType_GetGUID(base_type, &MF_MT_SUBTYPE, &base_subtype); stream_types[0] = base_type; @@ -911,8 +914,8 @@ static HRESULT media_stream_init_desc(struct media_stream *stream) WG_AUDIO_FORMAT_F32LE, }; - stream_types[0] = mf_media_type_from_wg_format(&format); - type_count = 1; + if ((stream_types[0] = mf_media_type_from_wg_format(&format))) + type_count = 1; for (i = 0; i < ARRAY_SIZE(audio_types); i++) { @@ -921,7 +924,8 @@ static HRESULT media_stream_init_desc(struct media_stream *stream) continue; new_format = format; new_format.u.audio.format = audio_types[i]; - stream_types[type_count++] = mf_media_type_from_wg_format(&new_format); + if ((stream_types[type_count] = mf_media_type_from_wg_format(&new_format))) + type_count++; } } else -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/616
On 8/9/22 08:36, Zhiyi Zhang wrote:
mf_media_type_from_wg_format() may return NULL.
Fix Airborne Kingdom crash at start because WG_AUDIO_FORMAT_UNKNOWN is passed to mf_media_type_from_wg_format().
This patch is probably a good idea regardless, but it also leads me to ask: what format does the file actually have, and should we translate that into Win32 type information?
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index f07b83f413e..5961097b643 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -879,6 +879,9 @@ static HRESULT media_stream_init_desc(struct media_stream *stream) IMFMediaType *base_type = mf_media_type_from_wg_format(&format); GUID base_subtype;
+ if (!base_type) + goto done; + IMFMediaType_GetGUID(base_type, &MF_MT_SUBTYPE, &base_subtype);
stream_types[0] = base_type;
This will return an uninitialized "hr".
From: Zhiyi Zhang <zzhang(a)codeweavers.com> Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/winegstreamer/mfplat.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c index 55f9ae6323d..7d2ec634248 100644 --- a/dlls/winegstreamer/mfplat.c +++ b/dlls/winegstreamer/mfplat.c @@ -483,6 +483,8 @@ static IMFMediaType *mf_media_type_from_wg_format_video(const struct wg_format * IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) { + IMFMediaType *type = NULL; + switch (format->major_type) { case WG_MAJOR_TYPE_H264: @@ -491,17 +493,24 @@ IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) FIXME("Format %u not implemented!\n", format->major_type); /* fallthrough */ case WG_MAJOR_TYPE_UNKNOWN: - return NULL; + break; case WG_MAJOR_TYPE_AUDIO: - return mf_media_type_from_wg_format_audio(format); + type = mf_media_type_from_wg_format_audio(format); + break; case WG_MAJOR_TYPE_VIDEO: - return mf_media_type_from_wg_format_video(format); + type = mf_media_type_from_wg_format_video(format); + break; + + default: + assert(0); + break; } - assert(0); - return NULL; + if (!type) + WARN("Failed to get media type! wg_format major type %d.", format->major_type); + return type; } static void mf_media_type_to_wg_format_audio(IMFMediaType *type, const GUID *subtype, struct wg_format *format) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/616
On 8/9/22 08:36, Zhiyi Zhang wrote:
- assert(0); - return NULL; + if (!type) + WARN("Failed to get media type! wg_format major type %d.", format->major_type); + return type; }
Just a suggestion, but you might want to push this out to leaf functions; that allows you to be more specific about the mode of failure (e.g. "unknown video format %#x"). I do think this should be a FIXME, not just a WARN.
participants (3)
-
Zebediah Figura (she/her) -
Zhiyi Zhang -
Zhiyi Zhang (@zhiyi)