null pointer exception - decoding "null" type
Using ocf.NewDecoder(r) on a random avro file, the Decode operation panics due to a null pointer exception from hamba/avro. The issue is that newEfaceDecoder inside codec_dynamic does not check the error of genericReceiver and proceeds with a nil typ value, which causes a null pointer exception later in the code.
One fix could be to add a Null condition in genericReceiver in codec_generic.go:
case Null:
return reflect2.TypeOf((*null)(nil)), nil
That at least results in a "avro: schema type null in unsupported" error rather than a NPE. Ideally errors should also not be ignored, and turned into some sort of error upward.
Can you provide a small bit a of code that reproduces the issue?
Schema:
{
"type": "record",
"name": "TestRecord",
"namespace": "com.example.test",
"fields": [
{ "name": "nullField", "type": "null" },
{ "name": "booleanField", "type": "boolean" },
{ "name": "intField", "type": "int" },
{ "name": "longField", "type": "long" },
{ "name": "floatField", "type": "float" },
{ "name": "doubleField", "type": "double" },
{ "name": "bytesField", "type": "bytes" },
{ "name": "stringField", "type": "string" },
{
"name": "arrayField",
"type": { "type": "array", "items": "int" }
},
{
"name": "mapField",
"type": { "type": "map", "values": "string" }
},
{
"name": "unionField",
"type": ["null", "string", "int"]
},
{
"name": "fixedField",
"type": { "type": "fixed", "name": "FixedType", "size": 16 }
},
{
"name": "enumField",
"type": { "type": "enum", "name": "EnumType", "symbols": ["A", "B", "C"] }
},
{
"name": "recordField",
"type": {
"type": "record",
"name": "NestedRecord",
"fields": [
{ "name": "nestedIntField", "type": "int" },
{ "name": "nestedStringField", "type": "string" }
]
}
},
{
"name": "dateField",
"type": { "type": "int", "logicalType": "date" }
},
{
"name": "timestampMillisField",
"type": { "type": "long", "logicalType": "timestamp-millis" }
},
{
"name": "timestampMicrosField",
"type": { "type": "long", "logicalType": "timestamp-micros" }
},
{
"name": "timeMillisField",
"type": { "type": "int", "logicalType": "time-millis" }
},
{
"name": "timeMicrosField",
"type": { "type": "long", "logicalType": "time-micros" }
},
{
"name": "decimalBytesField",
"type": {
"type": "bytes",
"logicalType": "decimal",
"precision": 10,
"scale": 2
}
},
{
"name": "decimalFixedField",
"type": {
"type": "fixed",
"name": "DecimalFixed",
"size": 8,
"logicalType": "decimal",
"precision": 16,
"scale": 4
}
},
{
"name": "uuidField",
"type": { "type": "string", "logicalType": "uuid" }
}
]
}
Base64 avro encoded value:
T2JqAQIWYXZyby5zY2hlbWHGGHsidHlwZSI6InJlY29yZCIsIm5hbWUiOiJUZXN0UmVjb3JkIiwibmFtZXNwYWNlIjoiY29tLmV4YW1wbGUudGVzdCIsImZpZWxkcyI6W3sibmFtZSI6Im51bGxGaWVsZCIsInR5cGUiOiJudWxsIn0seyJuYW1lIjoiYm9vbGVhbkZpZWxkIiwidHlwZSI6ImJvb2xlYW4ifSx7Im5hbWUiOiJpbnRGaWVsZCIsInR5cGUiOiJpbnQifSx7Im5hbWUiOiJsb25nRmllbGQiLCJ0eXBlIjoibG9uZyJ9LHsibmFtZSI6ImZsb2F0RmllbGQiLCJ0eXBlIjoiZmxvYXQifSx7Im5hbWUiOiJkb3VibGVGaWVsZCIsInR5cGUiOiJkb3VibGUifSx7Im5hbWUiOiJieXRlc0ZpZWxkIiwidHlwZSI6ImJ5dGVzIn0seyJuYW1lIjoic3RyaW5nRmllbGQiLCJ0eXBlIjoic3RyaW5nIn0seyJuYW1lIjoiYXJyYXlGaWVsZCIsInR5cGUiOnsidHlwZSI6ImFycmF5IiwiaXRlbXMiOiJpbnQifX0seyJuYW1lIjoibWFwRmllbGQiLCJ0eXBlIjp7InR5cGUiOiJtYXAiLCJ2YWx1ZXMiOiJzdHJpbmcifX0seyJuYW1lIjoidW5pb25GaWVsZCIsInR5cGUiOlsibnVsbCIsInN0cmluZyIsImludCJdfSx7Im5hbWUiOiJmaXhlZEZpZWxkIiwidHlwZSI6eyJ0eXBlIjoiZml4ZWQiLCJuYW1lIjoiRml4ZWRUeXBlIiwic2l6ZSI6MTZ9fSx7Im5hbWUiOiJlbnVtRmllbGQiLCJ0eXBlIjp7InR5cGUiOiJlbnVtIiwibmFtZSI6IkVudW1UeXBlIiwic3ltYm9scyI6WyJBIiwiQiIsIkMiXX19LHsibmFtZSI6InJlY29yZEZpZWxkIiwidHlwZSI6eyJ0eXBlIjoicmVjb3JkIiwibmFtZSI6Ik5lc3RlZFJlY29yZCIsImZpZWxkcyI6W3sibmFtZSI6Im5lc3RlZEludEZpZWxkIiwidHlwZSI6ImludCJ9LHsibmFtZSI6Im5lc3RlZFN0cmluZ0ZpZWxkIiwidHlwZSI6InN0cmluZyJ9XX19LHsibmFtZSI6ImRhdGVGaWVsZCIsInR5cGUiOnsidHlwZSI6ImludCIsImxvZ2ljYWxUeXBlIjoiZGF0ZSJ9fSx7Im5hbWUiOiJ0aW1lc3RhbXBNaWxsaXNGaWVsZCIsInR5cGUiOnsidHlwZSI6ImxvbmciLCJsb2dpY2FsVHlwZSI6InRpbWVzdGFtcC1taWxsaXMifX0seyJuYW1lIjoidGltZXN0YW1wTWljcm9zRmllbGQiLCJ0eXBlIjp7InR5cGUiOiJsb25nIiwibG9naWNhbFR5cGUiOiJ0aW1lc3RhbXAtbWljcm9zIn19LHsibmFtZSI6InRpbWVNaWxsaXNGaWVsZCIsInR5cGUiOnsidHlwZSI6ImludCIsImxvZ2ljYWxUeXBlIjoidGltZS1taWxsaXMifX0seyJuYW1lIjoidGltZU1pY3Jvc0ZpZWxkIiwidHlwZSI6eyJ0eXBlIjoibG9uZyIsImxvZ2ljYWxUeXBlIjoidGltZS1taWNyb3MifX0seyJuYW1lIjoiZGVjaW1hbEJ5dGVzRmllbGQiLCJ0eXBlIjp7InR5cGUiOiJieXRlcyIsImxvZ2ljYWxUeXBlIjoiZGVjaW1hbCIsInByZWNpc2lvbiI6MTAsInNjYWxlIjoyfX0seyJuYW1lIjoiZGVjaW1hbEZpeGVkRmllbGQiLCJ0eXBlIjp7InR5cGUiOiJmaXhlZCIsIm5hbWUiOiJEZWNpbWFsRml4ZWQiLCJzaXplIjo4LCJsb2dpY2FsVHlwZSI6ImRlY2ltYWwiLCJwcmVjaXNpb24iOjE2LCJzY2FsZSI6NH19LHsibmFtZSI6InV1aWRGaWVsZCIsInR5cGUiOnsidHlwZSI6InN0cmluZyIsImxvZ2ljYWxUeXBlIjoidXVpZCJ9fV19ANKJQuRymMVZiLBp5wNKdgcCqAYAqcqTlQyUsqb+1JOs5ckBniwqP7D4iBQRAuo/EmztHH3XlYujOxo6aiZVHE4VQQI7dwxlFur5rN8DtqL7wwXNuMu3CtLHvJYHoYqBZP6s29kBzuaSR6aSuRLj5r6mBKmenpIBwuulkAgAGgIhGD1gHTgYU2QxCitVIAIDFGcQBG01WzIRAEcCQx5HNyAwazQAXU92R2UICHoCBxBfPmFKWy5QUwJoFAJiOjoPWQkLXBYCERJyKAcmY3oDNX4CMhoqam01GwNxNSEpaAQbAjQYTRd/GDhBZhtlRAtpAjUebDgvGhhiAnNzECtrVgNRAlceL30PN11wPSRteRUGQBglAloSX39bKAkWFmtzAhscQBlzdFRnSlJdMx0HT1gCHBorYi4bNUBqb1hGJB8KAASB4OTiCGJLivWClBosD/gvdP3EuscC3beArAEWQEJ3RWwNRWcJWi6q6eTnA4Xwmcy55+O+0gGc9vzFp8mC5TfD89aXD5GA0qOXmeGhzgEK/mF/K0cPID4CxJkNABBdAV8eQz4mY9KJQuRymMVZiLBp5wNKdgc=