Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 745449b

Browse files
committed
resolve double-unescaping of CSV fields
1 parent f565fd3 commit 745449b

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed

src/ServiceStack.Text/CsvReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public static List<string> ParseFields(string line, Func<string,string> parseFn)
7171
while (++i <= len)
7272
{
7373
var value = EatValue(line, ref i);
74-
to.Add(parseFn != null ? parseFn(value) : value);
74+
to.Add(parseFn != null ? parseFn(value.FromCsvField()) : value.FromCsvField());
7575
}
7676

7777
return to;

src/ServiceStack.Text/CsvSerializer.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,18 +151,27 @@ public static T DeserializeFromReader<T>(TextReader reader)
151151

152152
public static T DeserializeFromString<T>(string text)
153153
{
154-
if (string.IsNullOrEmpty(text)) return default(T);
154+
if (string.IsNullOrEmpty(text)) return default;
155155
var results = CsvSerializer<T>.ReadObject(text);
156156
return ConvertFrom<T>(results);
157157
}
158158

159159
public static object DeserializeFromString(Type type, string text)
160160
{
161161
if (string.IsNullOrEmpty(text)) return null;
162-
var fn = GetReadFn(type);
163-
var result = fn(text);
164-
var converted = ConvertFrom(type, result);
165-
return converted;
162+
var hold = JsState.IsCsv;
163+
JsState.IsCsv = true;
164+
try
165+
{
166+
var fn = GetReadFn(type);
167+
var result = fn(text);
168+
var converted = ConvertFrom(type, result);
169+
return converted;
170+
}
171+
finally
172+
{
173+
JsState.IsCsv = hold;
174+
}
166175
}
167176

168177
public static void WriteLateBoundObject(TextWriter writer, object value)

src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,16 @@ public void WriteEnum(TextWriter writer, object enumValue)
259259
[MethodImpl(MethodImplOptions.AggressiveInlining)]
260260
public object UnescapeStringAsObject(ReadOnlySpan<char> value)
261261
{
262-
return value.FromCsvField().Value();
262+
return UnescapeSafeString(value).Value();
263263
}
264264

265-
public string UnescapeSafeString(string value) => value.FromCsvField();
265+
public string UnescapeSafeString(string value) => JsState.IsCsv
266+
? value
267+
: value.FromCsvField();
266268

267-
public ReadOnlySpan<char> UnescapeSafeString(ReadOnlySpan<char> value) => value.FromCsvField();
269+
public ReadOnlySpan<char> UnescapeSafeString(ReadOnlySpan<char> value) => JsState.IsCsv
270+
? value // already unescaped in CsvReader.ParseFields()
271+
: value.FromCsvField();
268272

269273
public string ParseRawString(string value) => value;
270274

tests/ServiceStack.Text.Tests/CsvSerializerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public void Does_parse_fields()
116116
}
117117

118118
[Test]
119-
public void Does_parse_fileds_with_unmatchedJsMark()
119+
public void Does_parse_fields_with_unmatchedJsMark()
120120
{
121121
Assert.That(CsvReader.ParseFields("{A,B"), Is.EqualTo(new[] { "{A", "B" }));
122122
Assert.That(CsvReader.ParseFields("{A},B"), Is.EqualTo(new[] { "{A}", "B" }));

0 commit comments

Comments
 (0)