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