KIO::mimetype sync call in DocumentController::openDocumentInternal hazardous
Milian Wolff
mail at milianw.de
Tue Sep 28 11:18:45 UTC 2010
Milian Wolff, 26.09.2010:
> Heyho,
>
> anyone ever got this and went mad:
>
> ASSERT: "!documents.contains(url) || documents[url]==doc" in file
> /home/milian/projects/kde4/kdevplatform/shell/documentcontroller.cpp, line
> 316
>
> I found a way to get it reproducible, for me it's the second time I try
> something like this:
>
> kdevelop -d kate
>
> first run works, second will fail.
>
> Lots of debug output later I found out what the reason is:
>
> openDocumentInternal is called twice, within the same thread, without the
> first returning. The reason for that? KIO::mimetype job executed
> syncronously:
>
> a) mimeType->is( "application/octet-stream" ) is most probably always true,
> since ->is() honors mimetype inheritance and afaik this is a quite generic
> mimetype that most others inherit. so this should be fixed to ->name() ==
> "application/octet-stream". I'll do this later, but it doesn't fix the real
> bug.
>
> b) look at this code:
>
> // Try harder using KIO. This also allows looking at
> the content of remote files.
> KIO::MimetypeJob* job = KIO::mimetype(url,
> KIO::HideProgressInfo);
> if(job->exec())
> mimeType = KMimeType::mimeType(job->mimetype());
> delete job;
>
> looks nice, and safe, doesn't it? well, wrong. Let me quote from the
> documentation of KJob exec():
>
> * Should you indeed call this method, you need to make sure that all
> callers are reentrant,
> * so that events delivered by the inner event loop don't cause non-
> reentrant functions to be
> * called, which usually wreaks havoc.
>
> indeed, it does wreak havoc here! Somehow the eventloop black-magic leads
> to another call to
> KDevelop::WorkingSet::changedWorkingSet which eventually tries to get the
> same document from the controller again => fail.
>
> So how can we fix this? Can someone explain how I could make
> openDocumentInternal reentrant? Just by coping with the case the assertion
> currently prevents? I sadly don't see a way to use the safe async KJob api
> here :-S
I just spoke to David Faure, he said that this code should _not_ be required.
KIO::mimetype should only be required for KIO slaves like HTTP where one
cannot rely on the file extension to guess a mimetype.
$ kmimetypefinder sftp://bla/something/read.php
application/x-php
(accuracy 100)
It does not even connect to the host, it just looks at the URL and its
extension.
So, david - why did you add this code? I'm tempted to remove it again.
What is left to be done is testing this:
https://bugs.kde.org/show_bug.cgi?id=234644 in a 4.1 build - can someone do
this for me? Otherwise I'll try it tomorrow.
Bye
--
Milian Wolff
mail at milianw.de
http://milianw.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kdevelop-devel/attachments/20100928/c2d87276/attachment.sig>
More information about the KDevelop-devel
mailing list