IDEA-133844 (correct handling of DT_UNKNOWN in fsnotifier)
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Fri, 19 Dec 2014 10:01:41 +0000 (11:01 +0100)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Fri, 19 Dec 2014 10:02:13 +0000 (11:02 +0100)
bin/linux/fsnotifier
bin/linux/fsnotifier64
native/fsNotifier/linux/inotify.c

index f79a688a18bdd7e22dfad319c782bb470892fba3..a453edf4f53fd1bcae9d8c4b49c8476faf70f881 100755 (executable)
Binary files a/bin/linux/fsnotifier and b/bin/linux/fsnotifier differ
index a967353d6294910d64d28b216eca6baa91a4f129..15356942b57fc1dd25dac1d2d7cdd0758ae16c1d 100755 (executable)
Binary files a/bin/linux/fsnotifier64 and b/bin/linux/fsnotifier64 differ
index 713d09c54a38ae8c1686aa54e3fa7440eeeb2bdd..5198ed3ad53469e4b91d0b37f6dbd3b81026916e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -270,14 +270,27 @@ static int walk_tree(int path_len, watch_node* parent, bool recursive, array* mo
 
   struct dirent* entry;
   while ((entry = readdir(dir)) != NULL) {
-    if (entry->d_type != DT_DIR ||
-        strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
+    if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
+      continue;
+    }
+    if (entry->d_type != DT_UNKNOWN && entry->d_type != DT_DIR) {
       continue;
     }
 
     int name_len = strlen(entry->d_name);
     memcpy(path_buf + path_len + 1, entry->d_name, name_len + 1);
 
+    if (entry->d_type == DT_UNKNOWN) {
+      struct stat st;
+      if (stat(path_buf, &st) != 0) {
+        userlog(LOG_DEBUG, "(DT_UNKNOWN) stat(%s): %d", path_buf, errno);
+        continue;
+      }
+      if (!S_ISDIR(st.st_mode)) {
+        continue;
+      }
+    }
+
     int subdir_id = walk_tree(path_len + 1 + name_len, table_get(watches, id), recursive, mounts);
     if (subdir_id < 0 && subdir_id != ERR_IGNORE) {
       rm_watch(id, true);