Review Request 113965: Possible fix for bug 321100
Friedrich W. H. Kossebau
kossebau at kde.org
Fri Nov 22 23:03:20 GMT 2013
> On Nov. 20, 2013, 6:02 p.m., Albert Astals Cid wrote:
> > I don't see why this should fix anything. Do you think anyone in the bug can provide a valgrind trace to better understand why it's crashing?
>
> Christoph Feck wrote:
> See also https://git.reviewboard.kde.org/r/102981/ which has some discussion and links to related bugs.
>
> Albert Astals Cid wrote:
> Why is it related? Who is modifying the entries variable? It's used in 4 places in the file, and actually there's no way to remove stuff from it, so I don't see how it is related to the bug you point.
>
> Christoph Feck wrote:
> They are only related because replacing qDeleteAll() with manual deletion fixed the crash for Boudewijn. Since my understanding ended there, I suggested to post a review request.
>
> Thomas Lübking wrote:
> See http://lists.kde.org/?t=132194778400005&r=1&w=2
> Qt 4.8 changed qDeleteAll to rely on the container being immutable.
>
> The patch detaches the container, what allows safe operation despite - what's likely happening as it seemed the core issue back than - the container is altered by the deletion of one or more of its items (eg. the items deconstructor delists itself)
>
> An alternative solution would be to pass the to-be-deleted objects class a static member flag to skip self delisting and set that around qDeleteAll() (which would be followed by an erase())
>
> Albert Astals Cid wrote:
> Please look at the code and tell us where the item deconstructor delists itself from the list.
>
> Thomas Lübking wrote:
> I said that it seemed the core issue back then, not that it happens here (for sure) or would be the only trigger.
>
> Briefly looking at KArchive, i'd rather bet on a recursion (entries containing a KArchiveEntry being or ultimately pointing down to the same KArchiveDirectory)
> Just a wild guess, though - but testable if one can reproduce the bug (unless you can assure that cannot be the case)
>
> Boudewijn Rempt wrote:
> I haven't been able to reproduce it myself on Linux. On Windows it was a lot easier, but there I use an old and completely hacked-up version of kdelibs. However, when I was giving a workshop at LGM, pretty much half of the Linux users present (most of them *buntu) users had to disable autosave to prevent this crash from happening.
>
> I'm puzzled... And I would love a better fix than mine, but that will have to come from someone who understands karchive -- which I don't, not really.
>
> Friedrich W. H. Kossebau wrote:
> I do not have a better fix yet, but I think I found the root of the problem:
> in case of a duplicated name for an entry in KZip::doPrepareWriting() the old entry is removed from d->m_fileList, but not from the parentDir directory holding it:
> https://projects.kde.org/projects/kde/kdelibs/repository/revisions/ee5dea835039c8a8f765321378dbed398826f368/entry/kdecore/io/kzip.cpp#L1026
>
> Thus on destruction of that dir the qDeleteAll will try to delete an entry that is already deleted. Seems that triggers not always a crash, perhaps because the memory might still be available?
>
> Sadly I do not have a kdelibs development environment setup currently and also short of disk space, so cannot come up with a patch/unittest. Anyone? But so far I already see the problem that KArchiveDirectory has a method "addEntry( KArchiveEntry* )" (which currently in case of adding an entry with the same name qwarns about that, and ignores the new entry), but not some "removeEntry( KArchiveEntry* )". This needs some more thinking what the proper behaviour should be and how to solve that. Perhaps "addEntry( KArchiveEntry* )" should just overwrite the old entry, that would at least match the behaviour in KZip::doPrepareWriting()...
>
> Any takers?
Took it myself ;)
Please see & review https://git.reviewboard.kde.org/r/114048/ for a proposal how to fix that problem in KZip::doPrepareWriting().
- Friedrich W. H.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/113965/#review44060
-----------------------------------------------------------
On Nov. 20, 2013, 9:40 a.m., Boudewijn Rempt wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/113965/
> -----------------------------------------------------------
>
> (Updated Nov. 20, 2013, 9:40 a.m.)
>
>
> Review request for kdelibs.
>
>
> Bugs: 321100
> http://bugs.kde.org/show_bug.cgi?id=321100
>
>
> Repository: kdelibs
>
>
> Description
> -------
>
> While I haven't been able to reproduce the issue on Linux, many Krita users encounter a crash in the destructor of KArchiveDirectoryPrivate, where all entries are removed with qDeleteAll.
>
> This patch removes the use of qDeleteAll.
>
> I'm not 100% sure whether this is correct, but it works for me with the Windows build of kdelibs I use.
>
>
> Diffs
> -----
>
> kdecore/io/karchive.cpp 88e1de0
>
> Diff: http://git.reviewboard.kde.org/r/113965/diff/
>
>
> Testing
> -------
>
>
> Thanks,
>
> Boudewijn Rempt
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20131122/e00450b7/attachment.htm>
More information about the kde-core-devel
mailing list