From: Vadim Zeitlin Date: Thu, 29 Nov 2012 22:02:36 +0000 (+0000) Subject: Correct handling of IN_Q_OVERFLOW in wxFileSystemWatcher Linux code. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/8ded8d08ab6f9b8533107776132205e661450975?ds=sidebyside Correct handling of IN_Q_OVERFLOW in wxFileSystemWatcher Linux code. Don't use wd field if it's -1 which can happen for IN_Q_OVERFLOW. See #14854. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73063 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/unix/fswatcher_inotify.cpp b/src/unix/fswatcher_inotify.cpp index f7438727df..3d6e8eb0f7 100644 --- a/src/unix/fswatcher_inotify.cpp +++ b/src/unix/fswatcher_inotify.cpp @@ -236,25 +236,29 @@ protected: // get watch entry for this event wxFSWatchEntryDescriptors::iterator it = m_watchMap.find(inevt.wd); - if (it == m_watchMap.end()) + + // wd will be -1 for IN_Q_OVERFLOW, which would trigger the wxFAIL_MSG + if (inevt.wd != -1) { - // It's not in the map; check if was recently removed from it. - if (m_staleDescriptors.Index(inevt.wd) != wxNOT_FOUND) - { - wxLogTrace(wxTRACE_FSWATCHER, - "Got an event for stale wd %i", inevt.wd); - } - else + if (it == m_watchMap.end()) { - wxFAIL_MSG("Event for unknown watch descriptor."); - } + // It's not in the map; check if was recently removed from it. + if (m_staleDescriptors.Index(inevt.wd) != wxNOT_FOUND) + { + wxLogTrace(wxTRACE_FSWATCHER, + "Got an event for stale wd %i", inevt.wd); + } + else + { + wxFAIL_MSG("Event for unknown watch descriptor."); + } - // In any case, don't process this event: it's either for an - // already removed entry, or for a completely unknown one. - return; + // In any case, don't process this event: it's either for an + // already removed entry, or for a completely unknown one. + return; + } } - wxFSWatchEntry& watch = *(it->second); int nativeFlags = inevt.mask; int flags = Native2WatcherFlags(nativeFlags); @@ -264,7 +268,11 @@ protected: wxString errMsg = GetErrorDescription(nativeFlags); wxFileSystemWatcherEvent event(flags, errMsg); SendEvent(event); + return; } + + wxFSWatchEntry& watch = *(it->second); + // Now IN_UNMOUNT. We must do so here, as it's not in the watch flags if (nativeFlags & IN_UNMOUNT) {