Re: seeking for help on MNG creation

Sven Neumann <[email protected]> 31 Mar 2004 13:42:20 +0200
Newsgroups gmane.comp.graphics.mng.general
Message-ID <[email protected]>
Hi,

after some more reading of the spec, I came to the same conclusion
about the clipping coordinates as you suggested. Doing this change
seems to create a MNG file that crashes gmngview and mngtree :(

I checked with valgrind and gdb and it seems that I got my clipping
rectangle right since the code actually tries to render something and
crashes in these routines:

Starting program: /usr/local/bin/mngtree heart-opt.mng
 
Program received signal SIGSEGV, Segmentation fault.
0x40136c73 in mallopt () from /lib/tls/libc.so.6

(gdb) bt
#0  0x40136c73 in mallopt () from /lib/tls/libc.so.6
#1  0xffff583a in ?? ()
#2  0x40133ffe in _IO_do_write () from /lib/tls/libc.so.6
#3  0x40135aa0 in free () from /lib/tls/libc.so.6
#4  0x401f9aa0 in __after_morecore_hook () from /lib/tls/libc.so.6
#5  0x0804e3e8 in ?? ()
#6  0x40061150 in __DTOR_END__ () from /usr/local/lib/libmng.so.1
#7  0x00000001 in ?? ()
#8  0x0804a180 in ?? ()
#9  0x40041366 in mng_process_display_past (pData=0x804a180, iTargetid=3,
    iTargettype=0 '\0', iTargetx=0, iTargety=0, iCount=1, pSources=0x804eb58)
    at libmng_display.c:5607
#10 0x4002aea0 in mng_read_past (pData=0x804a180, pHeader=0xbffff4b8,
    iRawlen=41, pRawdata=0x804b504 "", ppChunk=0xbffff154)
    at libmng_chunk_io.c:3792
#11 0x4005dd0d in process_raw_chunk (pData=0x804a180, pBuf=0x804b504 "",
    iBuflen=41) at libmng_read.c:400
#12 0x4005e0b2 in read_chunk (pData=0x804a180) at libmng_read.c:552
#13 0x4005e3ff in mng_read_graphic (pData=0x804a180) at libmng_read.c:690
#14 0x40042cab in mng_read (hHandle=0x804a180) at libmng_hlapi.c:1584
#15 0x08048a1b in dumptree ()
#16 0x08048b70 in myclosestream ()

(gdb) up 9
#9  0x40041366 in mng_process_display_past (pData=0x804a180, iTargetid=3,
    iTargettype=0 '\0', iTargetx=0, iTargety=0, iCount=1, pSources=0x804eb58)
    at libmng_display.c:5607
5607        MNG_FREEX (pData, pData->pWorkrow, (pTargetimg->pImgbuf->iRowsize << 1))

(gdb) info locals
iTargetrowsize = 40
pBuf = 0x804d090
iSourceYinc = 1
iSourcerowsize = 210
bSourceRGBA16 = 0 '\0'
iTargetsamples = 10
bTargetRGBA16 = 0 '\0'
iSourceY = 1075813024
iSourcesamples = 70
iTargetY = 11
pData = 0x804e3e8
iTargetid = 3
iTargettype = 0 '\0'
iRetcode = 0
pTargetimg = 0x804de88
pSourceimg = 0x401f9aa0
pSource = 0x804eb7c
iX = 1

(gdb) p pData->pWorkrow
$1 = 0x0

(gdb) p pTargetimg->pImgbuf->iRowsize
$2 = 40


valgrind isn't very happy neither and reports the following:


