Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

munmap_chunk(): invalid pointer が発生する #29

Closed
msmhrt opened this issue Feb 15, 2015 · 10 comments
Closed

munmap_chunk(): invalid pointer が発生する #29

msmhrt opened this issue Feb 15, 2015 · 10 comments
Assignees
Labels

Comments

@msmhrt
Copy link
Collaborator

msmhrt commented Feb 15, 2015

release-1.4 ブランチ( 80ec152 )で、munmap_chunk(): invalid pointer というエラーが表示されました。

再現率は 10/10回 で master ブランチ( cdc6005 )でも発生しましたが、develop ブランチ( f80cf2a )では発生しませんでした。

下記は全ログです。

$ wget -O - "https://www.google.com/images/icons/product/youtube-16.png" | img2sixel
--2015-02-15 22:49:28--  https://www.google.com/images/icons/product/youtube-16.png
Resolving www.google.com (www.google.com)... 173.194.72.106, 173.194.72.99, 173.194.72.147, ...
Connecting to www.google.com (www.google.com)|173.194.72.106|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 186 [image/png]
Saving to: 'STDOUT'

100%[===================================================================================>] 186         --.-K/s   in 0s

2015-02-15 22:49:28 (20.4 MB/s) - written to stdout [186/186]

*** Error in `img2sixel': munmap_chunk(): invalid pointer: 0x0000000001592a40 ***
Aborted
$

下記は gdbbt した結果です。

$ gdb img2sixel
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from img2sixel...done.
(gdb) run youtube-16.png
Starting program: /home/msmhrt/local/bin/img2sixel youtube-16.png
*** Error in `/home/msmhrt/local/bin/img2sixel': munmap_chunk(): invalid pointer: 0x0000000000630aa0 ***

Program received signal SIGABRT, Aborted.
0x00007ffff70bfcc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56      ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff70bfcc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff70c30d8 in __GI_abort () at abort.c:89
#2  0x00007ffff70fcf24 in __libc_message (do_abort=do_abort@entry=1,
    fmt=fmt@entry=0x7ffff720b6c8 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007ffff7107c87 in malloc_printerr (action=<optimized out>, str=0x7ffff720ba48 "munmap_chunk(): invalid pointer",
    ptr=<optimized out>) at malloc.c:4996
#4  0x000000000040fc13 in load_png (pixelformat=0x7fffffffdfe4, reqcolors=256, pncolors=0x7fffffffdfe0,
    ppalette=0x7fffffffe010, pcomp=0x7fffffffdeac, psy=0x7fffffffdfd4, psx=0x7fffffffdfd0, size=<optimized out>,
    buffer=0x61c250 "\211PNG\r\n\032\n") at loader.c:434
#5  load_with_builtin (reqcolors=256, fstatic=0, ppdelay=0x7fffffffe008, ploop_count=0x7fffffffdfdc,
    pframe_count=0x7fffffffdfd8, ppixelformat=0x7fffffffdfe4, pncolors=0x7fffffffdfe0, ppalette=0x7fffffffe010,
    pstride=<synthetic pointer>, pcomp=0x7fffffffdeac, psy=0x7fffffffdfd4, psx=0x7fffffffdfd0, pchunk=<synthetic pointer>)
    at loader.c:663
#6  load_image_file (filename=filename@entry=0x7fffffffe8d6 "youtube-16.png", psx=psx@entry=0x7fffffffdfd0,
    psy=psy@entry=0x7fffffffdfd4, ppalette=ppalette@entry=0x7fffffffe010, pncolors=pncolors@entry=0x7fffffffdfe0,
    ppixelformat=ppixelformat@entry=0x7fffffffdfe4, pframe_count=pframe_count@entry=0x7fffffffdfd8,
    ploop_count=ploop_count@entry=0x7fffffffdfdc, ppdelay=ppdelay@entry=0x7fffffffe008, fstatic=0, reqcolors=256,
    ppixels=ppixels@entry=0x7fffffffe000) at loader.c:1046
#7  0x0000000000404209 in convert_to_sixel (filename=0x7fffffffe8d6 "youtube-16.png",
    psettings=psettings@entry=0x7fffffffe110) at img2sixel.c:812
#8  0x00000000004034e1 in main (argc=2, argv=<optimized out>) at img2sixel.c:1676
(gdb)

既知問題でしたらすみません。

@saitoha
Copy link
Owner

saitoha commented Feb 15, 2015

