From 4a5e4491c95ac678cd97edb35cc5b6169291a078 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 10 Oct 2018 16:13:05 +0200 Subject: [PATCH 1/3] Remove invalid properties from map on property load In order to not have config file flooded with invalid and corrupted properties in case of file corruption, remove all these invalid properties from property map on configuration load. Signed-off-by: Tomas Slusny --- .../src/main/java/net/runelite/client/config/ConfigManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 68989ea4d8..be4b980593 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -199,6 +199,7 @@ public class ConfigManager if (split.length != 2) { log.debug("Properties key malformed!: {}", groupAndKey); + properties.remove(groupAndKey); return; } From 85c9ec890be2f516851cbd0f29fc0146fe4ae52b Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 10 Oct 2018 16:14:57 +0200 Subject: [PATCH 2/3] Use UTF-8 instead of ISO 8859-1 when loading/saving config In order to prevent failures on reading/writing incorrectly escaped characters or writing special UTF-8 characters on save as gibberish, explicitly specify UTF-8 encoding when loading and writing properties. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/config/ConfigManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index be4b980593..8cb35728d0 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -36,9 +36,12 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; +import java.nio.charset.Charset; import java.time.Instant; import java.util.Arrays; import java.util.Comparator; @@ -179,7 +182,7 @@ public class ConfigManager try (FileInputStream in = new FileInputStream(propertiesFile)) { - properties.load(in); + properties.load(new InputStreamReader(in, Charset.forName("UTF-8"))); } catch (FileNotFoundException ex) { @@ -226,7 +229,7 @@ public class ConfigManager try (FileOutputStream out = new FileOutputStream(propertiesFile)) { - properties.store(out, "RuneLite configuration"); + properties.store(new OutputStreamWriter(out, Charset.forName("UTF-8")), "RuneLite configuration"); } } From 33954ccf67f11c1da61ef45b21a7541b39c0a81a Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 10 Oct 2018 16:17:16 +0200 Subject: [PATCH 3/3] Lock configuration file when writing to filesystem Use OS-wide exclusive lock when writing configuration file to filesystem to prevent config file corruption when multiple concurrent writers try to write to same config file at same time. Signed-off-by: Tomas Slusny --- .../net/runelite/client/config/ConfigManager.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 8cb35728d0..400083b815 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -41,6 +41,7 @@ import java.io.OutputStreamWriter; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; +import java.nio.channels.FileLock; import java.nio.charset.Charset; import java.time.Instant; import java.util.Arrays; @@ -229,7 +230,16 @@ public class ConfigManager try (FileOutputStream out = new FileOutputStream(propertiesFile)) { - properties.store(new OutputStreamWriter(out, Charset.forName("UTF-8")), "RuneLite configuration"); + final FileLock lock = out.getChannel().lock(); + + try + { + properties.store(new OutputStreamWriter(out, Charset.forName("UTF-8")), "RuneLite configuration"); + } + finally + { + lock.release(); + } } }