[GODRIVER-1519] Extended JSON use of math.BigInt can hang on large inputs Created: 03/Mar/20  Updated: 28/Oct/23  Resolved: 30/May/23

Status: Closed
Project: Go Driver
Component/s: JSON & ExtJSON
Affects Version/s: 1.3.0
Fix Version/s: 1.12.0, 1.11.7

Type: Bug Priority: Major - P3
Reporter: David Golden Assignee: Matt Dale
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Related
related to DRIVERS-2651 Add decimal128 clamped zeros tests wi... Closed
Epic Link: Improve JSON & ExtJSON Implementation
Documentation Changes: Not Needed
Documentation Changes Summary:

1. What would you like to communicate to the user about this feature?
2. Would you like the user to see examples of the syntax and/or executable code and its output?
3. Which versions of the driver/connector does this apply to?


 Description   

Some inputs for decimal128 conversion can take "forever":

{"":{"$numberDecimal":"0E000002000000000000"}}

We should find a way to constrain decimal128 to a computable range rather than rely on full computation and after-the-fact clamping.

Example stack trace of a hung process:

PC=0x4e8d1b m=0 sigcode=0
 
goroutine 1 [running]:
math/big.nat.mul(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc00001a368, 0x1, 0x1, 0xc00000c160, ...)
        /usr/local/go/src/math/big/nat.go:408 +0x1b fp=0xc00009d550 sp=0xc00009d548 pc=0x4e8d1b
math/big.(*Int).Mul(0xc00009d678, 0xc00009d678, 0xc00000c120, 0xc00009d678)
        /usr/local/go/src/math/big/int.go:168 +0x119 fp=0xc00009d5c0 sp=0xc00009d550 pc=0x4dedf9
go.mongodb.org/mongo-driver/bson/primitive.ParseDecimal128FromBigInt(0xc00009d678, 0x1d1992ab76e, 0x1, 0xa, 0xc00009d758)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/primitive/decimal.go:337 +0x2e7 fp=0xc00009d6a8 sp=0xc00009d5c0 pc=0x53b107
go.mongodb.org/mongo-driver/bson/primitive.ParseDecimal128(0xc000114000, 0x14, 0x7fc3adc00428, 0x0, 0xc00009d8b0, 0x559fb6)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/primitive/decimal.go:289 +0x55c fp=0xc00009d788 sp=0xc00009d6a8 pc=0x53a96c
go.mongodb.org/mongo-driver/bson/bsonrw.(*extJSONValue).parseDecimal128(0xc000100160, 0x570013, 0xc000100160, 0x0, 0x0)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/bsonrw/extjson_wrappers.go:261 +0x5f fp=0xc00009d7e0 sp=0xc00009d788 pc=0x55beef
go.mongodb.org/mongo-driver/bson/bsonrw.(*extJSONValueReader).ReadDecimal128(0xc000102030, 0x40ba13, 0xc000110000, 0xc00009d8c0, 0x44099e)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/bsonrw/extjson_reader.go:395 +0xad fp=0xc00009d840 sp=0xc00009d7e0 pc=0x55866d
go.mongodb.org/mongo-driver/bson/bsonrw.Copier.CopyValue(0x669c80, 0xc000110000, 0x669d60, 0xc000102030, 0xc000110000, 0x0)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/bsonrw/copier.go:309 +0x95e fp=0xc00009d8c0 sp=0xc00009d840 pc=0x55245e
go.mongodb.org/mongo-driver/bson/bsonrw.Copier.copyDocumentCore(0x664180, 0xc000110000, 0x663840, 0xc000102030, 0x0, 0x604de0)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/bsonrw/copier.go:382 +0xd5 fp=0xc00009d938 sp=0xc00009d8c0 pc=0x5527e5
go.mongodb.org/mongo-driver/bson/bsonrw.Copier.CopyDocument(0x669c80, 0xc000110000, 0x669d60, 0xc000102030, 0x0, 0xc000100000)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/bsonrw/copier.go:45 +0xbf fp=0xc00009d988 sp=0xc00009d938 pc=0x5505ef
go.mongodb.org/mongo-driver/bson/bsonrw.Copier.AppendDocumentBytes(0x7d0138, 0x0, 0x0, 0x669d60, 0xc000102030, 0x0, 0x0, 0x0, 0x0, 0x0)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/bsonrw/copier.go:131 +0x1e7 fp=0xc00009da38 sp=0xc00009d988 pc=0x551047
go.mongodb.org/mongo-driver/bson.PrimitiveCodecs.RawDecodeValue(0xc0000dac40, 0xc00009db00, 0x0, 0x0, 0x669d60, 0xc000102030, 0x606b00, 0xc000100000, 0x197, 0x59bb24, ...)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/primitive_codecs.go:86 +0x136 fp=0xc00009db18 sp=0xc00009da38 pc=0x5afaf6
go.mongodb.org/mongo-driver/bson.PrimitiveCodecs.RawDecodeValue-fm(0xc0000dac40, 0xc000102000, 0x0, 0x0, 0x669d60, 0xc000102030, 0x606b00, 0xc000100000, 0x197, 0x66a200, ...)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/primitive_codecs.go:75 +0x90 fp=0xc00009db80 sp=0xc00009db18 pc=0x5b84d0
go.mongodb.org/mongo-driver/bson/bsoncodec.ValueDecoderFunc.DecodeValue(0xc00001ab30, 0xc0000dac40, 0x606b00, 0x0, 0x0, 0x669d60, 0xc000102030, 0x606b00, 0xc000100000, 0x197, ...)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/bsoncodec/bsoncodec.go:156 +0x98 fp=0xc00009dbe8 sp=0xc00009db80 pc=0x57bea8
go.mongodb.org/mongo-driver/bson.(*Decoder).Decode(0xc000102060, 0x6066a0, 0xc000100000, 0xc00009dd10, 0x663460)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/decoder.go:98 +0x20d fp=0xc00009dcc0 sp=0xc00009dbe8 pc=0x5ae07d
go.mongodb.org/mongo-driver/bson.unmarshalFromReader(0xc0000dac40, 0xc000102000, 0x0, 0x0, 0x669d60, 0xc000102030, 0x6066a0, 0xc000100000, 0x0, 0x0)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/unmarshal.go:100 +0x121 fp=0xc00009dd48 sp=0xc00009dcc0 pc=0x5b3861
go.mongodb.org/mongo-driver/bson.UnmarshalExtJSONWithRegistry(0xc0000dac40, 0xc0000f8090, 0x2e, 0x30, 0x0, 0x6066a0, 0xc000100000, 0x0, 0x5d5980)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/unmarshal.go:72 +0x100 fp=0xc00009dda8 sp=0xc00009dd48 pc=0x5b3700
go.mongodb.org/mongo-driver/bson.UnmarshalExtJSON(...)
        /home/xdg/golang/pkg/mod/go.mongodb.org/mongo-driver@v1.3.0/bson/unmarshal.go:60
