Skip to content

Commit e907682

Browse files
committed
fix #273: fix logical issues in adding/removal of file watchers
1 parent 064f634 commit e907682

File tree

1 file changed

+46
-34
lines changed

1 file changed

+46
-34
lines changed

Diff for: src/iisnode/cfilewatcher.cpp

+46-34
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,9 @@ HRESULT CFileWatcher::WatchFile(PCWSTR directoryName, DWORD directoryNameLength,
298298
directory = this->directories;
299299
while (NULL != directory)
300300
{
301-
if (0 == wcsncmp(directory->directoryName, directoryName, directoryNameLength)
302-
&& (startFileName == startSubdirectoryName
303-
|| 0 == wcsncmp(directory->directoryName + directoryNameLength, startSubdirectoryName, startFileName - startSubdirectoryName)))
301+
if (wcslen(directory->directoryName) == directoryNameLength + startFileName - startSubdirectoryName
302+
&& 0 == wcsncmp(directory->directoryName, directoryName, directoryNameLength)
303+
&& 0 == wcsncmp(directory->directoryName + directoryNameLength, startSubdirectoryName, startFileName - startSubdirectoryName))
304304
{
305305
break;
306306
}
@@ -413,48 +413,60 @@ HRESULT CFileWatcher::RemoveWatch(CNodeApplication* application)
413413
{
414414
WatchedFile* file = directory->files;
415415
WatchedFile* previousFile = NULL;
416-
while (file && file->application != application)
417-
{
418-
previousFile = file;
419-
file = file->next;
420-
}
421416

422-
if (file)
417+
while (file)
423418
{
424-
delete [] file->fileName;
425-
if (previousFile)
426-
{
427-
previousFile->next = file->next;
428-
}
429-
else
419+
if (file->application == application)
430420
{
431-
directory->files = file->next;
432-
}
433-
434-
delete file;
435-
436-
if (!directory->files)
437-
{
438-
delete [] directory->directoryName;
439-
CloseHandle(directory->watchHandle);
440-
441-
if (previousDirectory)
421+
WatchedFile* tmpFile = file;
422+
delete [] file->fileName;
423+
if (previousFile)
442424
{
443-
previousDirectory->next = directory->next;
425+
previousFile->next = file->next;
426+
file = file->next;
427+
if (!file)
428+
{
429+
previousDirectory = directory;
430+
directory = directory->next;
431+
}
444432
}
445433
else
446434
{
447-
this->directories = directory->next;
435+
directory->files = file->next;
436+
file = file->next;
437+
if (!directory->files)
438+
{
439+
delete [] directory->directoryName;
440+
CloseHandle(directory->watchHandle);
441+
442+
if (previousDirectory)
443+
{
444+
previousDirectory->next = directory->next;
445+
}
446+
else
447+
{
448+
this->directories = directory->next;
449+
}
450+
451+
WatchedDirectory* tmpDirectory = directory;
452+
directory = directory->next;
453+
delete tmpDirectory;
454+
}
448455
}
449456

450-
delete directory;
457+
delete tmpFile;
458+
}
459+
else
460+
{
461+
previousFile = file;
462+
file = file->next;
463+
if (!file)
464+
{
465+
previousDirectory = directory;
466+
directory = directory->next;
467+
}
451468
}
452-
453-
break;
454469
}
455-
456-
previousDirectory = directory;
457-
directory = directory->next;
458470
}
459471

460472
LEAVE_CS(this->syncRoot)

0 commit comments

Comments
 (0)