Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] MpegEncContext->class is never initialized
@ 2025-03-04 21:55 John Dorian
  2025-03-04 22:03 ` Andreas Rheinhardt
  2025-03-04 22:36 ` Andreas Rheinhardt
  0 siblings, 2 replies; 5+ messages in thread
From: John Dorian @ 2025-03-04 21:55 UTC (permalink / raw)
  To: ffmpeg-devel

I discovered a crash here if log handler function tries to get the class
name from "s"

mpeg12dec.c:
if (get_bits_left(&s->gb) < 0) {
         av_log(s, AV_LOG_ERROR, "overread %d\n", -get_bits_left(&s->gb));
         return AVERROR_INVALIDDATA;
     }

And it seems to be because MpegEncContext->class is never initialized (or
rather it is initialized to 0) due to av_malloc_z() I assume.

So the question is, is it valid for any av object to have its av_class set
to 0.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] MpegEncContext->class is never initialized
  2025-03-04 21:55 [FFmpeg-devel] MpegEncContext->class is never initialized John Dorian
@ 2025-03-04 22:03 ` Andreas Rheinhardt
  2025-03-04 22:36 ` Andreas Rheinhardt
  1 sibling, 0 replies; 5+ messages in thread
From: Andreas Rheinhardt @ 2025-03-04 22:03 UTC (permalink / raw)
  To: ffmpeg-devel

John Dorian:
> I discovered a crash here if log handler function tries to get the class
> name from "s"
> 
> mpeg12dec.c:
> if (get_bits_left(&s->gb) < 0) {
>          av_log(s, AV_LOG_ERROR, "overread %d\n", -get_bits_left(&s->gb));
>          return AVERROR_INVALIDDATA;
>      }
> 
> And it seems to be because MpegEncContext->class is never initialized (or
> rather it is initialized to 0) due to av_malloc_z() I assume.
> 
> So the question is, is it valid for any av object to have its av_class set
> to 0.

Will send a fix shortly.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] MpegEncContext->class is never initialized
  2025-03-04 21:55 [FFmpeg-devel] MpegEncContext->class is never initialized John Dorian
  2025-03-04 22:03 ` Andreas Rheinhardt
@ 2025-03-04 22:36 ` Andreas Rheinhardt
  2025-03-05  3:21   ` John Dorian
  1 sibling, 1 reply; 5+ messages in thread
From: Andreas Rheinhardt @ 2025-03-04 22:36 UTC (permalink / raw)
  To: ffmpeg-devel

John Dorian:
> I discovered a crash here if log handler function tries to get the class
> name from "s"
> 
> mpeg12dec.c:
> if (get_bits_left(&s->gb) < 0) {
>          av_log(s, AV_LOG_ERROR, "overread %d\n", -get_bits_left(&s->gb));
>          return AVERROR_INVALIDDATA;
>      }
> 
> And it seems to be because MpegEncContext->class is never initialized (or
> rather it is initialized to 0) due to av_malloc_z() I assume.
> 
> So the question is, is it valid for any av object to have its av_class set
> to 0.

Here is the patch:
https://ffmpeg.org/pipermail/ffmpeg-devel/2025-March/340615.html
My reading of log.h is that it is illegal for the pointer to an AVClass
to be NULL. The default log callback handles this gracefully, so I
presume you are using a custom log callback.

- Andreas

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] MpegEncContext->class is never initialized
  2025-03-04 22:36 ` Andreas Rheinhardt
@ 2025-03-05  3:21   ` John Dorian
  2025-03-05  3:33     ` Andreas Rheinhardt
  0 siblings, 1 reply; 5+ messages in thread
From: John Dorian @ 2025-03-05  3:21 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Yes, I have a custom log callback. I have multiple files open and I'd like
to associate logged errors with the correct file, which I am doing through
the objects that have an "opaque" member (not all, but most do). I don't
think this is any abuse of the API as it does state that the first member
of a struct passed through av_log should be AVClass*.

The solution for now is to check for a null pointer e.g. in the log
callback, "if ((AVClass**)ptr[0])==NULL)" The helper log functions such as
av_default_item_name() do not have this check, perhaps that is the real
problem here.

