Changeset 2641


Ignore:
Timestamp:
5/22/2012 8:50:08 AM (3 years ago)
Author:
lowjoel
Message:

When trying to determine the processes locking the file, we may not have permissions to access the process name, yielding an empty list. Do not crash when doing string manipulation to get the list as a string when this is so.

Location:
trunk/eraser/Eraser.DefaultPlugins
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/eraser/Eraser.DefaultPlugins/ErasureTargets/FileSystemObjectErasureTarget.cs

    r2638 r2641  
    377377                    //Either we could not close all instances, or we already tried twice. Report 
    378378                    //the error. 
    379                     StringBuilder processStr = new StringBuilder(); 
    380                     foreach (OpenHandle handle in remainingHandles) 
     379                    string processes = string.Empty; 
    381380                    { 
    382                         try 
     381                        StringBuilder processStr = new StringBuilder(); 
     382                        foreach (OpenHandle handle in remainingHandles) 
    383383                        { 
    384                             processStr.AppendFormat( 
    385                                 System.Globalization.CultureInfo.InvariantCulture, 
    386                                 "{0}, ", handle.Process.MainModule.FileName); 
     384                            try 
     385                            { 
     386                                processStr.AppendFormat( 
     387                                    System.Globalization.CultureInfo.InvariantCulture, 
     388                                    "{0}, ", handle.Process.MainModule.FileName); 
     389                            } 
     390                            catch (System.ComponentModel.Win32Exception) 
     391                            { 
     392                                processStr.AppendFormat( 
     393                                    System.Globalization.CultureInfo.InvariantCulture, 
     394                                    "Process ID {0}, ", handle.Process.Id); 
     395                            } 
    387396                        } 
    388                         catch (System.ComponentModel.Win32Exception) 
     397 
     398                        if (processStr.Length > 2) 
    389399                        { 
    390                             processStr.AppendFormat( 
    391                                 System.Globalization.CultureInfo.InvariantCulture, 
    392                                 "Process ID {0}, ", handle.Process.Id); 
     400                            processes = processStr.ToString().Remove(processStr.Length - 2)).Trim()); 
     401                        } 
     402                        else 
     403                        { 
     404                            processes = S._("(unknown)"); 
    393405                        } 
    394406                    } 
     
    396408                    throw new SharingViolationException(S._( 
    397409                        "Could not force closure of file \"{0}\" {1}", info.FileName, 
    398                         S._("(locked by {0})", 
    399                             processStr.ToString().Remove(processStr.Length - 2)).Trim()), 
    400                         info.FileName); 
     410                        S._("(locked by {0})", processes, info.FileName))); 
    401411                } 
    402412            } 
  • trunk/eraser/Eraser.DefaultPlugins/FileSystems/Windows.cs

    r2559 r2641  
    139139                                } 
    140140 
    141                                 StringBuilder processStr = new StringBuilder(); 
    142                                 foreach (OpenHandle handle in OpenHandle.Close(info.FullName)) 
     141                                //Either we could not close all instances, or we already tried twice. Report 
     142                                //the error. 
     143                                string processes = string.Empty; 
    143144                                { 
    144                                     try 
     145                                    StringBuilder processStr = new StringBuilder(); 
     146                                    foreach (OpenHandle handle in remainingHandles) 
    145147                                    { 
    146                                         processStr.AppendFormat( 
    147                                             System.Globalization.CultureInfo.InvariantCulture, 
    148                                             "{0}, ", handle.Process.MainModule.FileName); 
     148                                        try 
     149                                        { 
     150                                            processStr.AppendFormat( 
     151                                                System.Globalization.CultureInfo.InvariantCulture, 
     152                                                "{0}, ", handle.Process.MainModule.FileName); 
     153                                        } 
     154                                        catch (System.ComponentModel.Win32Exception) 
     155                                        { 
     156                                            processStr.AppendFormat( 
     157                                                System.Globalization.CultureInfo.InvariantCulture, 
     158                                                "Process ID {0}, ", handle.Process.Id); 
     159                                        } 
    149160                                    } 
    150                                     catch (System.ComponentModel.Win32Exception) 
     161 
     162                                    if (processStr.Length > 2) 
    151163                                    { 
    152                                         processStr.AppendFormat( 
    153                                             System.Globalization.CultureInfo.InvariantCulture, 
    154                                             "Process ID {0}, ", handle.Process.Id); 
     164                                        processes = processStr.ToString().Remove(processStr.Length - 2)).Trim()); 
     165                                    } 
     166                                    else 
     167                                    { 
     168                                        processes = S._("(unknown)"); 
    155169                                    } 
    156170                                } 
    157171 
    158                                 if (processStr.Length != 0) 
    159                                     Logger.Log(S._("Could not force closure of file \"{0}\" {1}", 
    160                                             info.FullName, S._("(locked by {0})", 
    161                                                 processStr.ToString().Remove(processStr.Length - 2)).Trim()), 
    162                                         LogLevel.Error); 
     172                                throw new SharingViolationException(S._( 
     173                                    "Could not force closure of file \"{0}\" {1}", info.FileName, 
     174                                    S._("(locked by {0})", processes, info.FileName))); 
    163175                            } 
    164176 
Note: See TracChangeset for help on using the changeset viewer.