[FFmpeg-devel] [PATCH] libavcodec/zmbv.c: Don't modify const buffer

Benoit Fouet benoit.fouet
Tue Feb 17 14:31:00 CET 2009


On 02/17/2009 02:12 PM, Patrik Kullman wrote:
> On Tue, 2009-02-17 at 14:09 +0100, Benoit Fouet wrote:
>> Hi,
>>
>> On 02/17/2009 01:56 PM, Patrik Kullman wrote:
>>> Trying to solve this issue somewhere else than BSFs until that API is
>>> sorted out.
>>>
>>> Copy the const input buffer into the Zlib struct instead of using the
>>> same address.
>>>
>>> Prevents warning:
>>> libavcodec/zmbv.c: In function ?decode_frame?:
>>> libavcodec/zmbv.c:494: warning: assignment discards qualifiers from
>>> pointer target type
>>>
>>> After inflate() is complated, free next_in.
>>>   
>> well, IMHO, the zlib z_stream structure is lacking a const qualifier, we
>> shouldn't copy the input stream just to work that around.
>
> Well, from the zlib.h:
>
> <snip>
>   The detailed semantics are as follows. inflate performs one or both of the
>   following actions:
>
>   - Decompress more input starting at next_in and update next_in and avail_in
>     accordingly. If not all input can be processed (because there is not
>     enough room in the output buffer), next_in is updated and processing
>     will resume at this point for the next call of inflate().
> </snip>
>
> If next_in is updated I guess it shouldn't be a const?
>

well... next_in is modified... what you've put in next_in is not.
the data to which next_in points is never written, but only read.

you can do the following:

====><8====

#include <stdio.h>

struct foo {
    const char *bar;
};
static void func(struct foo *in)
{
    in->bar++;
}
int main(int argc, char *argv[])
{
    struct foo a = { .bar = argv[argc-1] };

    printf("%s\n", a.bar);
    func(&a);
    printf("%s\n", a.bar);

    return 0;
}

====8><====

Ben





More information about the ffmpeg-devel mailing list