Browse Source

Bug 1603: Failure when processing results of upload during synchronization in .NET assembly when a directory was created with explicitly set permissions as the first operation

https://winscp.net/tracker/1603

Source commit: 35e3fcfdfb0735e8b3a1bd64967484af185fae47
Martin Prikryl 7 năm trước cách đây
mục cha
commit
794fedc0b8
1 tập tin đã thay đổi với 21 bổ sung6 xóa
  1. 21 6
      dotnet/Session.cs

+ 21 - 6
dotnet/Session.cs

@@ -924,6 +924,7 @@ namespace WinSCP
                 using (CreateProgressHandler())
                 {
                     TransferEventArgs transfer = null;
+                    bool mkdir = false;
 
                     while (groupReader.Read(0))
                     {
@@ -941,26 +942,40 @@ namespace WinSCP
                         {
                             AddSynchronizationTransfer(result, transfer);
                             transfer = TransferEventArgs.Read(newSide.Value, groupReader);
+                            mkdir = false;
                         }
                         else if (groupReader.IsNonEmptyElement(RemovalEventArgs.Tag))
                         {
                             result.AddRemoval(RemovalEventArgs.Read(groupReader));
                         }
+                        else if (groupReader.IsNonEmptyElement(TransferEventArgs.MkDirTag))
+                        {
+                            transfer = null;
+                            mkdir = true;
+                            // For now, silently ignoring results (even errors)
+                            // of mkdir operation, including future chmod/touch
+                        }
                         else if (groupReader.IsNonEmptyElement(ChmodEventArgs.Tag))
                         {
-                            if (transfer == null)
+                            if (!mkdir)
                             {
-                                throw Logger.WriteException(new InvalidOperationException("Tag chmod before tag download"));
+                                if (transfer == null)
+                                {
+                                    throw Logger.WriteException(new InvalidOperationException("Tag chmod before tag download"));
+                                }
+                                transfer.Chmod = ChmodEventArgs.Read(groupReader);
                             }
-                            transfer.Chmod = ChmodEventArgs.Read(groupReader);
                         }
                         else if (groupReader.IsNonEmptyElement(TouchEventArgs.Tag))
                         {
-                            if (transfer == null)
+                            if (!mkdir)
                             {
-                                throw Logger.WriteException(new InvalidOperationException("Tag touch before tag download"));
+                                if (transfer == null)
+                                {
+                                    throw Logger.WriteException(new InvalidOperationException("Tag touch before tag download"));
+                                }
+                                transfer.Touch = TouchEventArgs.Read(groupReader);
                             }
-                            transfer.Touch = TouchEventArgs.Read(groupReader);
                         }
                     }