Browse Source

Fix crash when reading pac user rules

Signed-off-by: Syrone Wong <wong.syrone@gmail.com>
tags/3.4.2.1
Syrone Wong 8 years ago
parent
commit
f9ed9174cc
3 changed files with 22 additions and 7 deletions
  1. +15
    -0
      shadowsocks-csharp/Controller/FileManager.cs
  2. +3
    -3
      shadowsocks-csharp/Controller/Service/GfwListUpdater.cs
  3. +4
    -4
      shadowsocks-csharp/Controller/ShadowsocksController.cs

+ 15
- 0
shadowsocks-csharp/Controller/FileManager.cs View File

@@ -1,6 +1,7 @@
using System; using System;
using System.IO; using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Text;
namespace Shadowsocks.Controller namespace Shadowsocks.Controller
{ {
@@ -39,5 +40,19 @@ namespace Shadowsocks.Controller
} }
} }
} }
public static string NonExclusiveReadAllText(string path)
{
return NonExclusiveReadAllText(path, Encoding.Default);
}
public static string NonExclusiveReadAllText(string path, Encoding encoding)
{
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var sr = new StreamReader(fs, encoding))
{
return sr.ReadToEnd();
}
}
} }
} }

+ 3
- 3
shadowsocks-csharp/Controller/Service/GfwListUpdater.cs View File

@@ -39,7 +39,7 @@ namespace Shadowsocks.Controller
List<string> lines = ParseResult(e.Result); List<string> lines = ParseResult(e.Result);
if (File.Exists(PACServer.USER_RULE_FILE)) if (File.Exists(PACServer.USER_RULE_FILE))
{ {
string local = File.ReadAllText(PACServer.USER_RULE_FILE, Encoding.UTF8);
string local = FileManager.NonExclusiveReadAllText(PACServer.USER_RULE_FILE, Encoding.UTF8);
using (var sr = new StringReader(local)) using (var sr = new StringReader(local))
{ {
foreach (var rule in sr.NonWhiteSpaceLines()) foreach (var rule in sr.NonWhiteSpaceLines())
@@ -53,7 +53,7 @@ namespace Shadowsocks.Controller
string abpContent; string abpContent;
if (File.Exists(PACServer.USER_ABP_FILE)) if (File.Exists(PACServer.USER_ABP_FILE))
{ {
abpContent = File.ReadAllText(PACServer.USER_ABP_FILE, Encoding.UTF8);
abpContent = FileManager.NonExclusiveReadAllText(PACServer.USER_ABP_FILE, Encoding.UTF8);
} }
else else
{ {
@@ -62,7 +62,7 @@ namespace Shadowsocks.Controller
abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented));
if (File.Exists(PACServer.PAC_FILE)) if (File.Exists(PACServer.PAC_FILE))
{ {
string original = File.ReadAllText(PACServer.PAC_FILE, Encoding.UTF8);
string original = FileManager.NonExclusiveReadAllText(PACServer.PAC_FILE, Encoding.UTF8);
if (original == abpContent) if (original == abpContent)
{ {
UpdateCompleted(this, new ResultEventArgs(false)); UpdateCompleted(this, new ResultEventArgs(false));


+ 4
- 4
shadowsocks-csharp/Controller/ShadowsocksController.cs View File

@@ -557,10 +557,10 @@ namespace Shadowsocks.Controller
UpdatePACFromGFWList(); UpdatePACFromGFWList();
return; return;
} }
List<string> lines = GFWListUpdater.ParseResult(File.ReadAllText(Utils.GetTempPath("gfwlist.txt")));
List<string> lines = GFWListUpdater.ParseResult(FileManager.NonExclusiveReadAllText(Utils.GetTempPath("gfwlist.txt")));
if (File.Exists(PACServer.USER_RULE_FILE)) if (File.Exists(PACServer.USER_RULE_FILE))
{ {
string local = File.ReadAllText(PACServer.USER_RULE_FILE, Encoding.UTF8);
string local = FileManager.NonExclusiveReadAllText(PACServer.USER_RULE_FILE, Encoding.UTF8);
using (var sr = new StringReader(local)) using (var sr = new StringReader(local))
{ {
foreach (var rule in sr.NonWhiteSpaceLines()) foreach (var rule in sr.NonWhiteSpaceLines())
@@ -574,7 +574,7 @@ namespace Shadowsocks.Controller
string abpContent; string abpContent;
if (File.Exists(PACServer.USER_ABP_FILE)) if (File.Exists(PACServer.USER_ABP_FILE))
{ {
abpContent = File.ReadAllText(PACServer.USER_ABP_FILE, Encoding.UTF8);
abpContent = FileManager.NonExclusiveReadAllText(PACServer.USER_ABP_FILE, Encoding.UTF8);
} }
else else
{ {
@@ -583,7 +583,7 @@ namespace Shadowsocks.Controller
abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented));
if (File.Exists(PACServer.PAC_FILE)) if (File.Exists(PACServer.PAC_FILE))
{ {
string original = File.ReadAllText(PACServer.PAC_FILE, Encoding.UTF8);
string original = FileManager.NonExclusiveReadAllText(PACServer.PAC_FILE, Encoding.UTF8);
if (original == abpContent) if (original == abpContent)
{ {
return; return;


Loading…
Cancel
Save