==8511== Invalid write of size 1
==8511==    at 0x3C060884: mng_retrieve_rgb8 (libmng_pixels.c:2377)
==8511==    by 0x3C05358F: mng_process_display_past (libmng_display.c:5560)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5C is 0 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid write of size 1
==8511==    at 0x3C06088A: mng_retrieve_rgb8 (libmng_pixels.c:2378)
==8511==    by 0x3C05358F: mng_process_display_past (libmng_display.c:5560)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5D is 1 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid write of size 1
==8511==    at 0x3C060894: mng_retrieve_rgb8 (libmng_pixels.c:2380)
==8511==    by 0x3C05358F: mng_process_display_past (libmng_display.c:5560)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5F is 3 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid write of size 1
==8511==    at 0x3C060898: mng_retrieve_rgb8 (libmng_pixels.c:2379)
==8511==    by 0x3C05358F: mng_process_display_past (libmng_display.c:5560)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5E is 2 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid read of size 1
==8511==    at 0x3C04C540: mng_correct_gamma_only (libmng_cms.c:529)
==8511==    by 0x3C053688: mng_process_display_past (libmng_display.c:5568)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5C is 0 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid write of size 1
==8511==    at 0x3C04C54C: mng_correct_gamma_only (libmng_cms.c:529)
==8511==    by 0x3C053688: mng_process_display_past (libmng_display.c:5568)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5C is 0 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid read of size 1
==8511==    at 0x3C04C54E: mng_correct_gamma_only (libmng_cms.c:530)
==8511==    by 0x3C053688: mng_process_display_past (libmng_display.c:5568)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5D is 1 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid write of size 1
==8511==    at 0x3C04C55A: mng_correct_gamma_only (libmng_cms.c:530)
==8511==    by 0x3C053688: mng_process_display_past (libmng_display.c:5568)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5D is 1 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid read of size 1
==8511==    at 0x3C04C55D: mng_correct_gamma_only (libmng_cms.c:531)
==8511==    by 0x3C053688: mng_process_display_past (libmng_display.c:5568)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5E is 2 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid write of size 1
==8511==    at 0x3C04C569: mng_correct_gamma_only (libmng_cms.c:531)
==8511==    by 0x3C053688: mng_process_display_past (libmng_display.c:5568)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEA5E is 2 bytes after a block of size 80 alloc'd
==8511==    at 0x3C021C03: calloc (vg_replace_malloc.c:141)
==8511==    by 0x8048B38: myalloc (in /usr/local/bin/mngtree)
==8511==    by 0x3C0530AC: mng_process_display_past (libmng_display.c:5278)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==
==8511== Invalid read of size 4
==8511==    at 0x3C0706D0: mng_tile_rgba8 (libmng_pixels.c:15732)
==8511==    by 0x3C053671: mng_process_display_past (libmng_display.c:5574)
==8511==    by 0x3C038EFE: mng_read_past (libmng_chunk_io.c:3792)
==8511==    by 0x3C0724F8: process_raw_chunk (libmng_read.c:400)
==8511==  Address 0x3C2DEAFC is not stack'd, malloc'd or free'd


I managed to work around these problems with the following rather
arbitrary change. But I don't think it's the right fix:


Index: libmng_display.c
===================================================================
RCS file: /cvsroot/libmng/libmng-devel/libmng_display.c,v
retrieving revision 1.21.2.22
diff -u -p -r1.21.2.22 libmng_display.c
--- libmng_display.c    24 Sep 2002 11:21:35 -0000      1.21.2.22
+++ libmng_display.c    31 Mar 2004 10:58:06 -0000
@@ -5275,8 +5275,8 @@ mng_retcode mng_process_display_past (mn
       pTargetimg->iPastx      = pData->iPastx;
       pTargetimg->iPasty      = pData->iPasty;
                                        /* get temporary work-buffers */
-      MNG_ALLOC (pData, pData->pRGBArow, (pTargetimg->pImgbuf->iRowsize << 1))
-      MNG_ALLOC (pData, pData->pWorkrow, (pTargetimg->pImgbuf->iRowsize << 1))
+      MNG_ALLOC (pData, pData->pRGBArow, (pTargetimg->pImgbuf->iRowsize << 3))
+      MNG_ALLOC (pData, pData->pWorkrow, (pTargetimg->pImgbuf->iRowsize << 3))
                                        /* address destination for row-routines */
       pData->pStoreobj        = (mng_objectp)pTargetimg;
       pData->pStorebuf        = (mng_objectp)pTargetimg->pImgbuf;


After doing this change, the crash is gone, valgrind is happy. The
animation of the windows looks good but I am missing the background
image. I checked the unoptimized heart.mng again and the background is
gone there as well. I suspect this is because I updated from
libmng-1.0.5 as shipped with Debian to the version I checked out from
CVS. I will investigate this further...


Sven


--
Send the message body "help" to [email protected]