PHP. heap corruption detected в phpQuery и Segmentation fault в PHP CLI

Операционные системы 18.09.2009

suhosin_bug

После переустановки PHP 5.2.10 столкнулся я с такой проблемой как «linked list corrupt on efree () — heap corruption detected» при использовании библиотеки phpQuery, а также «Segmentation fault» в CLI версии свежеустановленного PHP.

Ошибка «linked list corrupt on efree () — heap corruption detected» проявлялась только в одном месте, и связана была с DOM модулем, как мне казалось. До переустановки я не юзал phpQuery в продакшене, поэтому не мог сказать однозначно повлияла ли это переустановка, или так и было бы с ошибкой.

При запуске любого скрипта в CLI режиме, было нечто подобное:

php -f /www/script.php
Segmentation fault

Решение проблемы с Segmentation fault в CLI

Погуглив немного, не нашел ничего путного и запостил на Пыху топик о своей проблеме, пару дней мы думали по этой теме, предлагались разные решения и побороли в первый день «Segmentation fault» в CLI, путем упорядочивания PHP модулей (спасибо пользователю OFF), сейчас у меня так:

extension=mbstring.so
extension=simplexml.so
extension=spl.so
extension=mysqli.so
extension=mysql.so
extension=session.so
extension=mcrypt.so
extension=gd.so
extension=json.so
extension=ctype.so
extension=iconv.so
extension=hash.so
extension=curl.so
extension=zlib.so
extension=imagick.so
extension=ffmpeg.so
extension=sphinx.so
extension=pcre.so
extension=memcache.so
extension=memcached.so
extension=dom.so

С тех пор CLI работал исправно и работает до сих пор.

Решение проблемы с heap corruption detected в phpQuery

Признаюсь, я грешил на PHP-модуль «php5-dom», однако проблема оказалась не в нем. Ошибка была вида:

[Thu Sep 17 01:48:23 2009] [error] [client 93.111.111.111] ALERT — linked list corrupt on efree () — heap corruption detected (attacker '93.111.111.111', file '/path/to/kinsburg/path/to/libs/phpquery.php', line 5689), referer: http://kinsburg.ru/path/to/admin/path/to/parser/

где, 93.111.111.111 — ip-адрес моего локального компьютера (аля клиент)

Решение оказалось совсем для меня не очевидным, во всем оказался виноват «Suhosin Patch», который нужен для обеспечения безопасности. Я просто переустановил PHP, но в этот раз отключил Suhosin.

На эту мысль меня натолкнул пост пользователя OFF с Пыха.ру, за что ему огромное спасибо! Были еще варианты решения этой проблемы, но они не венчались успехом.

В данный момент, я планирую включить снова Suhosin Patch, потомучто запускать тот злосчастный скрипт мне необходимо всего раз 3-6 месяцев, а за это время может возникнут патчи бага, либо найдется куда более продуктивное решение.

FreeBSD. DNS сервер своими руками при помощи Bind9

Операционные системы 26.08.2009

bind9

Привет, сегодня поднимем свой сервер имен, для того чтобы связать доменные имена с ip-адресами. Для этого нам понадобиться минимум один выделенный сервер с установленной FreeBSD.

Установка Bind9

Перед установкой не забудьте обновить порты.

# cd /usr/ports/dns/bind9
# make install clean
# rehash

Теперь добавим автозагрузку бинда в /etc/rc.conf

named_enable="YES"
named_uid="bind"
named_chrootdir=""
named_flags="-s"

И перезагрузим сервак

# reboot

Читать полностью »

Инклуд конфигов Sphinx

Операционные системы 24.07.2009

sphinx

Встала проблема объединения конфигурационных файлов Sphinx'a, погуглив не нашел решения на уровне приложения и решил сделать своё.

Создаем каталог «sphinx», где будем хранить все конфигурационные файлы sphinx'a:

mkdir /usr/local/etc/sphinx

Далее, складываем туда все файлы конфигов с разных хостов, например:

/usr/local/etc/sphinx/adw0rd.ru.conf
/usr/local/etc/sphinx/pyha.ru.conf

и убираем оттуда директивы «indexer» и «searchd».

Теперь, создаем там файлы «indexer.conf» для настройки индексатора и «searchd.conf» для настройки демона сфинкса:

/usr/local/etc/sphinx/indexer.conf
/usr/local/etc/sphinx/searchd.conf

Примерное содержимое файла «indexer.conf»:

indexer
{
        mem_limit = 32M
}

Примерное содержимое файла «searchd.conf»:

searchd
{
        address = 127.0.0.1
        port = 3312
        log = /var/log/sphinxsearch/searchd.log
        query_log = /var/log/sphinxsearch/sphinx-query.log
        read_timeout = 5
        max_children = 30
        pid_file = /var/run/sphinxsearch/searchd.pid
}

Далее, пишем скрипт, объединяющий наши файлы конфигов:

#!/bin/sh
/bin/cat /usr/local/etc/sphinx/*.conf

и указываем этот файл как конфигурационный файл сфинкса в «/usr/local/etc/rc.d/sphinxsearch»:

: ${sphinxsearch_conffile="/usr/local/etc/sphinx.conf.sh"}

Примеры использования

Индексация:

indexer --config /usr/local/etc/sphinx.conf.sh --all
indexer --config /usr/local/etc/sphinx.conf.sh --rotate

Запуск демона

searchd --config /usr/local/etc/sphinx.conf.sh
/usr/local/etc/rc.d/sphinxsearch start

Установка и настройка Trac на FreeBSD

Базы данных, Инструменты, Операционные системы 20.07.2009

trac

Trac — это инструмент управления проектами и отслеживания ошибок в программном обеспечении. Он использует минималистичный веб-интерфейс, основанный на технологии wiki, и позволяет организовать перекрёстные гиперссылки между базой данных зарегистрированных ошибок, системой управления версиями и wiki-страницами.

Это даёт возможность использовать Trac в том числе и как веб-интерфейс для доступа к системе контроля версий subversion, а так же, через плагины, к Mercurial, git, Bazaar и другим. Trac написан на языке программирования python и в настоящее время распространяется по модифицированной лицензии BSD.

http://ru.wikipedia.org/wiki/Trac

Возможности

  • Возможность просмотра всех изменений в svn и trac-проекте.
  • Можно создавать подпроекты, например для портала это будет «Разработать сервис фотографий», «Разработка форума» или «Реконструкция поискового-модуля». И для каждого будут отдельные группы тикетов.
  • Просмотреть изменения кодов проекта в svn-ревизиях и сравнивание их.
  • Создание, просмотр и закрытие тикетов.
  • Управление пользователями, участвующие в разработке.
  • Wiki-движок, с помощью которого можно создавать как справочную информацию, так и документацию по проекту в целом.

Так же имеется куча плагинов для Trac, с помощью которых вы легко расширите функционал!

Установка

Для развертывания Trac нам понадобится:

  • Apache 2.2 — но вы можете так же развернуть и на Apache 1.3 или на Nginx, к примеру
  • mod_python3 — это для Apache 2, а для 1.3 надо просто «mod_python»
  • Subversion — либо другие системы контроля версия, например Mercurial, git или Bazaar
  • py-subversion — для работы из Python с Subversion
  • MySQL — можете также использовать SQLite или PgSQL. Подробнее http://trac.edgewall.org/wiki/DatabaseBackend
  • Ну и сам Trac разумеется :)

Читать полностью »

#chown на корень страшнее чем #rm -rf /

Операционные системы 15.07.2009

chown

Ну вот, в продолжении первой части тупняка появилась часть вторая! Нет, теперь не пыха пострадала, а другой сервер, для которого я производил реконструкции.

Видимо надо менять клаву, второй раз точку не смог нажать... а ведь нажимаю! Уж лучше бы я сделал «rm -rf /»... :)

К делу, я поторопился и вместо

# chown adw0rd:wheel ./*

сделал что, угадаете? :)

А вот что:

# chown adw0rd:wheel /*

Я естественно не заметил ничего, а продолжил работу... потом мне надо было ребутнуть сервак.
И наступила ночь... :)

Прозрение

После ребута, захожу под adw0rd'ом на сервер, выполняю «su», а он мне говорит

su: not running setuid

Сразу погуглил и рванул в /usr/bin/ и смотрю что там с su:

# ll su

смотрю, а хозяин то adw0rd, думаю что за шутки! O_o
начал лазить по серваку... а там везде хозяин adw0rd, и меня осенило! я забыл долбаную точку!

Как решил проблемы

Ну раз я теперь хозяин всего, то пошел редактировать sshd конфиг, дабы разрешить руту доступ...

# vi /etc/ssh/sshd_config

Отыскал строчку

#PermitRootLogin no

и заменил на

PermitRootLogin yes

ребут сервака и sshd не могу сделать от adw0rd, su тоже не пускает... в итоге захожу в панель хостера и жму ремот-ребут

После перезагрузки у меня появилась возможность заходить на сервер из под рута, теперь меняю права на рута для всех файлов на сервере и постепенно сравниваю права с другим сервером и выставляю их так же.

Ну собственно все, теперь все работает :)