Can't marshal nil pointer of structure with custom MarshalBSONValue?

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Works as Designed
    • Priority: Major - P3
    • None
    • Affects Version/s: 1.1.3
    • Component/s: BSON
    • None
    • Environment:
      mongo-go-driver 1.1.3 and latest version from github
      Go 1.12.7
      MacOS Catalina
    • None
    • None
    • None
    • None
    • None
    • None
    • None

      // code placeholder
      package main
      
      import (
          "fmt"
          "github.com/pkg/errors"
          "go.mongodb.org/mongo-driver/bson"
          "go.mongodb.org/mongo-driver/bson/bsontype"
          "go.mongodb.org/mongo-driver/x/bsonx"
          "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
          "log"
          "strconv"
      )
      
      type Bar struct {
          a int64
      }
      
      func (b Bar) MarshalBSONValue() (bsontype.Type, []byte, error) {
          return bsonx.String(fmt.Sprintf("%d", b.a)).MarshalBSONValue()
      }
      
      func (b *Bar) UnmarshalBSONValue(t bsontype.Type, data []byte) error {
          if t != bsontype.String {
              return errors.Errorf("bsontype(%s) not allowed in Bar.UnmarshalBSONValue, only string accept", t.String())
          }
          str, _, ok := bsoncore.ReadString(data)
          if !ok {
              return errors.Errorf("decode string, but string not found")
          }
      
          dec, err := strconv.ParseInt(str, 10, 64)
          if err != nil {
              return err
          }
          *b = Bar{a:dec}
          return nil
      }
      
      type Foo struct {
          Bar *Bar`bson:"Bar, omitempty"`
      }
      
      func main() {
          f := Foo{}
          _, err := bson.Marshal(f)
          if err != nil {
              log.Fatalf("Failed to marshal. Error: %v", err)
          }
      }
      

       

       

      this program will panic with error:
       
      {{panic: value method main.Bar.MarshalBSONValue called using nil *Bar pointer

      goroutine 1 [running]:main.(*Bar).MarshalBSONValue(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)<autogenerated>:1 +0x87reflect.Value.call(0x11ebc60, 0xc000010330, 0x293, 0x1218915, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, ...)/usr/local/go/src/reflect/value.go:447 +0x461}}

            Assignee:
            Unassigned
            Reporter:
            n f
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: