Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

null pointer exception - decoding "null" type #432

Closed
vgough opened this issue Aug 12, 2024 · 2 comments · Fixed by #501
Closed

null pointer exception - decoding "null" type #432

vgough opened this issue Aug 12, 2024 · 2 comments · Fixed by #501

Comments

@vgough
Copy link

vgough commented Aug 12, 2024

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.

@nrwiersma
Copy link
Member

Can you provide a small bit a of code that reproduces the issue?

@rockwotj
Copy link
Contributor

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=

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Development

Successfully merging a pull request may close this issue.

3 participants