ご報告ありがとうございます。
パレットPNGをRGBに変換するlibpng API(png_set_palette_to_rgb)を呼んでいるんですが、1/2/4bppの時の呼び出し方に問題があるのか、ここでメモリ破壊が起きている気がします。
developやfix-issue-25ではこの呼び出しをしないようにしていたので、問題が起きていません。
これらをそのままマージすれば直るんですが、新機能の-Bオプションも入ってしまうので、必要最小限のコードを選り分けてrelease-1.4に対するバックポートを行ったのが、hotfix-issue-29ブランチです。

@saitoha saitoha added the bug label Feb 15, 2015
@saitoha saitoha self-assigned this Feb 15, 2015
@msmhrt
Copy link
Collaborator Author

msmhrt commented Feb 15, 2015

hotfix-issue-29 ブランチ( b6748d1 )でビルドして、上記の問題が発生しないことを確認しました。

@msmhrt
Copy link
Collaborator Author

msmhrt commented Feb 16, 2015

帰宅して確認したところ、 #22 の画像が下記のように表示されました。
output

release-1.4 ブランチ( 80ec152 ) だと正しく表示されるので、 b6748d1 の問題だと思われます。

@saitoha
Copy link
Owner

saitoha commented Feb 16, 2015

1bpp パレットのPNGのテストに http://www.schaik.com/pngsuite/basn3p01.png を使って実装していたんですが、
こっちはうまく表示できてしまっていました。
さっきpushしましたがまだ直っていません。原因を調査中です。

@msmhrt
Copy link
Collaborator Author

msmhrt commented Feb 16, 2015

了解しました。

そちらでも問題を再現できたようですので、直るのを気長にお待ちしています。

saitoha added a commit that referenced this issue Feb 17, 2015
commit 808aeae
Author: Hayaki Saito <[email protected]>
Date:   Tue Feb 17 00:20:18 2015 +0900

    Use png_set_packing to expand 1/2/4bpp paletted PNG (for Issue #29)

commit cb53ae1
Author: Hayaki Saito <[email protected]>
Date:   Tue Feb 17 00:13:23 2015 +0900

    Revert "libpng loader: expand 1/2/4bpp palette to 8bpp (for issue #29)"

    This reverts commit b6748d1.

commit b6748d1
Author: saitoha <[email protected]>
Date:   Mon Feb 16 00:41:06 2015 +0900

    libpng loader: expand 1/2/4bpp palette to 8bpp (for issue #29)
@saitoha
Copy link
Owner

saitoha commented Feb 17, 2015

すみません、バックポート元のfix-issue-25自体に問題があって、画像の幅が8の倍数ではない1bpp PNGが正しく読めていませんでした。
そこで、このhotfix-issue-29ブランチに対しては、一旦revertしてまったく別の方針の修正を入れました。

@msmhrt
Copy link
Collaborator Author

msmhrt commented Feb 17, 2015

「画像の幅が8の倍数」というお話があったので、-w オプションを試していたのですが、 hotfix-issue-29 ブランチ( 808aeae ) で、

$ wget -O - "https://www.google.com/images/icons/product/youtube-16.png" | img2sixel -w 16

を試したところ、*** Error in img2sixel': munmap_chunk(): invalid pointer: 0x0000000000f08a40 ***` が発生しました。

ただし、試した限りでは -w の値が何でも(例: 1, 2, 3, 15, 16, 17)でも発生するようですので、ひょっとすると別問題かもしれません。

saitoha added a commit that referenced this issue Feb 18, 2015
@saitoha
Copy link
Owner

saitoha commented Feb 18, 2015

-wや-hを指定した時だけは、再サンプリング処理を行う都合上、パレットPNGであってもlibpng側でRGB24bit形式に展開してもらってこようとしており、ちょっと特別な場所を通ります。
今回はその上でさらに、そのPNGがアルファ情報(tRNSチャンク)を持つ場合は、libpngがRGB24bit形式ではなくRGBA32bit形式を返してくる、ということがわかったのですが、それを知らずに処理してしまっていために起こりました。
いろいろと想定が漏れていてすみません。
提案頂いているmd5sumを使ったテストを書くのが急務だと感じています。

@msmhrt
Copy link
Collaborator Author

msmhrt commented Feb 18, 2015

たまたま同じエラーが発生しているが直接の関係はなかったという感じですかね。

テストについては #25 (comment) で紹介していただいた、PngSuite のページを w3m で一通り表示して想定外の問題無き事を確認するところから始めた方が良いのかもしれません。

@saitoha
Copy link
Owner

saitoha commented Feb 19, 2015

masterにマージしました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants