Skip to content

Commit 294da55

Browse files
committed
Fixed base64/xml decode an empty string #1209
1 parent 8d32e6a commit 294da55

File tree

5 files changed

+34
-5
lines changed

5 files changed

+34
-5
lines changed

pkg/yqlib/decoder_base64.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import (
99
)
1010

1111
type base64Decoder struct {
12-
reader io.Reader
13-
finished bool
14-
encoding base64.Encoding
12+
reader io.Reader
13+
finished bool
14+
readAnything bool
15+
encoding base64.Encoding
1516
}
1617

1718
func NewBase64Decoder() Decoder {
@@ -20,6 +21,7 @@ func NewBase64Decoder() Decoder {
2021

2122
func (dec *base64Decoder) Init(reader io.Reader) {
2223
dec.reader = reader
24+
dec.readAnything = false
2325
dec.finished = false
2426
}
2527

@@ -35,7 +37,15 @@ func (dec *base64Decoder) Decode(rootYamlNode *yaml.Node) error {
3537
}
3638
if buf.Len() == 0 {
3739
dec.finished = true
40+
41+
// if we've read _only_ an empty string, lets return that
42+
// otherwise if we've already read some bytes, and now we get
43+
// an empty string, then we are done.
44+
if dec.readAnything {
45+
return io.EOF
46+
}
3847
}
48+
dec.readAnything = true
3949
rootYamlNode.Kind = yaml.ScalarNode
4050
rootYamlNode.Tag = "!!str"
4151
rootYamlNode.Value = buf.String()

pkg/yqlib/decoder_xml.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
type xmlDecoder struct {
1515
reader io.Reader
16+
readAnything bool
1617
attributePrefix string
1718
contentName string
1819
strictMode bool
@@ -28,6 +29,7 @@ func NewXMLDecoder(attributePrefix string, contentName string, strictMode bool)
2829

2930
func (dec *xmlDecoder) Init(reader io.Reader) {
3031
dec.reader = reader
32+
dec.readAnything = false
3133
dec.finished = false
3234
}
3335

@@ -137,8 +139,11 @@ func (dec *xmlDecoder) Decode(rootYamlNode *yaml.Node) error {
137139
return err
138140
} else if firstNode.Tag == "!!null" {
139141
dec.finished = true
140-
return io.EOF
142+
if dec.readAnything {
143+
return io.EOF
144+
}
141145
}
146+
dec.readAnything = true
142147
rootYamlNode.Kind = yaml.DocumentNode
143148
rootYamlNode.Content = []*yaml.Node{firstNode}
144149
dec.finished = true

pkg/yqlib/expression_tokeniser.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,12 +403,18 @@ func initLexer() (*lex.Lexer, error) {
403403
lexer.Add([]byte(`fromyaml`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: YamlInputFormat}))
404404
lexer.Add([]byte(`fromjson`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: YamlInputFormat}))
405405
lexer.Add([]byte(`fromxml`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: XMLInputFormat}))
406+
lexer.Add([]byte(`fromprops`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: PropertiesInputFormat}))
406407

407408
lexer.Add([]byte(`from_yaml`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: YamlInputFormat}))
408409
lexer.Add([]byte(`from_json`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: YamlInputFormat}))
409410
lexer.Add([]byte(`from_xml`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: XMLInputFormat}))
410411
lexer.Add([]byte(`from_props`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: PropertiesInputFormat}))
411412

413+
lexer.Add([]byte(`@yamld`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: YamlInputFormat}))
414+
lexer.Add([]byte(`@jsond`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: YamlInputFormat}))
415+
lexer.Add([]byte(`@xmld`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: XMLInputFormat}))
416+
lexer.Add([]byte(`@propsd`), opTokenWithPrefs(decodeOpType, nil, decoderPreferences{format: PropertiesInputFormat}))
417+
412418
lexer.Add([]byte(`sortKeys`), opToken(sortKeysOpType))
413419
lexer.Add([]byte(`sort_keys`), opToken(sortKeysOpType))
414420

pkg/yqlib/operator_encoder_decoder_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,14 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
251251
"D0, P[], (!!str)::\n",
252252
},
253253
},
254+
{
255+
description: "empty xml decode",
256+
skipDoc: true,
257+
expression: `"" | @xmld`,
258+
expected: []string{
259+
"D0, P[], (!!null)::\n",
260+
},
261+
},
254262
}
255263

256264
func TestEncoderDecoderOperatorScenarios(t *testing.T) {

pkg/yqlib/xml_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ var xmlScenarios = []formatScenario{
216216
description: "Empty doc",
217217
skipDoc: true,
218218
input: "",
219-
expected: "",
219+
expected: "\n",
220220
scenarioType: "decode",
221221
},
222222
{

0 commit comments

Comments
 (0)