From 1bde7bdd490682654106c886a98b53fe58deed7a Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Thu, 10 Jul 2014 00:14:45 -0700 Subject: [PATCH] Have SvgHandler create a directory for its RSVG input files * This avoids needing to patch rsvg on 14.04 bug: 67402 Change-Id: I81ac0c6c62003ed5a8e33694751484498e6e7277 --- includes/media/SVG.php | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/includes/media/SVG.php b/includes/media/SVG.php index e28b38fab8..924dad11f9 100644 --- a/includes/media/SVG.php +++ b/includes/media/SVG.php @@ -185,7 +185,40 @@ class SvgHandler extends ImageHandler { } $srcPath = $image->getLocalRefPath(); - $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight, $lang ); + if ( $srcPath === false ) { // Failed to get local copy + wfDebugLog( 'thumbnail', + sprintf( 'Thumbnail failed on %s: could not get local copy of "%s"', + wfHostname(), $image->getName() ) ); + + return new MediaTransformError( 'thumbnail_error', + $params['width'], $params['height'], + wfMessage( 'filemissing' )->text() + ); + } + + // Make a temp dir with a symlink to the local copy in it. + // This plays well with rsvg-convert policy for external entities. + // https://git.gnome.org/browse/librsvg/commit/?id=f01aded72c38f0e18bc7ff67dee800e380251c8e + $tmpDir = wfTempDir() . '/svg_' . wfRandomString( 24 ); + $lnPath = "$tmpDir/" . basename( $srcPath ); + $ok = mkdir( $tmpDir, 0771 ) && symlink( $srcPath, $lnPath ); + $cleaner = new ScopedCallback( function() use ( $tmpDir, $lnPath ) { + wfSuppressWarnings(); + unlink( $lnPath ); + rmdir( $tmpDir ); + wfRestoreWarnings(); + } ); + if ( !$ok ) { + wfDebugLog( 'thumbnail', + sprintf( 'Thumbnail failed on %s: could not link %s to %s', + wfHostname(), $lnPath, $srcPath ) ); + return new MediaTransformError( 'thumbnail_error', + $params['width'], $params['height'], + wfMessage( 'thumbnail-temp-create' )->text() + ); + } + + $status = $this->rasterize( $lnPath, $dstPath, $physicalWidth, $physicalHeight, $lang ); if ( $status === true ) { return new ThumbnailImage( $image, $dstUrl, $dstPath, $params ); } else { -- 2.20.1