Skip to content

Commit 6631dd3

Browse files
committed
escape the null character in csv, tsv, sh formats (close #200)
1 parent 5253817 commit 6631dd3

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

cli/test.yaml

+6-6
Original file line numberDiff line numberDiff line change
@@ -5848,9 +5848,9 @@
58485848
args:
58495849
- '@csv'
58505850
input: |
5851-
[1, "foo", null, "foo,\n\"bar\"\tbaz"]
5851+
[1, "foo", null, "foo,\n\"bar\"\tbaz\u0000\\0"]
58525852
expected: |
5853-
"1,\"foo\",,\"foo,\n\"\"bar\"\"\tbaz\""
5853+
"1,\"foo\",,\"foo,\n\"\"bar\"\"\tbaz\\0\\0\""
58545854
58555855
- name: format strings @csv with string interpolation
58565856
args:
@@ -5879,9 +5879,9 @@
58795879
args:
58805880
- '@tsv'
58815881
input: |
5882-
[1, "foo", null, "foo,\n\"bar\"\tba\\z"]
5882+
[1, "foo", null, "foo,\n\"bar\"\tbaz\u0000\\0"]
58835883
expected: |
5884-
"1\tfoo\t\tfoo,\\n\"bar\"\\tba\\\\z"
5884+
"1\tfoo\t\tfoo,\\n\"bar\"\\tbaz\\0\\\\0"
58855885
58865886
- name: format strings @tsv with string interpolation
58875887
args:
@@ -5912,11 +5912,11 @@
59125912
input: |
59135913
null
59145914
true
5915-
[1, "f'o'o", null, false]
5915+
[1, "f'o'o\u0000\\0", null, false]
59165916
expected: |
59175917
"null"
59185918
"true"
5919-
"1 'f'\\''o'\\''o' null false"
5919+
"1 'f'\\''o'\\''o\\0\\0' null false"
59205920
59215921
- name: format strings @sh error
59225922
args:

func.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -808,9 +808,14 @@ func funcToURI(v interface{}) interface{} {
808808
}
809809
}
810810

811+
var csvEscaper = strings.NewReplacer(
812+
`"`, `""`,
813+
"\x00", `\0`,
814+
)
815+
811816
func funcToCSV(v interface{}) interface{} {
812817
return formatJoin("csv", v, ",", func(s string) string {
813-
return `"` + strings.ReplaceAll(s, `"`, `""`) + `"`
818+
return `"` + csvEscaper.Replace(s) + `"`
814819
})
815820
}
816821

@@ -819,18 +824,24 @@ var tsvEscaper = strings.NewReplacer(
819824
"\r", `\r`,
820825
"\n", `\n`,
821826
"\\", `\\`,
827+
"\x00", `\0`,
822828
)
823829

824830
func funcToTSV(v interface{}) interface{} {
825831
return formatJoin("tsv", v, "\t", tsvEscaper.Replace)
826832
}
827833

834+
var shEscaper = strings.NewReplacer(
835+
"'", `'\''`,
836+
"\x00", `\0`,
837+
)
838+
828839
func funcToSh(v interface{}) interface{} {
829840
if _, ok := v.([]interface{}); !ok {
830841
v = []interface{}{v}
831842
}
832843
return formatJoin("sh", v, " ", func(s string) string {
833-
return "'" + strings.ReplaceAll(s, "'", `'\''`) + "'"
844+
return "'" + shEscaper.Replace(s) + "'"
834845
})
835846
}
836847

0 commit comments

Comments
 (0)