На некотором php-коде (при установке CMS) Апач выпадает с ошибкой: httpd2: magick/semaphore.c:531: LockSemaphoreInfo: Проверочное утверждение «semaphore_info != (SemaphoreInfo *) ((void *)0)» не выполнено. [Sun Oct 13 00:40:12 2013] [error] child died with signal 6 Нашёл похожую багу: https://bugzilla.redhat.com/show_bug.cgi?id=751376 На тесте <?php $image = new Gmagick(); $svg = file_get_contents('image.svg'); $image->readImageBlob($svg); $image->write('image.jpg'); echo get_class($image). PHP_EOL; exit; (на всякий, тестовый svg брал такой: http://soulibre.ru/images/1/1d/Red_copyright.svg) получил SegFault: #0 strlcpy (dst=<optimized out>, src=0x0, siz=<optimized out>) at strlcpy.c:41 #1 0x00007ffff04b8945 in MagickSetImageFilename () from /usr/lib64/libGraphicsMagickWand.so.2 #2 0x00007ffff06e11b2 in zim_gmagick_readimageblob () from /usr/lib64/php/5.3.27/extensions/gmagick.so #3 0x00007fffeb3c0844 in ?? () from /usr/lib64/php/5.3.27/extensions/suhosin.so #4 0x00007ffff7a305e6 in ?? () from /usr/lib64/libphp-5.3.27.so.0 #5 0x00007ffff79f08e3 in execute () from /usr/lib64/libphp-5.3.27.so.0 #6 0x00007fffeb3c197b in ?? () from /usr/lib64/php/5.3.27/extensions/suhosin.so #7 0x00007ffff79cbb79 in zend_execute_scripts () from /usr/lib64/libphp-5.3.27.so.0 # rpm -qf /usr/lib64/libGraphicsMagickWand.so.2.6.0 libGraphicsMagick-1.3.18-alt1 # rpm -qf /usr/lib64/php/5.3.27/extensions/gmagick.so php5-gmagick-5.3.27.20130711-alt0.M70P.1 Правда мне показалось, что это уже другая бага.
В Сизифе libGraphicsMagick-1.3.18-alt2 php5-gmagick-5.4.17.20130704-alt1 и бага не воспроизводится.
Упростил тест: #!/usr/bin/php <?php $image = new Gmagick(); // 1x1 gif $data = base64_decode('R0lGODlhAQABAIAAAMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); $image->readImageBlob($data); Program received signal SIGSEGV, Segmentation fault. strlcpy (dst=<optimized out>, src=0x0, siz=siz@entry=2053) at strlcpy.c:41 41 if ((*d++ = *s++) == 0) (gdb) bt #0 strlcpy (dst=<optimized out>, src=0x0, siz=siz@entry=2053) at strlcpy.c:41 #1 0x00007ffff005feb5 in CopyMagickString (destination=<optimized out>, source=<optimized out>, length=length@entry=2053) at wand/magick_compat.c:76 #2 0x00007ffff006a945 in MagickSetImageFilename (wand=0x8bfc30, filename=<optimized out>) at wand/magick_wand.c:8012 #3 0x00007ffff02931b2 in zim_gmagick_readimageblob (ht=<optimized out>, return_value=0x895178, return_value_ptr=<optimized out>, this_ptr=0x8951c8, return_value_used=<optimized out>) at /usr/src/debug/php5-gmagick-5.3.27.20130711/gmagick_methods.c:3082 #4 0x00007fffec553844 in ?? () from /usr/lib64/php/5.3.27/extensions/suhosin.so
У меня пакет php5-gmagick-5.3.27.20130711-alt0.M70P.1 Удивляюсь, но я не смог такого тэга сборки в http://git.altlinux.org/gears/p/php5-gmagick.git?p=php5-gmagick.git;a=shortlog;h=refs/heads/p7 Поэтому не представляю, что предпринять. Перейти на php 5.4 так сразу не могу, он сильно несовместим.
(gdb) l /usr/src/debug/php5-gmagick-5.3.27.20130711/gmagick_methods.c:3070 3065 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &image_string, &image_string_len, &filename, &filename_len) == FAILURE) { 3066 return; 3067 } ... 3081 /* Even if filename is null we need to give a name here. Otherwise segfaults will happen */ 3082 MagickSetImageFilename(intern->magick_wand, filename); Я так понимаю, filename предполагается быть заполненным, но этого не случилось Второй параметр функции не обязателен: bool Imagick::readImageBlob ( string $image [, string $filename ] ) ... ZEND_BEGIN_ARG_INFO_EX(gmagick_readimageblob_args, 0, 0, 1) <------>ZEND_ARG_INFO(0, imageContents) <------>ZEND_ARG_INFO(0, filename) ZEND_END_ARG_INFO() http://www.php.net/manual/en/imagick.readimageblob.php В общем, в новой версии php-gmagick добавлено: <------>/* Even if filename is null we need to give a name here. Otherwise segfaults will happen */ <------>if (!filename) <------><------>filename = ""; В качестве обходного варианта можно указывать пустую строку вторым параметром к readImageBlob. Патч делать к php5-gmagick-5.3..?
Переименовываю тогда: У нас тут старая версия PECL GMagick, в которой ошибка в функции readImageBlob() и нет функции getImageBlob(); Чтобы проблемы ушли, надо обновить версию.
(В ответ на комментарий №5) > Переименовываю тогда: > У нас тут старая версия PECL GMagick, в которой ошибка в функции > readImageBlob() и нет функции getImageBlob(); > Чтобы проблемы ушли, надо обновить версию. До какой версии? Последней 5.3.x из апстрима?
(В ответ на комментарий №6) ...> > У нас тут старая версия PECL GMagick, в которой ошибка в функции ... > > Чтобы проблемы ушли, надо обновить версию. > До какой версии? Последней 5.3.x из апстрима? Достаточно до той, которая в Сизифе. Это правильный путь, в Сизифе она уже обкаталась, можно и в p7 перенести.
php5-gmagick-5.3.27.20130711-alt0.M70P.2 -> p7: * Tue Feb 25 2014 Andrey Cherepanov <cas@altlinux> 5.3.27.20130711-alt0.M70P.2 - Backport new version to p7 (ALT #29462) * Tue Feb 25 2014 cas <cas@altlinux> 5.3.27.20130711-alt0.M70P.2 - Rebuild with php5-5.3.27.20130711-alt0.M70P.2