Page MenuHomePhabricator

PHP Fatal error with GraphViz extension
Closed, ResolvedPublic

Description

After upgrading from 1.3.1 to 1.5.1, I get the following errors in the apache log.

[Wed Feb 11 20:29:27.100104 2015] [:error] [pid 1472] [client ] PHP Warning: fread(): Length parameter must be greater than 0 in /w/includes/MimeMagic.php on line 595, referer: http://.../w/index.php?title=Page&action=edit
[Wed Feb 11 20:29:49.961775 2015] [:error] [pid 1472] [client ] PHP Fatal error: Call to a member function getId() on a non-object in /w/extensions/GraphViz/GraphViz_body.php on line 394, referer: http://.../w/index.php?title=Page&action=edit

The page does not finish loading and only shows a blank page.

MediaWiki 1.23.8
Apache 2.4.7
PHP 5.5.9

Event Timeline

Prod assigned this task to Welterkj.
Prod raised the priority of this task from to Needs Triage.
Prod updated the task description. (Show Details)
Prod subscribed.

Can you recreate the problem? A debug log file would help put the problem in context:
https://www.mediawiki.org/wiki/Manual:How_to_debug#Setting_up_a_debug_log_file

I've updated to GraphViz 1.6.0 on MW 1.25 and it appears the GetID error is gone. The MimeMagic warning is still there though:

[Fri Apr 10 22:25:12.449902 2015] [:error] [pid 9639] [client ] PHP Warning: fread(): Length parameter must be greater than 0 in /w/includes/MimeMagic.php on line 646, referer: http://.../w/index.php?title=Page&action=submit

Oddly, when I try to enable the debug log, the warning doesn't show up and I can't see anything in the debug log either.

If I go to a new page, and use the following code with a new title each time, it'll generate the message twice in the log:
<graphviz location="right">
digraph test {
graph [nodesep=.2, ranksep=.2];
node [fixedsize=true];
"A" -> "B";
}
</graphviz>

Prod, I was unable to reproduce the problem but I merged a fix that may fix the problem. Can you try it?

Unfortunately, doesn't look like it fixed it:
[Sat Apr 11 17:18:34.982840 2015] [:error] [pid 13509] [client ] PHP Strict Standards: Only variables should be assigned by reference in /w/extensions/DynamicPageList/DPLMain.php on line 53, referer: http://.../wiki/Page
[Sat Apr 11 17:18:48.744394 2015] [:error] [pid 13509] [client ] PHP Warning: fread(): Length parameter must be greater than 0 in /w/includes/MimeMagic.php on line 646, referer: http://.../w/index.php?title=Page&action=edit
[Sat Apr 11 17:18:53.675512 2015] [:error] [pid 13509] [client ] PHP Warning: fread(): Length parameter must be greater than 0 in /w/includes/MimeMagic.php on line 646, referer: http://.../w/index.php?title=Page&action=edit

The original fatal error was resolved with 1.6.0, so I was able to use the updated extension again. If you're not able to reproduce it, perhaps it's a conflict with my environment. I tried disabling all other extensions (except GraphViz and ImageMap), but still get the warning.

I reproduced the problem (with the debug log file disabled). Debug details to follow (from the debug toolbar).

