<?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>Code42 &#187; alert</title>
	<atom:link href="http://code42.pl/tag/alert/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Wielkie Pytanie o Życie, Kod i całą resztę</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:16:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Epic: ALERT w PHP i niespodziewane białe ekrany śmierci</title>
		<link>http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/</link>
		<comments>http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 18:05:03 +0000</pubDate>
		<dc:creator>Mistrz Wu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[alert]]></category>
		<category><![CDATA[suhosin]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=18</guid>
		<description><![CDATA[Zacznę od tego, że problemu nie zdołałem rozwiązać, gdyż zwyczajnie brakowało mi czasu i&#160;nerwów. Zamiast tego, zrobiłem obejścia, które… no, działają. A&#160;dlaczego? Nie wiem. Może jakiś doświadczony czytelnik zostawi odpowiedź w komentarzu… Tak więc onegdaj, podczas wesołej pracy z PHP, zdarzyło się kilka razy, że przy prostej i&#160;klarownej operacji na dobrze określonych wartościach, PHP rzucał [...]


Brak podobnych wposów.]]></description>
			<content:encoded><![CDATA[<p>Zacznę od tego, że problemu nie zdołałem rozwiązać, gdyż zwyczajnie brakowało mi czasu i&nbsp;nerwów. Zamiast tego, zrobiłem obejścia, które… no, działają. A&nbsp;dlaczego? Nie wiem. Może jakiś doświadczony czytelnik zostawi odpowiedź w komentarzu…</p>
<p>Tak więc onegdaj, podczas wesołej pracy z <abbr>PHP</abbr>, zdarzyło się kilka razy, że przy prostej i&nbsp;klarownej operacji na dobrze określonych wartościach, PHP rzucał białym ekranem śmierci, a w logach pojawiało się niejasne:</p>
<pre><code>ALERT - canary mismatch on efree() - heap overflow detected (attacker '127.0.0.1', file '/home/mcv/htdocs/cośtam/dispatch.php')</code></pre>
<p>Czasami tylko zamiast <code>efree</code> było <code>erealloc</code>.</p>
<p>Chwila kombinowania wykazała, że taki efekt daje następująca linia:</p>
<pre><code>$ids = array_merge ($this->f1(), $this->f2(), $this->f3());</code></pre>
<p>Nazwy metod zostały zmienione dla większej czytelności. Wartości zwracane przez metody były najzwyklejszymi, <abbr>PHP<abbr>-owymi tablicami zawierającymi jedynie liczby całkowite. Liczba? Na pewno nie większa niż około 5800 w sumie. 5800 intów to dużo czy jak?</p>
<p>Po straceniu stosownej ilości nerwów, wpadłem na to, żeby trochę <abbr>PHP</abbr>-a oszukać. Dodałem zmienne pomocniczne:</p>
<pre><code>$a = $this->f1();
$b = $this->f2();
$c = $this->f3();
$ids = array_merge ($a, $b, $c);</code></pre>
<p>Magia! Wszystko zaczęło działać. Czy <abbr>PHP</abbr> znowu coś przede mną ukrywa?</p>
<p>W międzyczasie Pan Google pomógł skojarzyć dziwne wpisy w logach z „utwardzaczem” <abbr>PHP</abbr>, tj. <a rel='external' href='http://www.hardened-php.net/suhosin/'>Suhosinem</a>, który ma za zadanie uodparniać dziurawego PHP na różne ataki włamywaczy. I niestety tylko tyle. Trop się urwał, a ja nie wnikałem, skoro obejście zadziałało. Pewnie coś z parserem PHP nie tak (jak zwykle), albo Suhosin narobił jakiegoś bałaganu. Łorewer.</p>
<p>Kilka dni później, po dodaniu nowego argumentu do zupełnie innej metody:</p>
<pre><code>ALERT - canary mismatch on efree() - heap overflow detected (attacker '127.0.0.1', file '/home/mcv/htdocs/cośtam/dispatch.php')</code></pre>
<p>Co? Że jak? Niniejszy kod:</p>
<pre><code>public function render ($partial_name, array $locals = array())
{ … }</code></pre>
<p>zastąpiłem nastepującym:</p>
<pre><code>public function render ($partial_name, array $locals = array(), array $options = array())
{ … }</pre>
<p></code></p>
<p>Od tej pory biały ekran śmierci (+wpis w logu) powodowały wszelkie możliwe rodzaje wywołań:</p>
<pre><code>$this->render ('xyz');
$this->render ('xyz', array ('var' => 'value'));
$this->render ('xyz', array ('var' => 'value'), array());
# itp.</code></pre>
<p>Znów zacząłem tracić czas i nerwy, aż w końcu dobra dusza Zergu zasugerował, żebym zrobił to samo co ostatnio. Chwila szukania w pamięci dała poniższy efekt.</p>
<pre><code>function render ($partial_name, array $locals = array(), array $options = array())
{
    $this->render_old ($partial_name, $locals, $options);
}

function render_old ($partial_name, array $locals = array(), array $options = array())
{ … }</code></pre>
<p>Magia, proszę Państwa! Działa! Nigdy nie lekceważcie potęgi nic-nie-robiącej funkcji opakowującej. Ani niepotrzebnych zmiennych tymczasowych. Bo mogą jednak okazać się potrzebne. A&nbsp;może ktoś zna wytłumaczenie dla tego bezsensownego zachowania <abbr>PHP</abbr>? Bo ja tego zupełnie nie rozumiem. Ale wiem już, że gdy zobaczę czyjś kod podobny do powyższego, to wcale nie z programisty będę się śmiał, a z czego innego… :^)</p>
<p>Dobranoc państwu i&nbsp;Wesołych Świąt.</p>


<p>Brak podobnych wposów.</p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