main.main()
        /home/xdg/tmp/godriver-extjson/main.go:25 +0x358 fp=0xc00009df60 sp=0xc00009dda8 pc=0x5b8ec8
runtime.main()
        /usr/local/go/src/runtime/proc.go:203 +0x21e fp=0xc00009dfe0 sp=0xc00009df60 pc=0x42ea3e
runtime.goexit()
        /usr/local/go/src/runtime/asm_amd64.s:1357 +0x1 fp=0xc00009dfe8 sp=0xc00009dfe0 pc=0x457171
 
rax    0xc00009d4b8
rbx    0x0
rcx    0xc000000180
rdx    0xc00009d678
rdi    0x0
rsi    0x0
rbp    0xc00009d5b0
rsp    0xc00009d548
r8     0x0
r9     0x0
r10    0x0
r11    0x1
r12    0x1
r13    0xc00001a368
r14    0x663580
r15    0x0
rip    0x4e8d1b
rflags 0x206
cs     0x33
fs     0x0
gs     0x0



 Comments   
Comment by Githook User [ 30/May/23 ]

Author:

{'name': 'Matt Dale', 'email': '9760375+matthewdale@users.noreply.github.com', 'username': 'matthewdale'}

Message: GODRIVER-1519 Fix parsing decimal128 zero values with large exponents. (#1277)
Branch: release/1.11
https://github.com/mongodb/mongo-go-driver/commit/b1ab40e4432f4e4127635575c8d05b0b0c5b93af

Comment by Githook User [ 30/May/23 ]

Author:

{'name': 'Matt Dale', 'email': '9760375+matthewdale@users.noreply.github.com', 'username': 'matthewdale'}

Message: GODRIVER-1519 Fix parsing decimal128 zero values with large exponents. (#1277)
Branch: master
https://github.com/mongodb/mongo-go-driver/commit/d1820036618ee0686caf78d35c82b977ee1cf6e9

Comment by Matt Dale [ 26/May/23 ]

PR: https://github.com/mongodb/mongo-go-driver/pull/1277

Generated at Thu Feb 08 08:36:34 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.