On 10/24/07, Kees Bakker <[EMAIL PROTECTED]> wrote:
>
> Hi guys,
>
> On my system transcode gives a segfault when export to dv.
> After analyzing the problem I found to cause to be here:
>
> static unsigned char *bufalloc(size_t size)
> {
>
> #ifdef HAVE_GETPAGESIZE
>    long buffer_align=getpagesize();
> #else
>    long buffer_align=0;
> #endif
>
>    char *buf = malloc(size + buffer_align);
>
>    long adjust;
>
>    if (buf == NULL) {
>        fprintf(stderr, "(%s) out of memory", __FILE__);
>    }
>
>    adjust = buffer_align - ((long) buf) % buffer_align;
>
>    if (adjust == buffer_align)
>       adjust = 0;
>
>    return (unsigned char *) (buf + adjust);
> }
>
> Notice the "((long) buf) % buffer_align". On my system it
> turns out that buf is in the high range, something like:
>    0xb2c2c008
> with the result that 'adjust' becomes 0x1ff8. And so the result
> of bufalloc is misalligned AND too far into the buffer.
> Next libdv will crash inside memset somewhere.
>
> The solution is to use unsigned long. Here is a small patch
> (hoping it survives the email).
>
> Greetings, Kees Bakker
>
> diff -ru transcode-1.0.4.orig/export/export_dv.c transcode-1.0.4
> /export/export_dv.c
> --- transcode-1.0.4.orig/export/export_dv.c  2007-10-23 
> 17:06:24.000000000+0200
> +++ transcode-1.0.4/export/export_dv.c  2005-07-04 09:23:00.000000000+0200
> @@ -61,13 +61,13 @@
>
>     char *buf = malloc(size + buffer_align);
>
> -   long adjust;
> +   unsigned long adjust;
>
>     if (buf == NULL) {
>         fprintf(stderr, "(%s) out of memory", __FILE__);
>     }
>
> -   adjust = buffer_align - ((long) buf) % buffer_align;
> +   adjust = buffer_align - ((unsigned long) buf) % buffer_align;
>
>     if (adjust == buffer_align)
>        adjust = 0;
>
>

ack
expect followup discussion as soon as is possible

Reply via email to