I'm not so sure it is required to be non-null given that the features of
AVClass may not be useful to every object, e.g. options and such may not be
appropriate for private objects.


On Tue, Mar 4, 2025 at 4:36 PM Andreas Rheinhardt <
andreas.rheinhardt@outlook.com> wrote:

> John Dorian:
> > I discovered a crash here if log handler function tries to get the class
> > name from "s"
> >
> > mpeg12dec.c:
> > if (get_bits_left(&s->gb) < 0) {
> >          av_log(s, AV_LOG_ERROR, "overread %d\n",
> -get_bits_left(&s->gb));
> >          return AVERROR_INVALIDDATA;
> >      }
> >
> > And it seems to be because MpegEncContext->class is never initialized (or
> > rather it is initialized to 0) due to av_malloc_z() I assume.
> >
> > So the question is, is it valid for any av object to have its av_class
> set
> > to 0.
>
> Here is the patch:
> https://ffmpeg.org/pipermail/ffmpeg-devel/2025-March/340615.html
> My reading of log.h is that it is illegal for the pointer to an AVClass
> to be NULL. The default log callback handles this gracefully, so I
> presume you are using a custom log callback.
>
> - Andreas
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] MpegEncContext->class is never initialized
  2025-03-05  3:21   ` John Dorian
@ 2025-03-05  3:33     ` Andreas Rheinhardt
  0 siblings, 0 replies; 5+ messages in thread
From: Andreas Rheinhardt @ 2025-03-05  3:33 UTC (permalink / raw)
  To: ffmpeg-devel

John Dorian:
> Yes, I have a custom log callback. I have multiple files open and I'd like
> to associate logged errors with the correct file, which I am doing through
> the objects that have an "opaque" member (not all, but most do). I don't
> think this is any abuse of the API as it does state that the first member
> of a struct passed through av_log should be AVClass*.
> 

I meant: We (as in the libavcodec library/the FFmpeg project) don't
abide by our own APIs when we pass objects with a NULL AVClass* to av_log().

> The solution for now is to check for a null pointer e.g. in the log
> callback, "if ((AVClass**)ptr[0])==NULL)" The helper log functions such as
> av_default_item_name() do not have this check, perhaps that is the real
> problem here.
> 

Here is how the default log callback handles this:
    AVClass* avc = avcl ? *(AVClass **) avcl : NULL;
Further down the case of no object and an object with AVClass* set to
NULL are therefore handled the same.

> I'm not so sure it is required to be non-null given that the features of
> AVClass may not be useful to every object, e.g. options and such may not be
> appropriate for private objects.
> 

If no AVClass* is set, then this object should not be used with the
av_log API.

> 
> On Tue, Mar 4, 2025 at 4:36 PM Andreas Rheinhardt <
> andreas.rheinhardt@outlook.com> wrote:
> 
>> John Dorian:
>>> I discovered a crash here if log handler function tries to get the class
>>> name from "s"
>>>
>>> mpeg12dec.c:
>>> if (get_bits_left(&s->gb) < 0) {
>>>          av_log(s, AV_LOG_ERROR, "overread %d\n",
>> -get_bits_left(&s->gb));
>>>          return AVERROR_INVALIDDATA;
>>>      }
>>>
>>> And it seems to be because MpegEncContext->class is never initialized (or
>>> rather it is initialized to 0) due to av_malloc_z() I assume.
>>>
>>> So the question is, is it valid for any av object to have its av_class
>> set
>>> to 0.
>>
>> Here is the patch:
>> https://ffmpeg.org/pipermail/ffmpeg-devel/2025-March/340615.html
>> My reading of log.h is that it is illegal for the pointer to an AVClass
>> to be NULL. The default log callback handles this gracefully, so I
>> presume you are using a custom log callback.
>>
>> - Andreas
>>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-03-05  3:34 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-04 21:55 [FFmpeg-devel] MpegEncContext->class is never initialized John Dorian
2025-03-04 22:03 ` Andreas Rheinhardt
2025-03-04 22:36 ` Andreas Rheinhardt
2025-03-05  3:21   ` John Dorian
2025-03-05  3:33     ` Andreas Rheinhardt

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git