GraphViz::render: sourceChanged: 1
GraphViz::updateSource: file_put_contents(/home/welterkj/public_html/mediawiki/git/core/images/graphviz/Graphviz4_digraph_test_Welterkj.src,source) succeeded
wfShellExec: /bin/bash '/home/welterkj/public_html/mediawiki/git/core/includes/limit.sh' ''\''/usr/bin/dot'\'' -T '\''png'\'' -o '\''/home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png'\'' '\''/home/welterkj/public_html/mediawiki/git/core/images/graphviz/Graphviz4_digraph_test_Welterkj.src'\'' 2>&1' 'MW_INCLUDE_STDERR=;MW_CPU_LIMIT=180; MW_CGROUP='\'''\''; MW_MEM_LIMIT=0; MW_FILE_SIZE_LIMIT=102400; MW_WALL_CLOCK_LIMIT=180; MW_USE_LOG_PIPE=yes'
[error-json] {"id":"26d72684","type":"ErrorException","file":"/home/welterkj/public_html/mediawiki/git/core/includes/GlobalFunctions.php","line":2894,"message":"PHP Notice: ","suppressed":true,"url":"/wdev/index.php?title=Graphviz4&action=submit","backtrace":[{"function":"handleError","class":"MWExceptionHandler","type":"::","args":["integer","string","string","integer","array"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/GlobalFunctions.php","line":2894,"function":"trigger_error","args":["string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php","line":1429,"function":"wfShellExec","args":["string","NULL"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php","line":1079,"function":"executeCommand","class":"GraphViz","type":"::","args":["string","string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php","line":782,"function":"render","class":"GraphViz","type":"::","args":["string","array","Parser","PPFrame_DOM"]},{"function":"graphvizParserHook","class":"GraphViz","type":"::","args":["string","array","Parser","PPFrame_DOM"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":4209,"function":"call_user_func_array","args":["array","array"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Preprocessor_DOM.php","line":1252,"function":"extensionSubstitution","class":"Parser","type":"->","args":["array","PPFrame_DOM"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":3319,"function":"expand","class":"PPFrame_DOM","type":"->","args":["PPNode_DOM","integer"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":1228,"function":"replaceVariables","class":"Parser","type":"->","args":["string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":431,"function":"internalParse","class":"Parser","type":"->","args":["string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/content/WikitextContent.php","line":333,"function":"parse","class":"Parser","type":"->","args":["string","Title","ParserOptions","boolean","boolean","NULL"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/content/AbstractContent.php","line":497,"function":"fillParserOutput","class":"WikitextContent","type":"->","args":["Title","NULL","ParserOptions","boolean","ParserOutput"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php","line":3522,"function":"getParserOutput","class":"AbstractContent","type":"->","args":["Title","NULL","ParserOptions"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php","line":2320,"function":"getPreviewText","class":"EditPage","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php","line":560,"function":"showEditForm","class":"EditPage","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/actions/EditAction.php","line":56,"function":"edit","class":"EditPage","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/actions/SubmitAction.php","line":40,"function":"show","class":"EditAction","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":403,"function":"show","class":"SubmitAction","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":275,"function":"performAction","class":"MediaWiki","type":"->","args":["Article","Title"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":571,"function":"performRequest","class":"MediaWiki","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":422,"function":"main","class":"MediaWiki","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/index.php","line":46,"function":"run","class":"MediaWiki","type":"->","args":[]}]}
FSFile::getProps: Getting file info for /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png
MimeMagic::doGuessMimeType: analyzing head and tail of /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png for magic numbers.
MimeMagic::doGuessMimeType: getimagesize detected /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png as image/png
MimeMagic::guessMimeType: guessed mime type of /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png: image/png
MimeMagic::improveTypeFromExtension: improved mime type for .png: image/png
FSFile::getProps: /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png loaded, 3395 bytes, image/png.
mime: <image/png> extension: <png>
UploadBase::detectScript: checking for embedded scripts and HTML stuff
UploadBase::detectScript: no scripts found
ZipDirectoryReader: Fatal error: zip file lacks EOCDR signature. It probably isn't a zip file.
UploadBase::detectVirus: virus scanner disabled
FSFile::getProps: Getting file info for /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png
MimeMagic::doGuessMimeType: analyzing head and tail of /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png for magic numbers.
MimeMagic::doGuessMimeType: getimagesize detected /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png as image/png
MimeMagic::guessMimeType: guessed mime type of /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png: image/png
MimeMagic::improveTypeFromExtension: improved mime type for .png: image/png
FSFile::getProps: /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png loaded, 3395 bytes, image/png.
UploadBase::verifyExtension: mime type image/png matches extension png, passing file
UploadBase::verifyFile: all clear; passing.
wfShellExec: /bin/bash '/home/welterkj/public_html/mediawiki/git/core/includes/limit.sh' ''\''/usr/bin/dot'\'' -T '\''cmapx'\'' -o '\''/home/welterkj/public_html/mediawiki/git/core/images/graphviz/Graphviz4_digraph_test_Welterkj_dot.map'\'' '\''/home/welterkj/public_html/mediawiki/git/core/images/graphviz/Graphviz4_digraph_test_Welterkj.src'\'' 2>&1' 'MW_INCLUDE_STDERR=;MW_CPU_LIMIT=180; MW_CGROUP='\'''\''; MW_MEM_LIMIT=0; MW_FILE_SIZE_LIMIT=102400; MW_WALL_CLOCK_LIMIT=180; MW_USE_LOG_PIPE=yes'
[error-json] {"id":"5e8a874c","type":"ErrorException","file":"/home/welterkj/public_html/mediawiki/git/core/includes/GlobalFunctions.php","line":2894,"message":"PHP Notice: ","suppressed":true,"url":"/wdev/index.php?title=Graphviz4&action=submit","backtrace":[{"function":"handleError","class":"MWExceptionHandler","type":"::","args":["integer","string","string","integer","array"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/GlobalFunctions.php","line":2894,"function":"trigger_error","args":["string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php","line":1429,"function":"wfShellExec","args":["string","NULL"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php","line":1105,"function":"executeCommand","class":"GraphViz","type":"::","args":["string","string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php","line":782,"function":"render","class":"GraphViz","type":"::","args":["string","array","Parser","PPFrame_DOM"]},{"function":"graphvizParserHook","class":"GraphViz","type":"::","args":["string","array","Parser","PPFrame_DOM"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":4209,"function":"call_user_func_array","args":["array","array"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Preprocessor_DOM.php","line":1252,"function":"extensionSubstitution","class":"Parser","type":"->","args":["array","PPFrame_DOM"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":3319,"function":"expand","class":"PPFrame_DOM","type":"->","args":["PPNode_DOM","integer"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":1228,"function":"replaceVariables","class":"Parser","type":"->","args":["string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php","line":431,"function":"internalParse","class":"Parser","type":"->","args":["string"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/content/WikitextContent.php","line":333,"function":"parse","class":"Parser","type":"->","args":["string","Title","ParserOptions","boolean","boolean","NULL"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/content/AbstractContent.php","line":497,"function":"fillParserOutput","class":"WikitextContent","type":"->","args":["Title","NULL","ParserOptions","boolean","ParserOutput"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php","line":3522,"function":"getParserOutput","class":"AbstractContent","type":"->","args":["Title","NULL","ParserOptions"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php","line":2320,"function":"getPreviewText","class":"EditPage","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php","line":560,"function":"showEditForm","class":"EditPage","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/actions/EditAction.php","line":56,"function":"edit","class":"EditPage","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/actions/SubmitAction.php","line":40,"function":"show","class":"EditAction","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":403,"function":"show","class":"SubmitAction","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":275,"function":"performAction","class":"MediaWiki","type":"->","args":["Article","Title"]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":571,"function":"performRequest","class":"MediaWiki","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php","line":422,"function":"main","class":"MediaWiki","type":"->","args":[]},{"file":"/home/welterkj/public_html/mediawiki/git/core/index.php","line":46,"function":"run","class":"MediaWiki","type":"->","args":[]}]}
GraphViz::render: Graphviz4 digraph test Welterkj dot.png does not exist
GraphViz::render: copying /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/Graphviz4_digraph_test_Welterkj_dot.png to /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/File_graph_GraphVizExtensionDummy_dot.png
GraphViz::disableHooks: hooks disabled
FSFile::getProps: Getting file info for /home/welterkj/public_html/mediawiki/git/core/images/graphviz/images/File_graph_GraphVizExtensionDummy_dot.png
[error] [b39f8b15] /wdev/index.php?title=Graphviz4&action=submit ErrorException from line 646 of /home/welterkj/public_html/mediawiki/git/core/includes/MimeMagic.php: PHP Warning: fread(): Length parameter must be greater than 0
#0 [internal function]: MWExceptionHandler::handleError(2, 'fread(): Length...', '/home/welterkj/...', 646, Array)
#1 /home/welterkj/public_html/mediawiki/git/core/includes/MimeMagic.php(646): fread(Resource id #107, 0)
#2 /home/welterkj/public_html/mediawiki/git/core/includes/MimeMagic.php(602): MimeMagic->doGuessMimeType('/home/welterkj/...', false)
#3 /home/welterkj/public_html/mediawiki/git/core/includes/filebackend/FSFile.php(94): MimeMagic->guessMimeType('/home/welterkj/...', false)
#4 /home/welterkj/public_html/mediawiki/git/core/includes/filebackend/FSFile.php(121): FSFile->getMimeType()
#5 /home/welterkj/public_html/mediawiki/git/core/includes/filebackend/FSFile.php(241): FSFile->getProps(true)
#6 /home/welterkj/public_html/mediawiki/git/core/includes/filerepo/file/LocalFile.php(1130): FSFile::getPropsFromPath('/home/welterkj/...')
#7 /home/welterkj/public_html/mediawiki/git/core/includes/upload/UploadBase.php(715): LocalFile->upload('/home/welterkj/...', 'generated by th...', '[[Category:Grap...', 1, NULL, false, Object(User))
#8 /home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/UploadLocalFile.php(238): UploadBase->performUpload('generated by th...', '[[Category:Grap...', false, Object(User))
#9 /home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php(1193): UploadLocalFile::upload('File_graph_Grap...', '/home/welterkj/...', Object(User), 'generated by th...', '[[Category:Grap...', false, true)
#10 /home/welterkj/public_html/mediawiki/git/core/extensions/GraphViz/GraphViz_body.php(782): GraphViz::render('?digraph test {...', Array, Object(Parser), Object(PPFrame_DOM))
#11 [internal function]: GraphViz::graphvizParserHook('?digraph test {...', Array, Object(Parser), Object(PPFrame_DOM))
#12 /home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php(4209): call_user_func_array(Array, Array)
#13 /home/welterkj/public_html/mediawiki/git/core/includes/parser/Preprocessor_DOM.php(1252): Parser->extensionSubstitution(Array, Object(PPFrame_DOM))
#14 /home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php(3319): PPFrame_DOM->expand(Object(PPNode_DOM), 0)
#15 /home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php(1228): Parser->replaceVariables('<graphviz>?digr...')
#16 /home/welterkj/public_html/mediawiki/git/core/includes/parser/Parser.php(431): Parser->internalParse('<graphviz>?digr...')
#17 /home/welterkj/public_html/mediawiki/git/core/includes/content/WikitextContent.php(333): Parser->parse('<graphviz>?digr...', Object(Title), Object(ParserOptions), true, true, NULL)
#18 /home/welterkj/public_html/mediawiki/git/core/includes/content/AbstractContent.php(497): WikitextContent->fillParserOutput(Object(Title), NULL, Object(ParserOptions), true, Object(ParserOutput))
#19 /home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php(3522): AbstractContent->getParserOutput(Object(Title), NULL, Object(ParserOptions))
#20 /home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php(2320): EditPage->getPreviewText()
#21 /home/welterkj/public_html/mediawiki/git/core/includes/EditPage.php(560): EditPage->showEditForm()
#22 /home/welterkj/public_html/mediawiki/git/core/includes/actions/EditAction.php(56): EditPage->edit()
#23 /home/welterkj/public_html/mediawiki/git/core/includes/actions/SubmitAction.php(40): EditAction->show()
#24 /home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php(403): SubmitAction->show()
#25 /home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php(275): MediaWiki->performAction(Object(Article), Object(Title))
#26 /home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php(571): MediaWiki->performRequest()
#27 /home/welterkj/public_html/mediawiki/git/core/includes/MediaWiki.php(422): MediaWiki->main()
#28 /home/welterkj/public_html/mediawiki/git/core/index.php(46): MediaWiki->run()
#29 {main}

This comment was removed by Welterkj.

Change 207541 had a related patch set uploaded (by Welterkj):
Eliminate PHP fread() length 0 warning

https://gerrit.wikimedia.org/r/207541

Please try the new patch. I found additional problems when doing edit->show preview (the graph doesn't display properly) but I wanted to first deliver the patch for fixing the fread warning.

Hi Prod, please try the latest dev-master version of GraphViz:
php composer.phar require mediawiki/graph-viz 'dev-master'

Thanks!

I've updated to the latest origin/master code. When doing some basic tests I don't get either of the two errors mentioned before, thanks!

However, using the test I mentioned above gives the following error:

Warning: node 'A', graph 'test' size too small for label
Warning: node 'B', graph 'test' size too small for label

Should I open a new ticket for this, or is it related to this issue?

Thanks!

The warnings you see are the result of the fix for T98500. In retrospect, it would have been nice to include a configuration option to suppress warnings. Feel free to open a ticket for that.

Given your feedback on this issue I will close it now.

Thanks!