<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ars Longa, Vita Brevis &#187; ошибка</title>
	<atom:link href="http://blog.sjinks.pro/tag/bug/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Thu, 19 Jan 2012 12:18:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Linux, консоль и деванагари</title>
		<link>http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/</link>
		<comments>http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 15:51:08 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Всё подряд]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=941</guid>
		<description><![CDATA[В то время, когда наши корабли бороздят просторы Вселенной… Недавно отлаживал небольшой скрипт, транслитерирующий текст, записанный в системе IAST или ITRANS, на деванагари. Так как на домашней машине стоит Linux, то логично, что скрипт отлаживался в Linux — в терминале. И тут меня ожидал огромный сюрприз… В качестве теста брался отрывок из Брихадараньяка-упанишады, выглядящий следующим образом (в [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>В то время, когда наши корабли бороздят просторы Вселенной…</em></h2>
<p>Недавно отлаживал небольшой скрипт, транслитерирующий текст, записанный в системе <abbr title="International Alphabet of Sanskrit Transliteration">IAST</abbr> или ITRANS, на деванагари. Так как на домашней машине стоит <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a>, то логично, что скрипт отлаживался в <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> — в терминале.</p>
<p>И тут меня ожидал огромный сюрприз…<span id="more-941"></span></p>
<p>В качестве теста брался отрывок из <a href="http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%85%D0%B0%D0%B4%D0%B0%D1%80%D0%B0%D0%BD%D1%8C%D1%8F%D0%BA%D0%B0-%D1%83%D0%BF%D0%B0%D0%BD%D0%B8%D1%88%D0%B0%D0%B4%D0%B0">Брихадараньяка-упанишады</a>, выглядящий следующим образом (в IAST):</p>
<pre style="font-size: 15px">
pūrṇamadaḥ pūrṇamidam pūrṇāt pūrṇamudacyate
pūrṇasya pūrṇamādāya pūrṇamevāvaśiṣyate
</pre>
<p>По-русски это примерно так:</p>
<blockquote>
    То — бесконечность, и это — бесконечность. Бесконечность исходит из бесконечности,<br />
    Обретая бесконечность бесконечного, она остается лишь бесконечностью.<br />
</blockquote>
<p>На деванагари результат должен выглядеть так:</p>
<pre style="font-size: 15px">
पूर्णमदः पूर्णमिदम् पूर्णात् पूर्णमुदच्यते
पूर्णस्य पूर्णमादाय पूर्णमेवावशिष्यते
</pre>
<p>Как оказалось, если взять результат, сохранить в файл, а потом вывести на экран (например, командой <code>cat</code>), то получится полный бред:</p>
<pre style="font-size: 15px">
परणमदः परणमिदम परणात परणमदचयत
परणसय परणमादाय परणमवावशिषयत
</pre>
<p>В IAST это будет</p>
<pre style="font-size: 15px">
paraṇamadaḥ paraṇamidama paraṇāta paraṇamadacayata
paraṇasaya paraṇamādāya paraṇamavāvaśiṣayata
</pre>
<p>Что в корне отличается от того, что было в оригинале.</p>
<p>Тут нужно сделать парочку лирических отступлений: </p>
<ol>
<li>В деванагари есть такая особенность, что символы согласных звуков «по умолчанию» содержат гласный <code>a</code>. То есть <code>क</code> — это <code>ka</code>, а не <code>k</code>. Отсутствие этого <code>a</code> обозначается специальным подстрочным символом (символ <dfn>вирама</dfn> или <dfn>халант</dfn>). Например, комбинация, соответствующая звуку <code>k</code> будет записываться как <code>क्</code>.</li>
<li>Вторая особенность — гласные звуки имеют два варианта написания: гласный после гласной (или сам по себе) и после согласной записываются по-разному (во втором случае обычно используются диакритические знаки). Например, u — ku: उ — कु. </li>
</ol>
<p>Возвращаясь к примеру: если сравнить первое слово того, что должно быть и того, что получилось:</p>
<pre style="font-size: 15px">
पूर्णमदः — पू र् ण म दः — pū r ṇa ma daḥ
परणमदः — प र ण म दः — pa ra ṇa ma daḥ
</pre>
<p>Можно заметить одну особенность: терминал «обрезает» надстрочные и подстрочные символы (причём обрезает наглухо — при копировании копируется не исходный вариант, а обрезанный). Например, в पू подстрочный символ обозначает гласный ū (лирическое отступление №2), если подстрочный символ «обрезать», то останется просто प, который в соответствии с лирическим отступлением №1 будет pa.</p>
<pre style="font-size: 15px">
क	ka	=&gt;	क	ka
का	kā	=&gt;	का	kā
कि	ki	=&gt;	कि	ki
की	kī	=&gt;	की	kī
कु	ku	=&gt;	क	ka
कू	kū	=&gt;	क	ka
कृ	kṛ	=&gt;	क	ka
कॄ	kṝ	=&gt;	क	ka
कॢ	kḷ	=&gt;	क	ka
कॣ	kḹ	=&gt;	क	ka
के	ke	=&gt;	क	ka
कै	kai	=&gt;	क	ka
को	ko	=&gt;	को	ko
कौ	kau	=&gt;	कौ	kau
कँ	kam̐	=&gt;	क	ka
कं	kaṁ	=&gt;	क	ka
कः	kaḥ	=&gt;	कः	kaḥ
क्	k	=&gt;	क	ka
</pre>
<p>Видим, что в терминале очень не везёт гласным u, ū, ṛ, ṝ, ḷ, ḹ, e и дифтонгу ai — они тихо превращаются в <code>a</code>. Вирама также погибает смертью храбрых, в результате чего к согласным добавляется звук <code>a</code>. Анусвара (ṃ) и чандрабинду (m̐) обрезаются.</p>
<p>Какой можно сделать вывод? Индийские тексты в терминале нечитаемы. Вообще. И это в век повсеместного <a href="http://blog.sjinks.pro/tag/unicode/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Unicode">Unicode</a> и UTF-8! Честно говоря, в Linux достаточно проблем с <a href="http://blog.sjinks.pro/tag/unicode/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Unicode">Unicode</a>: <a href="https://bugs.launchpad.net/ubuntu/+source/apport/+bug/349081">apport не воспринимает русские символы</a>, <a href="https://bugs.launchpad.net/command-not-found/+bug/841914">command-not-found вылетает с ошибкой на не английских символах</a>, <a href="https://bugs.launchpad.net/inkscape/+bug/421199">Inkscape некорректно отображает деванагари</a>, те же проблемы в <a href="https://bugs.launchpad.net/ubuntu/+source/libreoffice/+bug/806211">LibreOffice</a>… Грустно…</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>nspluginwrapper: no appropriate viewer found for /usr/lib/flashplugin-installer/libflashplayer.so</title>
		<link>http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/</link>
		<comments>http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 23:34:06 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[64 bit]]></category>
		<category><![CDATA[Natty Narwhal]]></category>
		<category><![CDATA[Oneiric Ocelot]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=939</guid>
		<description><![CDATA[Исправление ошибки установки Flash Player в Ubuntu 11.10/AMD64 При обновлении Ubuntu Natty Narwhal до текущей альфы Oneiric Ocelot на архитектуре AMD64 возникает неприятная ошибка при обновлении пакета flashplugin-installer (Flash Player): package flashplugin-installer 10.3.183.4ubuntu3 failed to install/upgrade: nspluginwrapper: no appropriate viewer found for /usr/lib/flashplugin-installer/libflashplayer.so Лечение довольно простое: Необходимо включить поддержку multiarch, если она еще не включена: [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление ошибки установки Flash Player в <a href="http://blog.sjinks.pro/tag/ubuntu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Ubuntu">Ubuntu</a> 11.10/AMD64</em></h2>
<p>При обновлении Ubuntu <a href="http://blog.sjinks.pro/tag/natty-narwhal/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Natty Narwhal">Natty Narwhal</a> до текущей альфы <a href="http://blog.sjinks.pro/tag/oneiric-ocelot/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Oneiric Ocelot">Oneiric Ocelot</a> на архитектуре AMD64 возникает неприятная <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> при обновлении пакета flashplugin-installer (Flash Player):</p>
<p><strong><br />
package flashplugin-installer 10.3.183.4ubuntu3 failed to install/upgrade:<br />
nspluginwrapper: no appropriate viewer found for /usr/lib/flashplugin-installer/libflashplayer.so<br />
</strong><span id="more-939"></span></p>
<p>Лечение довольно простое:</p>
<ol>
<li>Необходимо <a href="https://lists.ubuntu.com/archives/ubuntu-devel-announce/2011-August/000886.html">включить поддержку multiarch</a>, если она еще не включена:
          
<div class="codebox">
    <div class="the_code" style="" id="p9393">
        <div class="code bash" id="p939code3">
<span class="kw3">echo</span> foreign-architecture i386 <span class="sy0">&gt;</span> <span class="sy0">/</span>etc<span class="sy0">/</span>dpkg<span class="sy0">/</span>dpkg.cfg.d<span class="sy0">/</span>multiarch<br />
<span class="kw2">apt-get</span> update
        </div>
    </div>
</div>

Это позволит устанавливать пакеты для архитектуры i386 на AMD64.
</li>
<li>Затем нужно установить пакеты <code>libnss3:i386</code> и <code>libcurl3:i386</code>:
          
<div class="codebox">
    <div class="the_code" style="" id="p9394">
        <div class="code bash" id="p939code4">
<span class="kw2">aptitude</span> <span class="kw2">install</span> libnss3:i386 libcurl3:i386
        </div>
    </div>
</div>

В зависимостях подтянутся пакеты <code>libnspr4:i386</code> и <code>libsqlite3-0:i386</code>.
</li>
</ol>
<p>После этого можно спокойно (пере)установить пакет <code>flashplugin-installer</code> — всё будет работать.</p>
<p>С отчётом об ошибке и комментариями пользователей можно ознакомиться <a href="https://bugs.launchpad.net/ubuntu/+source/flashplugin-nonfree/+bug/762968">здесь</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference</title>
		<link>http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/</link>
		<comments>http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/#comments</comments>
		<pubDate>Mon, 30 May 2011 16:13:54 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=918</guid>
		<description><![CDATA[Быстрое исправление &#039;relocation error&#039; Не везёт мне с PHP на CentOS… Ситуация: имеется сервер на CentOS с установленной CPanel. PHP в случайные моменты времени завершается с ошибкой вида php: relocation error: php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference Вместо zlibVersion может быть другое имя, например crc32. Из-за [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Быстрое исправление &#039;relocation error&#039;</em></h2>
<p><a href="http://blog.sjinks.pro/administering/460-upgrading-php-in-centos-5/">Не везёт</a> мне с <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> на <a href="http://blog.sjinks.pro/tag/centos/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CentOS">CentOS</a>…</p>
<p>Ситуация: имеется сервер на CentOS с установленной CPanel. PHP в случайные моменты времени завершается с ошибкой вида</p>
<p><strong>php: relocation error: php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference</strong></p>
<p>Вместо <code>zlibVersion</code> может быть другое имя, например <code>crc32</code>.</p>
<p>Из-за CPanel/WHM возможности ограничены опциями, предоставляемыми EasyApache — обновить MySQL/PHP штатными средствами (например, через <code>yum</code>) не представляется возможным из-за риска сломать CPanel.<span id="more-918"></span></p>
<p>Текст ошибки явно указывает на проблему с версией библиотеки, поэтому в первую очередь нужно выянить, где на сервере находится <code>libmysqlclient</code>. В моём случае это <code>/usr/lib64</code> и <code>/usr/lib64/mysql</code>.</p>
<p>Затем смотрим, какую из библиотек использует <code>php</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9188">
        <div class="code bash" id="p918code8">
$ <span class="kw2">ldd</span> <span class="sy0">`</span><span class="kw2">which</span> php<span class="sy0">`</span> <span class="sy0">|</span> <span class="kw2">grep</span> libmysqlclient<br />
&nbsp; &nbsp; &nbsp; &nbsp; libmysqlclient.so.16 =<span class="sy0">&gt;</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16 <span class="br0">&#40;</span>0x00000034c6000000<span class="br0">&#41;</span><br />
$ <span class="kw2">ls</span> <span class="re5">-la</span> <span class="sy0">`/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16<span class="sy0">`</span><br />
lrwxrwxrwx <span class="nu0">1</span> root root <span class="nu0">27</span> May <span class="nu0">29</span> 00:08 <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16 -<span class="sy0">&gt;</span> libmysqlclient.so.16.0.0<span class="sy0">*</span>
        </div>
    </div>
</div>

<p>Но <code>libmysqlclient.so.16.0.0</code> существует и в <code>/usr/lib64</code>, и в <code>/usr/lib64/mysql</code>, поэтому посмотрим, где нужный символ есть:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9189">
        <div class="code bash" id="p918code9">
$ <span class="kw2">nm</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16.0.0 <span class="sy0">|</span> <span class="kw2">grep</span> zlibVersion<br />
<span class="kw2">nm</span>: libmysqlclient.so.16.0.0: no symbols<br />
$ <span class="kw2">nm</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16.0.0 <span class="sy0">|</span> <span class="kw2">grep</span> zlibVersion<br />
00000034c60d64b0 T zlibVersion
        </div>
    </div>
</div>

<p>Меняем символьную ссылку на нужный файл:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91810">
        <div class="code bash" id="p918code10">
<span class="kw2">rm</span> <span class="re5">-f</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16<br />
<span class="kw3">cd</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<br />
<span class="kw2">ln</span> <span class="re5">-s</span> ..<span class="sy0">/</span>libmysqlclient.so.16.0.0 libmysqlclient.so.16
        </div>
    </div>
</div>

<p>После чего <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> исчезает.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress, поиск и кириллица</title>
		<link>http://blog.sjinks.pro/wordpress/881-wordpress-search-cyrillic/</link>
		<comments>http://blog.sjinks.pro/wordpress/881-wordpress-search-cyrillic/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 14:11:53 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=881</guid>
		<description><![CDATA[Правильные результаты поиска при использовании красивых ссылок Есть у WordPress одна неприятная особенность: при использовании красивых ссылок и их использовании при поиске кириллических (или любых не-ASCII) слов получается совсем не тот результат, который ожидается. Например, есть такая ссылка: http://blog.sjinks.pro/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F/ %D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F — это слово «Генерация», закодированное функцией urlencode(). Ожидается, что WordPress будет искать статьи со словом «генерация». Но, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/881-wordpress-search-cyrillic/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Правильные результаты поиска при использовании красивых ссылок</em></h2>
<p>Есть у <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> одна неприятная особенность: при использовании <abbr title="permalinks">красивых ссылок</abbr> и их использовании при поиске кириллических (или любых не-ASCII) слов получается совсем не тот результат, который ожидается.</p>
<p>Например, есть такая ссылка:</p>
<p><a href="http://blog.sjinks.pro/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F/">http://blog.sjinks.pro/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F/</a></p>
<p><code>%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F</code> — это слово «Генерация», закодированное функцией <code>urlencode()</code>.</p>
<p>Ожидается, что WordPress будет искать статьи со словом «генерация». Но, так как разработчики WordPress — американцы, они не предполагают, что существуют буквы кроме английских <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Собственно, эта беда свойственна многим проектам с англоязычными авторами. Итак…<span id="more-881"></span></p>
<p>Проблема заключается в том, что WordPress выдаёт разные результаты для двух казалось бы идентичных запросов:</p>
<ol>
<li><strong>«Традиционный поиск» — без использования красивых ссылок</strong>:<br />
<a href="http://blog.sjinks.pro/?s=%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F">http://blog.sjinks.pro/?s=%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F</a><br />
<a href="http://static.sjinks.info/wp-content/uploads/2011/01/search-no-permalinks.png"><img src="http://static.sjinks.info/wp-content/uploads/2011/01/search-no-permalinks.png" alt="Поиск — без использования красивых ссылок" title="Поиск — без использования красивых ссылок" width="446" height="153" class="alignnone size-full wp-image-882" /></a></li>
<li><strong>Поиск с использованием красивых ссылок</strong>:<br />
<a href="http://blog.sjinks.pro/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F/">http://blog.sjinks.pro/search/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F/</a><br />
<a href="http://static.sjinks.info/wp-content/uploads/2011/01/search-permalinks.png"><img src="http://static.sjinks.info/wp-content/uploads/2011/01/search-permalinks.png" alt="Поиск с использованием красивых ссылок" title="Поиск с использованием красивых ссылок" width="439" height="267" class="alignnone size-full wp-image-883" /></a></li>
</ol>
<p>В первом случае WordPress вернул 6 результатов, во втором — только один. При этом в первом случае искомое слово отображается правильно, во втором — нет.</p>
<p>Если посмотреть на запросы при помощи <a href="http://blog.sjinks.pro/wordpress-plugins/sqlmon/">плагина SQLMon</a>, увидим такую картину: в первом случае запрос имеет вид</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p88114">
        <div class="code mysql" id="p881code14">
<span class="kw1">SELECT</span> <span class="kw1">SQL_CALC_FOUND_ROWS</span> wp_posts.<span class="sy1">*</span><br />
<span class="kw1">FROM</span> wp_posts <br />
<span class="kw1">WHERE</span> 1<span class="sy1">=</span>1 <br />
&nbsp; &nbsp; <span class="kw10">AND</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>wp_posts.post_title <span class="kw10">LIKE</span> <span class="st0">'<span class="es1">%</span>Генерация<span class="es1">%</span>'</span><span class="br0">&#41;</span> <span class="kw10">OR</span> <span class="br0">&#40;</span>wp_posts.post_content <span class="kw10">LIKE</span> <span class="st0">'<span class="es1">%</span>Генерация<span class="es1">%</span>'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw10">AND</span> wp_posts.post_type <span class="kw2">IN</span> <span class="br0">&#40;</span><span class="st0">'post'</span><span class="sy2">,</span> <span class="st0">'page'</span><span class="sy2">,</span> <span class="st0">'attachment'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw10">AND</span> <span class="br0">&#40;</span>wp_posts.post_status <span class="sy1">=</span> <span class="st0">'publish'</span> <span class="kw10">OR</span> wp_posts.post_status <span class="sy1">=</span> <span class="st0">'private'</span><span class="br0">&#41;</span><br />
<span class="kw1">ORDER BY</span> wp_posts.post_date <span class="kw1">DESC</span><br />
<span class="kw1">LIMIT</span> <span class="nu0">0</span><span class="sy2">,</span> <span class="nu0">10</span>
        </div>
    </div>
</div>

<p>Во втором случае запрос выглядит страшнее:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p88115">
        <div class="code mysql" id="p881code15">
<span class="kw1">SELECT</span> <span class="kw1">SQL_CALC_FOUND_ROWS</span> wp_posts.<span class="sy1">*</span><br />
<span class="kw1">FROM</span> wp_posts<br />
<span class="kw1">WHERE</span> 1<span class="sy1">=</span>1<br />
&nbsp; &nbsp; <span class="kw10">AND</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>wp_posts.post_title <span class="kw10">LIKE</span> <span class="st0">'<span class="es1">%</span><span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>93<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B5<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>BD<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B5<span class="es0">\\</span><span class="es1">%</span>D1<span class="es0">\\</span><span class="es1">%</span>80<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B0<span class="es0">\\</span><span class="es1">%</span>D1<span class="es0">\\</span><span class="es1">%</span>86<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B8<span class="es0">\\</span><span class="es1">%</span>D1<span class="es0">\\</span><span class="es1">%</span>8F<span class="es1">%</span>'</span><span class="br0">&#41;</span> <span class="kw10">OR</span> <span class="br0">&#40;</span>wp_posts.post_content <span class="kw10">LIKE</span> <span class="st0">'<span class="es1">%</span><span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>93<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B5<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>BD<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B5<span class="es0">\\</span><span class="es1">%</span>D1<span class="es0">\\</span><span class="es1">%</span>80<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B0<span class="es0">\\</span><span class="es1">%</span>D1<span class="es0">\\</span><span class="es1">%</span>86<span class="es0">\\</span><span class="es1">%</span>D0<span class="es0">\\</span><span class="es1">%</span>B8<span class="es0">\\</span><span class="es1">%</span>D1<span class="es0">\\</span><span class="es1">%</span>8F<span class="es1">%</span>'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw10">AND</span> wp_posts.post_type <span class="kw2">IN</span> <span class="br0">&#40;</span><span class="st0">'post'</span><span class="sy2">,</span> <span class="st0">'page'</span><span class="sy2">,</span> <span class="st0">'attachment'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw10">AND</span> <span class="br0">&#40;</span>wp_posts.post_status <span class="sy1">=</span> <span class="st0">'publish'</span> <span class="kw10">OR</span> wp_posts.post_status <span class="sy1">=</span> <span class="st0">'private'</span><span class="br0">&#41;</span><br />
<span class="kw1">ORDER BY</span> wp_posts.post_date <span class="kw1">DESC</span><br />
<span class="kw1">LIMIT</span> <span class="nu0">0</span><span class="sy2">,</span> <span class="nu0">10</span>
        </div>
    </div>
</div>

<p>Создаётся впечатление, что WordPress забыл выполнить <code>urldecode()</code>. Вполне вероятно, что этим никто и не озадачивался: при передаче параметров через строку запроса (как в первом случае) ответственность за перевод значений в «читаемую форму» лежит на <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>. А во втором случае закодированное значение является частью URI, поэтому <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> его не трогает.</p>
<p>Решение тривиально: в файл <code>functions.php</code> темы нужно добавить такой код (можно оформить плагином, но банально лень):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p88116">
        <div class="code php" id="p881code16">
&nbsp; &nbsp; <span class="kw2">function</span> my_request<span class="br0">&#40;</span><span class="re0">$vars</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wp_rewrite</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$wp_rewrite</span><span class="sy0">-&gt;</span><span class="me1">using_permalinks</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$vars</span><span class="br0">&#91;</span><span class="st_h">'s'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'s'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$vars</span><span class="br0">&#91;</span><span class="st_h">'s'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">urldecode</span><span class="br0">&#40;</span><span class="re0">$vars</span><span class="br0">&#91;</span><span class="st_h">'s'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$vars</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; add_filter<span class="br0">&#40;</span><span class="st_h">'request'</span><span class="sy0">,</span> <span class="st_h">'my_request'</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Хак применяется и на этом блоге, поэтому приведённые скриншоты более не воспроизводимы.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/881-wordpress-search-cyrillic/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/881-wordpress-search-cyrillic/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ionCube и xCache</title>
		<link>http://blog.sjinks.pro/zend/876-ioncube-xcache/</link>
		<comments>http://blog.sjinks.pro/zend/876-ioncube-xcache/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 04:58:09 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Zend]]></category>
		<category><![CDATA[ionCube]]></category>
		<category><![CDATA[segfault]]></category>
		<category><![CDATA[xCache]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=876</guid>
		<description><![CDATA[Случайные segmentation fault Вчера столкнулся с неожиданными ошибками php (segmentation fault) на сервере, на котором стояли ionCube Loader и xCache. Причем падения происходили исключительно при работе wp-cron.php. Тем, у кого похожая проблема и нет желания читать дальше: Загружайте xcache при помощи директивы extension, а не zend_extension (скажу честно, я не понял, в чём существенная разница, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/zend/876-ioncube-xcache/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Случайные segmentation fault</em></h2>
<p>Вчера столкнулся с неожиданными ошибками <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a> (segmentation fault) на сервере, на котором стояли <a href="http://blog.sjinks.pro/tag/ioncube/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ionCube">ionCube</a> Loader и <a href="http://blog.sjinks.pro/tag/xcache/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  xCache">xCache</a>. Причем падения происходили исключительно при работе <code>wp-cron.php</code>.<span id="more-876"></span></p>
<p>Тем, у кого похожая проблема и нет желания читать дальше:</p>
<ol>
<li>Загружайте xcache при помощи директивы <code>extension</code>, а не <code>zend_extension</code> (скажу честно, я не понял, в чём существенная разница, но, с другой стороны, на исходный код ionCube Loader никто посмотреть не даст).</li>
<li>Наложите мой <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> на исходный код xCache. Его можно найти в первом комментарии к <a href="https://bugs.launchpad.net/ubuntu/+source/xcache/+bug/688041">сообщению об ошибке</a>.</li>
</ol>
<p>Теперь технические подробности для тех, кому интересно.</p>
<p>Падение происходит непосредственно в ionCube Loader (дайте исходник!!!), трасса вызовов выглядит примерно так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87618">
        <div class="code text" id="p876code18">
#0 &nbsp;0x00007ffff452abdb in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#1 &nbsp;0x00007ffff4528a95 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#2 &nbsp;0x00007ffff452adb7 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#3 &nbsp;0x00007ffff4528a95 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#4 &nbsp;0x00007ffff452adb7 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#5 &nbsp;0x00007ffff4528a95 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#6 &nbsp;0x00007ffff452adb7 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#7 &nbsp;0x00007ffff4528a95 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#8 &nbsp;0x00007ffff452adb7 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#9 &nbsp;0x00007ffff4528a95 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#10 0x000000000078b12d in zend_call_function (fci=0x7fffffff96c0, fci_cache=0x7fffffff9710) at /root/php5-5.3.3/Zend/zend_execute_API.c:963<br />
#11 0x0000000000679c2c in zif_call_user_func_array (ht=2, return_value=0x8719540, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0) at /root/php5-5.3.3/ext/standard/basic_functions.c:4788<br />
#12 0x00000000007d0e2a in zend_do_fcall_common_helper_SPEC (execute_data=0x56b5480) at /root/php5-5.3.3/Zend/zend_vm_execute.h:316<br />
#13 0x00000000007d550f in ZEND_DO_FCALL_SPEC_CONST_HANDLER (execute_data=0x56b5480) at /root/php5-5.3.3/Zend/zend_vm_execute.h:1606<br />
#14 0x00000000007d0274 in execute (op_array=0x2c5ace0) at /root/php5-5.3.3/Zend/zend_vm_execute.h:107<br />
#15 0x00007ffff452adb7 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#16 0x00007ffff4528a95 in ?? () from /usr/lib/php5/20090626/ioncube_loader_lin_5.3.so<br />
#17 0x000000000078b12d in zend_call_function (fci=0x7fffffff9b90, fci_cache=0x7fffffff9be0) at /root/php5-5.3.3/Zend/zend_execute_API.c:963<br />
#18 0x0000000000679c2c in zif_call_user_func_array (ht=2, return_value=0x85fd8d8, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0) at /root/php5-5.3.3/ext/standard/basic_functions.c:4788<br />
#19 0x00000000007d0e2a in zend_do_fcall_common_helper_SPEC (execute_data=0x56b4088) at /root/php5-5.3.3/Zend/zend_vm_execute.h:316<br />
#20 0x00000000007d550f in ZEND_DO_FCALL_SPEC_CONST_HANDLER (execute_data=0x56b4088) at /root/php5-5.3.3/Zend/zend_vm_execute.h:1606<br />
#21 0x00000000007d0274 in execute (op_array=0x601eba0) at /root/php5-5.3.3/Zend/zend_vm_execute.h:107<br />
#22 0x00000000007d0fed in zend_do_fcall_common_helper_SPEC (execute_data=0x56b3858) at /root/php5-5.3.3/Zend/zend_vm_execute.h:340<br />
#23 0x00000000007d1526 in ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER (execute_data=0x56b3858) at /root/php5-5.3.3/Zend/zend_vm_execute.h:421<br />
#24 0x00000000007d0274 in execute (op_array=0x79ab1b8) at /root/php5-5.3.3/Zend/zend_vm_execute.h:107<br />
#25 0x000000000079ad95 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /root/php5-5.3.3/Zend/zend.c:1266<br />
#26 0x00000000007225c6 in php_execute_script (primary_file=0x7fffffffc3f0) at /root/php5-5.3.3/main/main.c:2288<br />
#27 0x000000000087ef85 in main (argc=6, argv=0x7fffffffe6a8) at /root/php5-5.3.3/sapi/cgi/cgi_main.c:2117
        </div>
    </div>
</div>

<p>Разбор кадров стека показал:</p>
<ul>
<li>21 кадр: <code>wp-cron.php</code> через вызов <code>do_action_ref_array()</code> вызывает код, находящийся в закодированном файле; управление передаётся загрузчику ioncube (16 кадр);</li>
<li>15 кадр: закодированный файл вызывает <code>do_action()</code> — управление передаётся в нормальный код;</li>
<li>14 кадр: <code>do_action()</code> вызывает функцию из зашифрованного файла через <code>call_user_func_array()</code>;</li>
<li>9 кадр: загрузчик получает управление;</li>
<li>8 кадр (а также 6, 4, 2): судя по адресу (<code>0x00007ffff452adb7</code>), совпадающему с адресом из 15 кадра, вызывается что-то не закодированное;</li>
<li>кадры 7, 5, 3, 1: похоже на вызов функций в закодированном файле из обычного кода;</li>
<li>0 кадр: <a href="http://blog.sjinks.pro/tag/segfault/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  segfault">segfault</a>. Что интересно, не по адресу <code>0x00007ffff452adb7</code>, а, судя по всему, на инструкцию позже (исходники дайте, блин!).</li>
</ul>
<p>Естественно, что тех поддержка ionCube всё сваливает на xCache — ведь без xCache всё работает. Но в xCache с виду всё чисто.</p>
<p>Совершенно случайно обнаружилось, что если xCache загружать через директиву <code>extension</code>, то ошибки не происходит. С другой стороны, в обоих случаях выполняется один и тот же код (с разницей в том, что загружается первым: расширение PHP или расширение Zend). Лично мне кажется, что <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> где-то в коде загрузчика ionCube, но разработчики последнего со мной не согласны.</p>
<p><strong>UPD:</strong> в конечном итоге снёс xCache, поставил APC — полёт нормальный.<br />
<strong>UPD2:</strong> а еще экспериментально выяснилось, что ionCube Encoder сохраняет в зашифрованном файле информацию о том, какая лицензия ionCube (именно лицензия на кодировщик!) использовалась при шифровании, что позволяет установить (сотрудникам ionCube), покупателя ionCube Encoder. Nick проговорился <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/zend/876-ioncube-xcache/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/zend/876-ioncube-xcache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ICS Security Fixes: исправление уязвимостей в прошлых версиях WordPress</title>
		<link>http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/</link>
		<comments>http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 14:10:06 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[ICS Security Fixes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=873</guid>
		<description><![CDATA[Попытка сделать старые версии WordPress безопаснее. Многие блоггеры не торопятся с обновлением WordPress, особенно когда дело касается новых релизов WordPress: по традиции, каждый новый релиз потребляет больше памяти, чем предыдущий, создаёт бóльшую нагрузку на базу и содержит новые, мало кому нужные функции А еще говорят, что нельзя обновляться до версии x.y.0, нужно обязательно ждать x.y.1 Что [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Попытка сделать старые версии <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> безопаснее.</em></h2>
<p>Многие блоггеры не торопятся с обновлением WordPress, особенно когда дело касается новых релизов WordPress: по традиции, каждый новый релиз потребляет больше памяти, чем предыдущий, создаёт бóльшую нагрузку на базу и содержит новые, мало кому нужные функции <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  А еще говорят, что нельзя обновляться до версии x.y.0, нужно обязательно ждать x.y.1 <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Что же, доля истины во всём этом есть, но есть и одно большое НО: все эти обновления, включая новые релизы, обычно содержат важные исправления безопасности, причём иногда разработчики об этом могут не догадываться.</p>
<p>К сожалению, разработчики не делают бэкпорты исправлений в старые ветки, и те, кто по тем или иным соображениям остаётся на старом WordPress, остаются уязвимыми.<span id="more-873"></span></p>
<p>Вчера судьба меня свела с человеком с ником <a href="http://snipper.ru/">M4g</a>, обладающим отменными знаниями уязвимостей WordPress самых различных версий. Он любезно предоставил ссылки на свои статьи, касающиеся уязвимостей WordPress. Своё профессиональное знакомство с WordPress я начинал с версии 2.5, поэтому в статьях обнаружил достаточно много откровений для себя. Но дело не в этом. От прочитанного в голову пришла мысль написать <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a>, максимально совместимый с предыдущими версиями WordPress, который бы пытался исправить известные уязвимости, не заставляя пользователя при этом обновлять WordPress.</p>
<p>Естественно, что таким образом можно исправить далеко не всё (например, <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a> в Snoopy на FreeBSD так не исправить), но отфильтровать параметры запросов или запросы к базе данных вполне реально (хотя тоже не всегда).</p>
<p>Так родился плагин <a href="http://blog.sjinks.pro/tag/ics-security-fixes/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ICS Security Fixes">ICS Security Fixes</a>.</p>
<p><strong>Версия 0.1 содержит следующие исправления:</strong></p>
<ul>
<li>отключение whitelisting&#8217;а для трэкбэков/пингбэков (то, что было сделано в 3.0.2 и тянется с 1.x);</li>
<li>попытка борьбы с SQL truncation attack при регистрации пользователя;</li>
<li>исправления, призванные не допустить SQL injection attack при обработке трэкбэков;</li>
<li>исправление CVE-2008-4769;</li>
<li>Old slug redirect bug fix;</li>
<li>Попытка исправления ошибки cURL, связанной с перенаправлением на URI с протоколами <code>file://</code> и <code>scp://</code> (трудно сказать про работоспособность, ибо такой древний cURL найти трудно);</li>
<li>Исправление SQL injection в <code>wp_insert_attachment()</code>;</li>
<li>Тупой способ для борьбы с подменой фидов;</li>
<li>Защита от атаки на генератор псевдослучайных чисел (надеюсь, что получилось — сгенерировать 80-гигабайтные радужные таблицы нет возможности);</li>
<li>Попытка защиты от 2.7.x/2.8.x admin remote code execution exploit;</li>
<li>Исправление Wordpress 2.5 Cookie Integrity Protection Vulnerability;</li>
<li>Исправление ошибки со сбросом пароля в 2.5.1.</li>
</ul>
<p><strong>Версия 0.2:</strong></p>
<ul>
<li>Исправление ошибок, связанных с активацией плагина;</li>
<li>Установка версии по умолчанию для скриптов и таблиц стилей в 0.0.</li>
</ul>
<p><strong>Версия 0.3:</strong></p>
<ul>
<li>Исправление ошибок в предыдущих версиях (спасибо <strong><a href="http://profiles.wordpress.org/sergeybiryukov/">Сергею Бирюкову</a></strong> за <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a>);</li>
<li>Сокрытие версий используемых таблиц стилей и скриптов (удаление параметра <code>ver</code> из строки запроса; кстати, Google рекомендует <a href="http://code.google.com/intl/ru/speed/page-speed/docs/caching.html#LeverageProxyCaching">не использовать</a> строку запроса в URL статических ресурсов);</li>
<li>Частично закрыта уязвимость <a href="http://secunia.com/advisories/23621/">SA23621</a> — пользователь получает одно и то же сообщение об ошибке и при неверном имени пользователя, и при неверном пароле. Тем не менее, проверка существования пользователя возможна путём использования функции напоминания пароля;</li>
<li>По многочисленным просьбам добавлено сокрытие версии плагина All in One SEO Pack.</li>
</ul>
<p><strong>Версия 0.4:</strong></p>
<ul>
<li>Закрытие уязвимостей, исправленных в WordPress 3.0.5 (r17393, r17387, r17400, r17406).</li>
</ul>
<p>Хочу выразить большую благодарность <strong><a href="http://profiles.wordpress.org/sergeybiryukov/">Сергею Бирюкову</a></strong> за тестирование и патч, исправляющий ошибки. Спасибо!</p>
<p><strong>Дальнейшее направление работы:</strong></p>
<ul>
<li>Бэкпортирование патчей уязвимостей для <a href="http://secunia.com/advisories/product/33191/?task=advisories">серии 3.x</a>;</li>
<li>Бэкпортирование патчей и закрытие незакрытых уязвимостей для <a href="http://secunia.com/advisories/product/6745/?task=advisories">серии 2.x</a>.</li>
</ul>
<p>У кого есть ссылки на рабочие эксплойты для WordPress любых версий и кто может ими поделиться, а также те, кто готов помочь с тестированием — you are welcome!</p>
<p><strong><a href="http://static.sjinks.info/wp-content/uploads/ics-security-fixes-0.4.zip">Скачать последнюю версию ICS Security Fixes</a></strong></p>
<p><strong style="color: red">Внимание:</strong> перед обновлением плагин <strong>должен</strong> быть деактивирован, после обновления — активирован. Это связано с некоторыми неприятными особенностями WordPress 3.1, а также тем, что для некоторых версий WordPress подменяются функции проверки cookies.</p>
<p><strong>UPDATE  Feb 15, 2010:</strong><br />
Страница плагина теперь живёт здесь: http://blog.sjinks.pro/wordpress-plugins/ics-security-fixes/<br />
Страница плагина на wordpress.org: http://wordpress.org/extend/plugins/ics-security-fixes/</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Официальный русский WordPress и SSL</title>
		<link>http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/</link>
		<comments>http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 13:15:22 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=871</guid>
		<description><![CDATA[Исправление проблем с SSL при использовании официального русского WordPress На днях понадобилось прикрутить к русскоязычному сайту, использующему WordPress, SSL. SSL требовался только в админке, поэтому решалось всё просто: define(&#34;FORCE_SSL_LOGIN&#34;, true); define(&#34;FORCE_SSL_ADMIN&#34;, true); Но после логина и захода в панель администрирования браузер сказал, что соединение не является полностью защищённым — присутствовали объекты, которые загружались по HTTP, а не [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление проблем с <a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">SSL</a> при использовании официального русского <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a></em></h2>
<p>На днях понадобилось прикрутить к русскоязычному сайту, использующему WordPress, SSL. SSL требовался только в админке, поэтому решалось всё просто:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87124">
        <div class="code php" id="p871code24">
<span class="kw1">define</span><span class="br0">&#40;</span><span class="st0">&quot;FORCE_SSL_LOGIN&quot;</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">define</span><span class="br0">&#40;</span><span class="st0">&quot;FORCE_SSL_ADMIN&quot;</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Но после логина и захода в панель администрирования браузер сказал, что соединение не является полностью защищённым — присутствовали объекты, которые загружались по HTTP, а не <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>.<span id="more-871"></span></p>
<p>Быстрый взгляд на исходный текст страницы и виновные найдены:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87125">
        <div class="code html" id="p871code25">
<span class="sc2">&lt;<span class="kw2">link</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">'stylesheet'</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">'ru_RU-css'</span> &nbsp;<span class="kw3">href</span><span class="sy0">=</span><span class="st0">'http://site.com/wp-content/languages/ru_RU.css?ver=20100615'</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">'text/css'</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">'all'</span> <span class="sy0">/</span>&gt;</span><br />
<span class="sc-2">&lt;!--[if IE]&gt;</span><br />
<span class="sc-2">&lt;link rel='stylesheet' id='ru_RU-ie-css' &nbsp;href='http://site.com/wp-content/languages/ru_RU-ie.css?ver=20100615' type='text/css' media='all' /&gt;</span><br />
<span class="sc-2">&lt;![endif]--&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">link</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">'stylesheet'</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">'ms-ru_RU-css'</span> &nbsp;<span class="kw3">href</span><span class="sy0">=</span><span class="st0">'http://site.com/wp-content/languages/ms-ru_RU.css?ver=20100615'</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">'text/css'</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">'all'</span> <span class="sy0">/</span>&gt;</span>
        </div>
    </div>
</div>

<p>Эти три таблицы стилей грузятся с http, в то время как все остальные ресурсы грузятся с https. А путь (<code>wp-content/languages/</code>) указывает на то, что проблемы были вызваны файлами локализации. Заходим в <code>wp-content/languages/</code>, видим файл <code>ru_RU.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>, смотрим:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87126">
        <div class="code php" id="p871code26">
<span class="kw2">&lt;?php</span><br />
<span class="re0">$wp_default_secret_key</span> <span class="sy0">=</span> <span class="st_h">'впишите сюда уникальную фразу'</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Make the menu wider and correct some overlapping issues</span><br />
<span class="kw2">function</span> ru_accomodate_markup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$locale</span><span class="sy0">,</span> <span class="re0">$wp_styles</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="re0">$locale</span><span class="sy0">,</span> WP_CONTENT_URL <span class="sy0">.</span> <span class="st0">&quot;/languages/<span class="es4">$locale</span>.css&quot;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> WP_CONTENT_URL <span class="sy0">.</span> <span class="st0">&quot;/languages/<span class="es4">$locale</span>-ie.css&quot;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> is_multisite<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;ms-<span class="es4">$locale</span>&quot;</span><span class="sy0">,</span> WP_CONTENT_URL <span class="sy0">.</span> <span class="st0">&quot;/languages/ms-<span class="es4">$locale</span>.css&quot;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$wp_styles</span><span class="sy0">-&gt;</span><span class="me1">add_data</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> <span class="st_h">'conditional'</span><span class="sy0">,</span> <span class="st_h">'IE'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_print_styles<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'admin_head'</span><span class="sy0">,</span> <span class="st_h">'ru_accomodate_markup'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_populate_options<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; add_option<span class="br0">&#40;</span><span class="st_h">'rss_language'</span><span class="sy0">,</span> <span class="st_h">'ru'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'populate_options'</span><span class="sy0">,</span> <span class="st_h">'ru_populate_options'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_restore_scripts_l10n<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wp_scripts</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">is_a</span><span class="br0">&#40;</span><span class="re0">$wp_scripts</span><span class="sy0">,</span> <span class="st_h">'WP_Scripts'</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; do_action_ref_array<span class="br0">&#40;</span><span class="st_h">'wp_default_scripts'</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$wp_scripts</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'init'</span><span class="sy0">,</span> <span class="st_h">'ru_restore_scripts_l10n'</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Очевидно, что проблема заключается в использовании константы <code>WP_CONTENT_URL</code> — если URL сайта начинается с http://, то вне зависимости от значений констант <code>FORCE_SSL_xxx</code> значение <code>WP_CONTENT_URL</code> всегда будет начинаться с http://. Что недопустимо при использовании SSL.</p>
<p>Лечение простое: заменить <code>WP_CONTENT_URL</code> на вызов функции <code>content_url()</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87127">
        <div class="code php" id="p871code27">
<span class="kw2">&lt;?php</span><br />
<span class="re0">$wp_default_secret_key</span> <span class="sy0">=</span> <span class="st_h">'впишите сюда уникальную фразу'</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Make the menu wider and correct some overlapping issues</span><br />
<span class="kw2">function</span> ru_accomodate_markup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$locale</span><span class="sy0">,</span> <span class="re0">$wp_styles</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="re0">$locale</span><span class="sy0">,</span> content_url<span class="br0">&#40;</span><span class="st0">&quot;languages/<span class="es4">$locale</span>.css&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> content_url<span class="br0">&#40;</span><span class="st0">&quot;languages/<span class="es4">$locale</span>-ie.css&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> is_multisite<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;ms-<span class="es4">$locale</span>&quot;</span><span class="sy0">,</span> content_url<span class="br0">&#40;</span><span class="st0">&quot;languages/ms-<span class="es4">$locale</span>.css&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$wp_styles</span><span class="sy0">-&gt;</span><span class="me1">add_data</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> <span class="st_h">'conditional'</span><span class="sy0">,</span> <span class="st_h">'IE'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_print_styles<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'admin_head'</span><span class="sy0">,</span> <span class="st_h">'ru_accomodate_markup'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_populate_options<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; add_option<span class="br0">&#40;</span><span class="st_h">'rss_language'</span><span class="sy0">,</span> <span class="st_h">'ru'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'populate_options'</span><span class="sy0">,</span> <span class="st_h">'ru_populate_options'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_restore_scripts_l10n<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wp_scripts</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">is_a</span><span class="br0">&#40;</span><span class="re0">$wp_scripts</span><span class="sy0">,</span> <span class="st_h">'WP_Scripts'</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; do_action_ref_array<span class="br0">&#40;</span><span class="st_h">'wp_default_scripts'</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$wp_scripts</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'init'</span><span class="sy0">,</span> <span class="st_h">'ru_restore_scripts_l10n'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Патч:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87128">
        <div class="code diff" id="p871code28">
--- ru_RU.php.orig&nbsp; 2010-12-01 14:01:46.000000000 +0200<br />
<span class="re4">+++ ru_RU.php &nbsp; <span class="nu0">2010</span>-<span class="nu0">12</span>-01 <span class="nu0">14</span>:<span class="nu0">59</span>:<span class="nu0">25.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">5</span>,<span class="nu0">10</span> +<span class="nu0">5</span>,<span class="nu0">10</span> @@</span><br />
&nbsp;function ru_accomodate_markup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; global $locale, $wp_styles;<br />
&nbsp;<br />
<span class="re7">- &nbsp; wp_enqueue_style<span class="br0">&#40;</span>$locale, WP_CONTENT_URL . &quot;/languages/$locale.css&quot;, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;$locale-ie&quot;, WP_CONTENT_URL . &quot;/languages/$locale-ie.css&quot;, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; wp_enqueue_style<span class="br0">&#40;</span>$locale, content_url<span class="br0">&#40;</span>&quot;languages/$locale.css&quot;<span class="br0">&#41;</span>, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;$locale-ie&quot;, content_url<span class="br0">&#40;</span>&quot;languages/$locale-ie.css&quot;<span class="br0">&#41;</span>, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> is_multisite<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;ms-$locale&quot;, WP_CONTENT_URL . &quot;/languages/ms-$locale.css&quot;, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;ms-$locale&quot;, content_url<span class="br0">&#40;</span>&quot;languages/ms-$locale.css&quot;<span class="br0">&#41;</span>, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; $wp_styles-&gt;add_data<span class="br0">&#40;</span>&quot;$locale-ie&quot;, 'conditional', 'IE'<span class="br0">&#41;</span>;<br />
&nbsp;<br />
&nbsp; &nbsp; wp_print_styles<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        </div>
    </div>
</div>

<p>Интересно, кому об этой ошибке сообщать?</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Очередная партия исправлений для Simple Tags</title>
		<link>http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 18:30:49 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=841</guid>
		<description><![CDATA[Cannot load st_mass_tags Благодаря одному из своих читателей я узнал, что у плагина Simple Tags помимо проблем, которые я регулярно исправляю, есть еще одна: при попытке зайти в Posts » Mass edit terms » All Pages выдаётся сообщение Невозможно загрузить st_mass_tags. Об ошибке автору сообщили на форуме поддержки, но так как автор в комментариях не отметился, пришлось исправлять плагин [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Cannot load st_mass_tags</em></h2>
<p>Благодаря одному из своих <a href="http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/comment-page-1/#comment-3556">читателей</a> я узнал, что у плагина <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a> помимо проблем, которые я <a href="http://blog.sjinks.pro/tag/simple-tags/">регулярно исправляю</a>, есть еще одна: при попытке зайти в Posts » Mass edit terms » All Pages выдаётся сообщение <strong>Невозможно загрузить st_mass_tags</strong>.<span id="more-841"></span></p>
<p>Об ошибке автору <a href="http://wordpress.org/support/topic/plugin-simple-tags-cannot-load-st_mass_tags?replies=1">сообщили</a> на форуме поддержки, но так как автор в комментариях не отметился, пришлось исправлять <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> самостоятельно.</p>
<p>Как оказалось, всё дело в вызове <code>add_posts_page()</code>. Дело в том, что эта функция регистрирует страницу плагина в системе только для меню «Записи» (Posts). Ссылки «Все записи», «Черновики», «Опубликованные» работают нормально, так как в их основе <code>/wp-admin/edit.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a>?page=st_mass_tags</code>. А ссылка «Все страницы» (<code>/wp-admin/edit.php?page=st_mass_tags&amp;post_type=page</code>) уже не работает — из-за <code>post_type=page</code>. А всё потому, что <code>edit.php?post_type=page</code> — это уже другое меню (Страницы/Pages), для которого <code>add_posts_page()</code> не работает. Для того, чтобы зарегистрировать страницу в этом меню, нужно использовать функцию <code>add_pages_page()</code>.</p>
<p>Но при использовании <code>add_pages_page()</code> ссылка на страницу появится в меню «Страницы», а это, скорее всего, не совсем то, что хотел автор (фактически, у нас бы получилось два пункта «Mass Edit Terms» — один в меню записей, другой в меню страниц). Поэтому для чистого решения проблемы нужно проэмулировать работу функции <code>add_pages_page()</code>, но не создавать запись в меню.</p>
<p>Решение получается очень простым:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84130">
        <div class="code diff" id="p841code30">
--- simple-tags/inc/admin.orig.php&nbsp; 2010-10-24 15:31:16.000000000 +0300<br />
<span class="re4">+++ simple-tags/inc/admin.php &nbsp; <span class="nu0">2010</span>-<span class="nu0">10</span>-<span class="nu0">24</span> <span class="nu0">15</span>:<span class="nu0">59</span>:<span class="nu0">37.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">231</span>,<span class="nu0">6</span> +<span class="nu0">231</span>,<span class="nu0">17</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add_posts_page<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Simple Terms: Mass Edit Terms', 'simpletags'<span class="br0">&#41;</span>, __<span class="br0">&#40;</span>'Mass Edit Terms', 'simpletags'<span class="br0">&#41;</span>, 'simple_tags', 'st_mass_tags', array<span class="br0">&#40;</span>&amp;$this, 'pageMassEditTags'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; add_posts_page<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Simple Terms: Auto Terms', 'simpletags'<span class="br0">&#41;</span>, __<span class="br0">&#40;</span>'Auto Terms', 'simpletags'<span class="br0">&#41;</span>, 'simple_tags', 'st_auto', array<span class="br0">&#40;</span>&amp;$this, 'pageAutoTags'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; add_options_page<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Simple Tags: Options', 'simpletags'<span class="br0">&#41;</span>, __<span class="br0">&#40;</span>'Simple Tags', 'simpletags'<span class="br0">&#41;</span>, 'admin_simple_tags', 'st_options', array<span class="br0">&#40;</span>&amp;$this, 'pageOptions'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; global $_registered_pages, $_wp_real_parent_file;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $menu_slug &nbsp; = plugin_basename<span class="br0">&#40;</span>'st_mass_tags'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $parent_slug = plugin_basename<span class="br0">&#40;</span>'edit.php?post_type=page'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>isset<span class="br0">&#40;</span>$_wp_real_parent_file<span class="br0">&#91;</span>$parent_slug<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $parent_slug = $_wp_real_parent_file<span class="br0">&#91;</span>$parent_slug<span class="br0">&#93;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $hookname = get_plugin_page_hookname<span class="br0">&#40;</span>$menu_slug, $parent_slug<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; add_action<span class="br0">&#40;</span>$hookname, array<span class="br0">&#40;</span>&amp;$this, 'pageMassEditTags'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $_registered_pages<span class="br0">&#91;</span>$hookname<span class="br0">&#93;</span> = true;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; /**
        </div>
    </div>
</div>

<p>Специально для тех, у кого слово <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> вызывает нехорошие мысли, я собрал исправленную версию плагина, в которой:</p>
<ul>
<li>Устранена эта самая <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">добавлена поддержка UTF-8 в автоматических ссылках</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">оптимизирован вызов <code>register_uninstall_hook()</code></a>;</li>
<li>исправлена проблема с локализацией (спасибо <a href="http://blog.sjinks.pro/wordpress/patches/821-fixing-simple-tags-1-8/comment-page-1/#comment-3469">Analitik</a>).</li>
</ul>
<p><strong id="download"><a href="http://d.sjinks.pro/wordpress/simple-tags-1.8.2.zip" rel="nofollow">Скачать исправленный плагин Simple Tags 1.8.2</a></strong>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/841-new-patches-for-simple-tags/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ошибка сборки модуля VMware vsock для ядра Linux 2.6.35</title>
		<link>http://blog.sjinks.pro/linux/837-vmware-vsock-compilation-error/</link>
		<comments>http://blog.sjinks.pro/linux/837-vmware-vsock-compilation-error/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 11:15:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=837</guid>
		<description><![CDATA[/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3233: error: ‘struct sock’ has no member named ‘sk_sleep’ При сборке модуля vsock VMware Player 3.x или VMware WorkStation 7.1 для ядра Linux 2.6.35 могут возникать подобные ошибки компиляции: CC [M] /tmp/vmware-root/modules/vsock-only/linux/af_vsock.o /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciStreamConnect’: /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3233: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3256: error: ‘struct sock’ has no member named ‘sk_sleep’ /tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3268: [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/837-vmware-vsock-compilation-error/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>/tmp/<a href="http://blog.sjinks.pro/tag/vmware/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  VMware">vmware</a>-root/modules/vsock-only/<a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">linux</a>/af_vsock.c:3233: error: ‘struct sock’ has no member named ‘sk_sleep’</em></h2>
<p>При сборке модуля vsock VMware Player 3.x или VMware WorkStation 7.1 для ядра Linux 2.6.35 могут возникать подобные ошибки компиляции:</p>
<p><strong>  CC [M]  /tmp/vmware-root/modules/vsock-only/linux/af_vsock.o<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciStreamConnect’:<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3233: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3256: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3268: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciAccept’:<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3328: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3344: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3378: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciPoll’:<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:3476: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciStreamSendmsg’:<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4116: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4153: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4206: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c: In function ‘VSockVmciStreamRecvmsg’:<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4440: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4480: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
/tmp/vmware-root/modules/vsock-only/linux/af_vsock.c:4546: error: ‘struct sock’ has no member named ‘sk_sleep’<br />
</strong></p>
<p>Это не фатально, так как VMware может работать и без vsock, но при каждом запуске будет пересобирать и устанавливать модули заново. Неприятно, но лечится.<span id="more-837"></span></p>
<p>Проблема здесь в том, что в ядрах 2.6.35 в <code>struct sock</code> члена <code>sk_sleep</code> больше нет —  вместо него используется <code>sk_sleep()</code>.</p>
<p>Патч тривиален:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p83732">
        <div class="code diff" id="p837code32">
diff -uwdBrN vsock-only.orig/linux/af_vsock.c vsock-only/linux/af_vsock.c<br />
<span class="re3">--- vsock-only.orig/linux/af_vsock.c&nbsp; &nbsp; <span class="nu0">2010</span>-09-<span class="nu0">21</span> 09:<span class="nu0">17</span>:<span class="nu0">24.000000000</span> +0300</span><br />
<span class="re4">+++ vsock-only/linux/af_vsock.c <span class="nu0">2010</span>-<span class="nu0">10</span>-08 01:<span class="nu0">18</span>:<span class="nu0">09.193864493</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">3230</span>,<span class="nu0">7</span> +<span class="nu0">3230</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp;* a notification of an error.<br />
&nbsp; &nbsp; &nbsp;*/<br />
&nbsp; &nbsp; timeout = sock_sndtimeo<span class="br0">&#40;</span>sk, flags &amp; O_NONBLOCK<span class="br0">&#41;</span>;<br />
<span class="re7">- &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; while <span class="br0">&#40;</span>sk-&gt;compat_sk_state != SS_CONNECTED &amp;&amp; sk-&gt;compat_sk_err == 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>timeout == 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">3253</span>,<span class="nu0">7</span> +<span class="nu0">3253</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; goto outWaitError;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp;compat_cont_prepare_to_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp;compat_cont_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>sk-&gt;compat_sk_err<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">3265</span>,<span class="nu0">7</span> +<span class="nu0">3265</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp;outWait:<br />
<span class="re7">- &nbsp; compat_finish_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_finish_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
&nbsp;out:<br />
&nbsp; &nbsp; release_sock<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; return err;<br />
<span class="re6">@@ -<span class="nu0">3325</span>,<span class="nu0">7</span> +<span class="nu0">3325</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp;* upon connection establishment.<br />
&nbsp; &nbsp; &nbsp;*/<br />
&nbsp; &nbsp; timeout = sock_sndtimeo<span class="br0">&#40;</span>listener, flags &amp; O_NONBLOCK<span class="br0">&#41;</span>;<br />
<span class="re7">- &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>listener-&gt;compat_sk_sleep, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>listener<span class="br0">&#41;</span>, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; while <span class="br0">&#40;</span><span class="br0">&#40;</span>connected = VSockVmciDequeueAccept<span class="br0">&#40;</span>listener<span class="br0">&#41;</span><span class="br0">&#41;</span> == NULL &amp;&amp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;listener-&gt;compat_sk_err == 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">3341</span>,<span class="nu0">7</span> +<span class="nu0">3341</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; goto outWait;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp;compat_cont_prepare_to_wait<span class="br0">&#40;</span>listener-&gt;compat_sk_sleep, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp;compat_cont_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>listener<span class="br0">&#41;</span>, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>listener-&gt;compat_sk_err<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">3375</span>,<span class="nu0">7</span> +<span class="nu0">3375</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp;outWait:<br />
<span class="re7">- &nbsp; compat_finish_wait<span class="br0">&#40;</span>listener-&gt;compat_sk_sleep, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_finish_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>listener<span class="br0">&#41;</span>, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
&nbsp;out:<br />
&nbsp; &nbsp; release_sock<span class="br0">&#40;</span>listener<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; return err;<br />
<span class="re6">@@ -<span class="nu0">3473</span>,<span class="nu0">7</span> +<span class="nu0">3473</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; sk = sock-&gt;sk;<br />
&nbsp; &nbsp; vsk = vsock_sk<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re7">- &nbsp; poll_wait<span class="br0">&#40;</span>file, sk-&gt;compat_sk_sleep, wait<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; poll_wait<span class="br0">&#40;</span>file, compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, wait<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; mask = <span class="nu0">0</span>;<br />
&nbsp;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>sk-&gt;compat_sk_err<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">4113</span>,<span class="nu0">7</span> +<span class="nu0">4113</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;goto out;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re7">- &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; while <span class="br0">&#40;</span>totalWritten &lt; len<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;Bool sentWrote;<br />
<span class="re6">@@ -<span class="nu0">4150</span>,<span class="nu0">7</span> +<span class="nu0">4150</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto outWait;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; compat_cont_prepare_to_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep,</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; compat_cont_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re6">@@ -<span class="nu0">4203</span>,<span class="nu0">7</span> +<span class="nu0">4203</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>totalWritten &gt; 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;err = totalWritten;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="re7">- &nbsp; compat_finish_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_finish_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
&nbsp;out:<br />
&nbsp; &nbsp; release_sock<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; return err;<br />
<span class="re6">@@ -<span class="nu0">4437</span>,<span class="nu0">7</span> +<span class="nu0">4437</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;goto out;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re7">- &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_init_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; while <span class="br0">&#40;</span><span class="br0">&#40;</span>ready = VSockVmciStreamHasData<span class="br0">&#40;</span>vsk<span class="br0">&#41;</span><span class="br0">&#41;</span> &lt; target &amp;&amp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sk-&gt;compat_sk_err == 0 &amp;&amp;<br />
<span class="re6">@@ -<span class="nu0">4477</span>,<span class="nu0">7</span> +<span class="nu0">4477</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; goto outWait;<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
&nbsp;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp;compat_cont_prepare_to_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp;compat_cont_prepare_to_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_INTERRUPTIBLE<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>sk-&gt;compat_sk_err<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">4543</span>,<span class="nu0">7</span> +<span class="nu0">4543</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; err = copied;<br />
&nbsp;<br />
&nbsp;outWait:<br />
<span class="re7">- &nbsp; compat_finish_wait<span class="br0">&#40;</span>sk-&gt;compat_sk_sleep, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; compat_finish_wait<span class="br0">&#40;</span>compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>, &amp;wait, TASK_RUNNING<span class="br0">&#41;</span>;</span><br />
&nbsp;out:<br />
&nbsp; &nbsp; release_sock<span class="br0">&#40;</span>sk<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; return err;<br />
diff -uwdBrN vsock-only.orig/shared/compat_sock.h vsock-only/shared/compat_sock.h<br />
<span class="re3">--- vsock-only.orig/shared/compat_sock.h&nbsp; &nbsp; <span class="nu0">2010</span>-09-<span class="nu0">21</span> 09:<span class="nu0">17</span>:<span class="nu0">22.000000000</span> +0300</span><br />
<span class="re4">+++ vsock-only/shared/compat_sock.h <span class="nu0">2010</span>-<span class="nu0">10</span>-08 01:<span class="nu0">15</span>:<span class="nu0">31.667045243</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">68</span>,<span class="nu0">6</span> +<span class="nu0">68</span>,<span class="nu0">10</span> @@</span><br />
&nbsp;# define compat_sk_rcvtimeo &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sk_rcvtimeo<br />
&nbsp;#endif<br />
&nbsp;<br />
<span class="re8">+#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION<span class="br0">&#40;</span><span class="nu0">2</span>, <span class="nu0">6</span>, <span class="nu0">34</span><span class="br0">&#41;</span></span><br />
<span class="re8">+# undef compat_sk_sleep</span><br />
<span class="re8">+# define compat_sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span> sk_sleep<span class="br0">&#40;</span>sk<span class="br0">&#41;</span></span><br />
<span class="re8">+#endif</span><br />
&nbsp;<br />
&nbsp;/*<br />
&nbsp; * Prior to 2.5.65, struct sock contained individual fields for certain
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/837-vmware-vsock-compilation-error/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/837-vmware-vsock-compilation-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>R1Soft CDP с ядром 2.6.35</title>
		<link>http://blog.sjinks.pro/administering/836-r1soft-cdp-2-6-35-kernel/</link>
		<comments>http://blog.sjinks.pro/administering/836-r1soft-cdp-2-6-35-kernel/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 10:15:18 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[CDP]]></category>
		<category><![CDATA[R1 Soft]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=836</guid>
		<description><![CDATA[Решение проблемы сборки модуля ядра для Linux kernel 2.6.35 При попытке собрать модуль под ядро Linux 2.6.35 r1soft-cki выдаёт примерно следующий текст: Checking for binary module Waiting &#124; No binary module found Gathering kernel information Gathering kernel information complete. Creating kernel headers package Checking &#039;/tmp/r1soft-cki.1286865605&#039; for kernel headers Unable to find a &#039;include/linux/autoconf.h&#039;. This file is [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/836-r1soft-cdp-2-6-35-kernel/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Решение проблемы сборки модуля ядра для <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> kernel 2.6.35</em></h2>
<p>При попытке собрать модуль под ядро Linux 2.6.35 <code>r1soft-cki</code> выдаёт примерно следующий текст: </p>
          
<div class="codebox">
    <div class="the_code" style="" id="p83635">
        <div class="code text" id="p836code35">
Checking for binary module<br />
Waiting &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; <br />
No binary module found<br />
Gathering kernel information<br />
Gathering kernel information complete.<br />
Creating kernel headers package<br />
Checking '/tmp/r1soft-cki.1286865605' for kernel headers<br />
Unable to find a 'include/linux/autoconf.h'. This file is required to build a kernel module<br />
Unable to find a valid source directory.<br />
Please install the kernel headers for your operating system.<br />
To install kernel headers execute:<br />
apt-get install linux-headers-`uname -r`
        </div>
    </div>
</div>

<p>Очевидно, что все требуемый пакеты установлены, иначе не было бы данной статьи. Не менее очевидно, что модуль ядра <code>r1soft-cki</code> в таких условиях создать не может.<span id="more-836"></span></p>
<p>Проблема здесь в том, что в ядрах 2.6.35 <code>autoconf.h</code> находится совершенно в другом месте: в каталоге</p>
<p><code>/usr/src/linux-headers-`uname -r`/include/generated/</code></p>
<p>а не в каталоге</p>
<p><code>/usr/src/linux-headers-`uname -r`/include/linux/</code></p>
<p>Беда в том, что проверяемый путь жестко прописан в бинарном файле; исходный код, разумеется, не поставляется. К счастью, эта проверка не влияет на процесс сборки модуля — данный файл проверяется только для того, чтобы удостовериться, что приведённые заголовочные файлы действительно являются заголовочными файлами ядра.</p>
<p>Поэтому решение проблемы тривиально:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p83636">
        <div class="code bash" id="p836code36">
<span class="kw2">touch</span> <span class="sy0">/</span>usr<span class="sy0">/</span>src<span class="sy0">/</span>linux-headers-<span class="sy0">`</span><span class="kw2">uname</span> -r<span class="sy0">`/</span>include<span class="sy0">/</span>linux<span class="sy0">/</span>autoconf.h
        </div>
    </div>
</div>

<p>После этого <code>r1soft-cki</code> успешно отправляет все данные на сервер и получает требуемый модуль ядра.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/836-r1soft-cdp-2-6-35-kernel/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/836-r1soft-cdp-2-6-35-kernel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

