note 118582 added to ref.bzip2

From: Date: Fri, 01 Jan 2016 18:22:14 +0000
Subject: note 118582 added to ref.bzip2
Groups: php.notes 
Request: Send a blank email to php-notes+get-204583@lists.php.net to get a copy of this message
<?php /* * Reading a BZIP2 file can be tricky, and I never seen a complete example of * code that account for any possible failure that may happen accessing a file * in general, and decoding compressed data in this specific case. * The example that follows is my attempt to address this gap. * Some things that worth noting are: * - Encoding/decoding errors must be detected with bzerrno(). * - bzopen() may fail returning FALSE if the file cannot be created or read, * but succeeds also if the file is not properly encoded. * - bzread() may fail returning FALSE if it fails reading from the source, but * it returns the empty string on end of file and on encoding error. * - bzread() may still return corrupted data with no error whatsoever until the * BZIP2 algo encounters the first hash code, so data retrieved cannot be * trusted until the very end of the file has been reached. */ // Safety first: error_reporting(-1); // On error, set $php_errormsg: ini_set("track_errors", "1"); /** * Reads and displays on stdout the content of a BZIP2 compressed file with * full error detection. * @param string $fn Filename. * @return void */ function displaysBZIP2File($fn) { echo "Reading $fn:\n"; $bz = @bzopen($fn, "r"); if( $bz === FALSE ){ echo "ERROR: bzopen() failed: $php_errormsg\n"; return; } $errno = bzerrno($bz); if( $errno != 0 ){ // May detect "DATA_ERROR_MAGIC" (not a BZIP2 file), or "DATA_ERROR" // (BZIP2 decoding error) and maybe others BZIP2 errors too. echo "ERROR: bzopen(): BZIP2 decoding failed: ", bzerrstr($bz), "\n"; @bzclose($bz); return; } while(! feof($bz) ) { $s = bzread($bz, 100); if( $s === FALSE ){ echo "ERROR: bzread() failed: $php_errormsg\n"; @bzclose($bz); return; } $errno = bzerrno($bz); if( $errno != 0 ){ // May detect "DATA_ERROR" (BZIP2 decoding error) and maybe others // BZIP2 errors too. echo "ERROR: bzread(): BZIP2 decoding failed: ", bzerrstr($bz), "\n"; @bzclose($bz); return; } echo "read: ", var_export($s, true), "\n"; } if( ! bzclose($bz) ){ echo "ERROR: bzclose() failed: $php_errormsg\n"; } } // Target file: $fn = "test.bz2"; // Test 1: writes and read a good BZIP2 file: file_put_contents($fn, bzcompress("Content of the file.")); displaysBZIP2File($fn); // works ok. // Test 2: invalid content, not a BZIP2 file: file_put_contents($fn, "This ia plain text file, no compression at all!"); displaysBZIP2File($fn); // ERROR: bzread(): BZIP2 decoding failed: DATA_ERROR_MAGIC // Test 3: creates a corrupted BZIP2 file: $plain = str_repeat("Quite random string. ", 1000); $compressed = bzcompress($plain); $compressed_corrupted = $compressed; $compressed_corrupted[(int)(strlen($compressed)/2)] = 'X'; // put random char in middle file_put_contents($fn, $compressed_corrupted); displaysBZIP2File($fn); // Only after some Kbytes of garbage, it tells: // ERROR: bzread(): BZIP2 decoding failed: DATA_ERROR // Safe coding against headache, ever. ?> ---- Server IP: 94.198.100.12 Probable Submitter: 88.149.172.234 ---- Manual Page -- http://php.net/manual/en/ref.bzip2.php Edit -- https://master.php.net/note/edit/118582 Del: integrated -- https://master.php.net/note/delete/118582/integrated Del: useless -- https://master.php.net/note/delete/118582/useless Del: bad code -- https://master.php.net/note/delete/118582/bad+code Del: spam -- https://master.php.net/note/delete/118582/spam Del: non-english -- https://master.php.net/note/delete/118582/non-english Del: in docs -- https://master.php.net/note/delete/118582/in+docs Del: other reasons-- https://master.php.net/note/delete/118582 Reject -- https://master.php.net/note/reject/118582 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#204583) next »