remi85
Ответы в темах
Просмотр 3 ответов — с 1 по 3 (всего 3)
-
Сергей, так понял, что «сериализационная война» за самый лучший патч длится уже долго. И официальный победоносный багфикс ждать ещё долго.
Было сделано 3 исправления.
Строки:11:
Было
if ( ':' !== $data[1] )
Стало
if ( ':' !== substr($data,1,1) )
14:
Было
$lastc = $data[ $length - 1 ];
Стало
$lastc = substr($data,$length-1,1);
33:
Было
if ( '"' !== $data[ $length - 2 ] )
Стало
if ( '"' !== substr( $data,$length-2,1 ) )
Изменил функцию на такую. Т.е. в некоторых местах, где работа со символами производилась как с массивом, реализовал через строковые функции. В итоге всё заработало! Пишем разработчикам, чтобы исправляли скорее баг!
function is_serialized( $data, $strict = true ) { // if it isn't a string, it isn't serialized if ( ! is_string( $data ) ) return false; $data = trim( $data ); if ( 'N;' == $data ) return true; $length = strlen( $data ); if ( $length < 4 ) return false; if ( ':' !== substr($data,1,1) ) return false; if ( $strict ) { $lastc = substr($data,$length-1,1); if ( ';' !== $lastc && '}' !== $lastc ) return false; } else { $semicolon = strpos( $data, ';' ); $brace = strpos( $data, '}' ); // Either ; or } must exist. if ( false === $semicolon && false === $brace ) return false; // But neither must be in the first X characters. if ( false !== $semicolon && $semicolon < 3 ) return false; if ( false !== $brace && $brace < 4 ) return false; } $token = $data[0]; switch ( $token ) { case 's' : if ( $strict ) { if ( '"' !== substr( $data,$length-2,1 ) ) return false; } elseif ( false === strpos( $data, '"' ) ) { return false; } // or else fall through case 'a' : case 'O' : return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data ); case 'b' : case 'i' : case 'd' : $end = $strict ? '$' : ''; return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data ); } return false; }
Просмотр 3 ответов — с 1 по 3 (всего 3)