diff options
author | Aaron Schulz <aaron@users.mediawiki.org> | 2012-02-15 20:24:15 +0000 |
---|---|---|
committer | Aaron Schulz <aaron@users.mediawiki.org> | 2012-02-15 20:24:15 +0000 |
commit | ac2cf6e44ac88f0c56b20bfe77d4a1d6923e7417 (patch) | |
tree | 4ed6409bf25a30f97a82cf3cf3cc807894b85245 /includes/Cdb_PHP.php | |
parent | 7d5453df7275fbfb24b537ed1f5fb71668623070 (diff) | |
download | mediawikicore-ac2cf6e44ac88f0c56b20bfe77d4a1d6923e7417.tar.gz mediawikicore-ac2cf6e44ac88f0c56b20bfe77d4a1d6923e7417.zip |
Delete the temp cdb file when an exception is thrown so they don't take up /tmp space
Notes
Notes:
http://mediawiki.org/wiki/Special:Code/MediaWiki/111574
Diffstat (limited to 'includes/Cdb_PHP.php')
-rw-r--r-- | includes/Cdb_PHP.php | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/includes/Cdb_PHP.php b/includes/Cdb_PHP.php index 4f72f5f27659..77b61cb6aad0 100644 --- a/includes/Cdb_PHP.php +++ b/includes/Cdb_PHP.php @@ -277,15 +277,14 @@ class CdbWriter_PHP extends CdbWriter { $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff ); $this->handle = fopen( $this->tmpFileName, 'wb' ); if ( !$this->handle ) { - throw new MWException( + $this->throwException( 'Unable to open CDB file "' . $this->tmpFileName . '" for write.' ); } $this->hplist = array(); $this->numentries = 0; $this->pos = 2048; // leaving space for the pointer array, 256 * 8 if ( fseek( $this->handle, $this->pos ) == -1 ) { - throw new MWException( - 'fseek failed in file "' . $this->tmpFileName . '".' ); + $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' ); } } @@ -323,7 +322,7 @@ class CdbWriter_PHP extends CdbWriter { unlink( $this->realFileName ); } if ( !rename( $this->tmpFileName, $this->realFileName ) ) { - throw new MWException( 'Unable to move the new CDB file into place.' ); + $this->throwException( 'Unable to move the new CDB file into place.' ); } unset( $this->handle ); } @@ -335,7 +334,7 @@ class CdbWriter_PHP extends CdbWriter { protected function write( $buf ) { $len = fwrite( $this->handle, $buf ); if ( $len !== strlen( $buf ) ) { - throw new MWException( 'Error writing to CDB file "'.$this->tmpFileName.'".' ); + $this->throwException( 'Error writing to CDB file "'.$this->tmpFileName.'".' ); } } @@ -346,7 +345,7 @@ class CdbWriter_PHP extends CdbWriter { protected function posplus( $len ) { $newpos = $this->pos + $len; if ( $newpos > 0x7fffffff ) { - throw new MWException( + $this->throwException( 'A value in the CDB file "'.$this->tmpFileName.'" is too large.' ); } $this->pos = $newpos; @@ -376,10 +375,10 @@ class CdbWriter_PHP extends CdbWriter { */ protected function addbegin( $keylen, $datalen ) { if ( $keylen > 0x7fffffff ) { - throw new MWException( 'Key length too long in file "'.$this->tmpFileName.'".' ); + $this->throwException( 'Key length too long in file "'.$this->tmpFileName.'".' ); } if ( $datalen > 0x7fffffff ) { - throw new MWException( 'Data length too long in file "'.$this->tmpFileName.'".' ); + $this->throwException( 'Data length too long in file "'.$this->tmpFileName.'".' ); } $buf = pack( 'VV', $keylen, $datalen ); $this->write( $buf ); @@ -454,8 +453,22 @@ class CdbWriter_PHP extends CdbWriter { // Write the pointer array at the start of the file rewind( $this->handle ); if ( ftell( $this->handle ) != 0 ) { - throw new MWException( 'Error rewinding to start of file "'.$this->tmpFileName.'".' ); + $this->throwException( 'Error rewinding to start of file "'.$this->tmpFileName.'".' ); } $this->write( $final ); } + + /** + * Clean up the temp file and throw an exception + * + * @param $msg string + * @throws MWException + */ + protected function throwException( $msg ) { + if ( $this->handle ) { + fclose( $this->handle ); + unlink( $this->tmpFileName ); + } + throw new MWException( $msg ); + } } |