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

Memory leak #2

Closed
mspanc opened this issue Mar 7, 2017 · 16 comments
Closed

Memory leak #2

mspanc opened this issue Mar 7, 2017 · 16 comments

Comments

@mspanc
Copy link

mspanc commented Mar 7, 2017

I have found out a memory leak in ODR-PadEnc 2.1.0.

screen shot 2017-03-07 at 19 00 45

I have a multiplexer where I run 3 instances of odr-padenc.

They are executed as the following

/usr/local/bin/odr-padenc -t /home/app/metadata/radio/dls.txt -o /home/app/metadata/radio/pad.fifo --pad=58 --charset=15 --dir=/home/app/metadata/radio/images --sleep=30

/home/app/metadata/radio/images contains only one PNG image and is not updated.

I have noticed that at some point I stopped having log messages from padenc but process keeps running.

When I did cat /home/app/metadata/radio/pad.fifo there were some data (+/- 2 screens on terminal).

@basicmaster
Copy link
Member

basicmaster commented Mar 7, 2017

I fixed a memleak related to the Slideshow that occured under certain conditions (see the commit message).

  • Is the mentioned PNG image 320x240 (or less) and larger than ~50 KB?
  • Could you please check if the problem persists?

@mspanc
Copy link
Author

mspanc commented Mar 7, 2017

Thank you for quick response. I'll try to test it tomorrow.

@mspanc
Copy link
Author

mspanc commented Mar 9, 2017

I have built the version containing fix and installed on the server. I'll let you know soon whether this has helped.

In the meantime I attach image that is being used by us:

lemfm_image

They are always 320x240 PNG but less than 50KB in size.

@mspanc
Copy link
Author

mspanc commented Mar 9, 2017

@basicmaster btw shouldn't you be using MagickRelinquishMemory(blob) instead of free(blob)? (I am not sure, but in other parts of the code this is the practice)

@basicmaster
Copy link
Member

basicmaster commented Mar 9, 2017 via email

@mspanc
Copy link
Author

mspanc commented Mar 9, 2017

Unfortunately, this does not fix the bug. There must be another memleak in the code.

screen shot 2017-03-09 at 10 08 45

@basicmaster
Copy link
Member

basicmaster commented Mar 9, 2017 via email

@mspanc
Copy link
Author

mspanc commented Mar 9, 2017

ODR-PadEnc encoding Slideshow from '/home/app/metadata/r1/images' and DLS from '/home/app/metadata/r1/dls.txt' to '/home/app/metadata/r1/pad.fifo'
ODR-PadEnc using charset UTF-8 (15)
ODR-PadEnc converting DLS texts to Complete EBU Latin
ODR-PadEnc found slide '/home/app/metadata/r1/images/image.png', fidx 0
ODR-PadEnc image: '/home/app/metadata/r1/images/image.png' (id=0). Original size: 320 x 240. (PNG)
ODR-PadEnc image: '/home/app/metadata/r1/images/image.png' (id=0).  No resize needed: 26252 Bytes
ODR-PadEnc writing image as '0000.png'
ODR-PadEnc writing new DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"

(after 30s)

ODR-PadEnc found slide '/home/app/metadata/r1/images/image.png', fidx 0
ODR-PadEnc image: '/home/app/metadata/r1/images/image.png' (id=0). Original size: 320 x 240. (PNG)
ODR-PadEnc image: '/home/app/metadata/r1/images/image.png' (id=0).  No resize needed: 26252 Bytes
ODR-PadEnc writing image as '0000.png'
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"
ODR-PadEnc writing old DLS text "Sarisan - Ej, hoj, mila moja"

Valgrind:

valgrind --leak-check=full /usr/local/bin/odr-padenc -t /home/app/metadata/r1/dls.txt -o /home/app/metadata/r1/pad.fifo --pad=58 --charset=15 --dir=/home/app/metadata/r1/images --sleep=30 -v
==30786== Memcheck, a memory error detector
==30786== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==30786== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==30786== Command: /usr/local/bin/odr-padenc -t /home/app/metadata/r1/dls.txt -o /home/app/metadata/r1/pad.fifo --pad=58 --charset=15 --dir=/home/app/metadata/r1/images --sleep=30 -v
==30786== 
ODR-PadEnc encoding Slideshow from '/home/app/metadata/r1/images' and DLS from '/home/app/metadata/r1/dls.txt' to '/home/app/metadata/r1/pad.fifo'
ODR-PadEnc using charset UTF-8 (15)
ODR-PadEnc converting DLS texts to Complete EBU Latin
ODR-PadEnc found slide '/home/app/metadata/r1/images/image.png', fidx 0
ODR-PadEnc image: '/home/app/metadata/r1/images/image.png' (id=0). Original size: 320 x 240. (PNG)
ODR-PadEnc image: '/home/app/metadata/r1/images/image.png' (id=0).  No resize needed: 26252 Bytes
ODR-PadEnc writing image as '0000.png'
ODR-PadEnc writing new DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
ODR-PadEnc writing old DLS text "Makovickyj Holos - Vypij vypij vinecka"
^C==30786== 
==30786== Process terminating with default action of signal 2 (SIGINT)
==30786==    at 0x5707C00: __nanosleep_nocancel (syscall-template.S:84)
==30786==    by 0x4038B5: sleep_for<long int, std::ratio<1l, 1000000000l> > (thread:292)
==30786==    by 0x4038B5: sleep_until<std::chrono::_V2::steady_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > > (thread:305)
==30786==    by 0x4038B5: main (odr-padenc.cpp:356)
==30786== 
==30786== HEAP SUMMARY:
==30786==     in use at exit: 198,991 bytes in 881 blocks
==30786==   total heap usage: 3,518 allocs, 2,637 frees, 2,736,926 bytes allocated
==30786== 
==30786== 960 bytes in 1 blocks are definitely lost in loss record 158 of 185
==30786==    at 0x4C2FFC6: memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x4C300D1: posix_memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E0722A: AcquireAlignedMemory (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E0753C: AcquireVirtualMemory (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95AD27B: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x95AE51D: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5E8E7: ReadImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x4ED9A39: MagickReadImage (in /usr/lib/x86_64-linux-gnu/libMagickWand-6.Q16.so.2.0.0)
==30786==    by 0x40CE43: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:334)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 960 bytes in 1 blocks are definitely lost in loss record 159 of 185
==30786==    at 0x4C2FFC6: memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x4C300D1: posix_memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E0722A: AcquireAlignedMemory (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E0753C: AcquireVirtualMemory (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x959FC67: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x95A6AE1: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 164 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7717: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 165 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7793: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 166 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7809: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 167 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7823: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 168 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A783D: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 169 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7857: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 170 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7871: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 171 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A788B: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 172 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A78A5: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 173 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A78BF: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 174 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A78D9: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 175 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A78F3: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 176 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A790D: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 177 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7927: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 178 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7941: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 179 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A795B: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== 4,102 bytes in 1 blocks are definitely lost in loss record 180 of 185
==30786==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30786==    by 0x5E82D6E: AcquireString (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E84F17: StringToArgv (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5E18117: IsOptionMember (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x95A7975: ??? (in /usr/lib/x86_64-linux-gnu/ImageMagick-6.8.9/modules-Q16/coders/png.so)
==30786==    by 0x5D5FDDE: WriteImage (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x5D2B6CD: ImageToBlob (in /usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0)
==30786==    by 0x40D02C: SLSManager::encodeFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, bool) (sls.cpp:392)
==30786==    by 0x403779: main (odr-padenc.cpp:324)
==30786== 
==30786== LEAK SUMMARY:
==30786==    definitely lost: 71,654 bytes in 19 blocks
==30786==    indirectly lost: 0 bytes in 0 blocks
==30786==      possibly lost: 0 bytes in 0 blocks
==30786==    still reachable: 127,337 bytes in 862 blocks
==30786==         suppressed: 0 bytes in 0 blocks
==30786== Reachable blocks (those to which a pointer was found) are not shown.
==30786== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==30786== 
==30786== For counts of detected and suppressed errors, rerun with: -v
==30786== ERROR SUMMARY: 19 errors from 19 contexts (suppressed: 0 from 0)

@basicmaster
Copy link
Member

basicmaster commented Mar 9, 2017 via email

@mspanc
Copy link
Author

mspanc commented Mar 9, 2017

I use ubuntu 16.04 server 64-bit.

# dpkg -l | grep magick
ii  imagemagick-common                     8:6.8.9.9-7ubuntu5.5                all          image manipulation programs -- infrastructure
ii  libmagickcore-6-arch-config:amd64      8:6.8.9.9-7ubuntu5.5                amd64        low-level image manipulation library - architecture header files
ii  libmagickcore-6-headers                8:6.8.9.9-7ubuntu5.5                all          low-level image manipulation library - header files
ii  libmagickcore-6.q16-2:amd64            8:6.8.9.9-7ubuntu5.5                amd64        low-level image manipulation library -- quantum depth Q16
ii  libmagickcore-6.q16-2-extra:amd64      8:6.8.9.9-7ubuntu5.5                amd64        low-level image manipulation library - extra codecs (Q16)
ii  libmagickcore-6.q16-dev:amd64          8:6.8.9.9-7ubuntu5.5                amd64        low-level image manipulation library - development files (Q16)
ii  libmagickwand-6-headers                8:6.8.9.9-7ubuntu5.5                all          image manipulation library - headers files
ii  libmagickwand-6.q16-2:amd64            8:6.8.9.9-7ubuntu5.5                amd64        image manipulation library
ii  libmagickwand-6.q16-dev:amd64          8:6.8.9.9-7ubuntu5.5                amd64        image manipulation library - development files
ii  libmagickwand-dev                      8:6.8.9.9-7ubuntu5.5                all          image manipulation library - transition for development files

basicmaster added a commit that referenced this issue Mar 9, 2017
Ubuntu 16.04 currently ships an ImageMagick version that was affected by
a memleak and is fixed since v6.9.2-2: http://git.imagemagick.org/repos/ImageMagick/commit/6790815c75bdea0357df5564345847856e995d6b

Closes #2.
@basicmaster
Copy link
Member

Thanks for the information and for bringing this up. I was able to reproduce the bug with 16.04.

It turned out that there has been a memleak in ImageMagick which was fixed in 09/2015: http://git.imagemagick.org/repos/ImageMagick/commit/6790815c75bdea0357df5564345847856e995d6b
So versions since 6.9.2-2 are not affected.

I will file a bug for Ubuntu to backport this fix and notify the mailing list; in the meantime you should upgrade to a recent version of the version 6 branch.

@mspanc
Copy link
Author

mspanc commented Mar 9, 2017

Wouldn't it be a good idea to add check to ./configure and prevent compiling on affected versions? Anyway, thanks for support!

@mspanc
Copy link
Author

mspanc commented May 2, 2017

@basicmaster I wanted to apply this patch to the package that ships with ubuntu 16.04 and seems it is already applied. Are you sure that this is the cause?

~/imagemagick/imagemagick-6.8.9.9# cat debian/patches/0186-Fixed-memory-leak-in-IsOptionMember.patch
From 9c96edbecd081cf1e9fc7cd41adc0b326147df01 Mon Sep 17 00:00:00 2001
From: dirk <dirk@git.imagemagick.org>
Date: Sat, 19 Sep 2015 13:42:25 +0200
Subject: [PATCH] Fixed memory leak in IsOptionMember.

bug-debian: https://bugs.debian.org/857426
bug-ubuntu: https://bugs.launchpad.net/bugs/1671630
origin: http://git.imagemagick.org/repos/ImageMagick/commit/6790815c75bdea0357df5564345847856e995d6b

(cherry picked from commit 6790815c75bdea0357df5564345847856e995d6b)
---
 magick/option.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/magick/option.c b/magick/option.c
index 1182cbfd9..9511aa06a 100644
--- a/magick/option.c
+++ b/magick/option.c
@@ -2280,6 +2280,7 @@ MagickExport MagickBooleanType IsOptionMember(const char *option,
   if (option_list == (char **) NULL)
     return(MagickFalse);
   member=MagickFalse;
+  option_list[0]=DestroyString(option_list[0]);
   for (i=1; i < (ssize_t) number_options; i++)
   {
     if ((*option_list[i] == '!') &&

@mspanc
Copy link
Author

mspanc commented May 2, 2017

Oh I am sorry, I just noticed that this fix was released recently :)

@basicmaster
Copy link
Member

No problem ;-)

But I recently found out that there is a second (less problematic) memleak in the version shipped by 16.04; the reason is a backport patch on top of the upstream release: https://bugs.launchpad.net/ubuntu/+source/imagemagick/+bug/1680543

@basicmaster
Copy link
Member

basicmaster commented Jul 28, 2017

That second memleak has by the way been fixed with the following package versions:

Debian Jessie:
8:6.8.9.9-5+deb8u9

Ubuntu 16.04:
8:6.8.9.9-7ubuntu5.7

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

No branches or pull requests

2 participants