]> git.saurik.com Git - wxWidgets.git/commitdiff
Correct handling of IN_Q_OVERFLOW in wxFileSystemWatcher Linux code.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 29 Nov 2012 22:02:36 +0000 (22:02 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 29 Nov 2012 22:02:36 +0000 (22:02 +0000)
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

src/unix/fswatcher_inotify.cpp

index f7438727dfdccd0a1ce328f255e417b631376fa9..3d6e8eb0f76d15fbcc8b9ded86520d39f3fe25bc 100644 (file)
@@ -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)
         {