Skip to content

Commit 1be86af

Browse files
authored
fix(pg-protocol): read ParameterDescription type OIDs as unsigned (#3728)
parseField() already reads dataTypeID as uint32 for RowDescription (with a regression test covering OIDs above 2^31-1), but parseParameterDescriptionMessage() was still using the signed int32 reader for the same kind of value, so custom extension types with a high OID would come back negative in ParameterDescriptionMessage.dataTypeIDs.
1 parent eb19d0f commit 1be86af

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

packages/pg-protocol/src/inbound-parser.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ const oneParameterDescBuf = buffers.parameterDescription([1111])
161161

162162
const twoParameterDescBuf = buffers.parameterDescription([2222, 3333])
163163

164+
const bigOidParameterDescBuf = buffers.parameterDescription([3000000003])
165+
164166
const expectedEmptyParameterDescriptionMessage = {
165167
name: 'parameterDescription',
166168
length: 6,
@@ -182,6 +184,13 @@ const expectedTwoParameterMessage = {
182184
dataTypeIDs: [2222, 3333],
183185
}
184186

187+
const expectedBigOidParameterMessage = {
188+
name: 'parameterDescription',
189+
length: 10,
190+
parameterCount: 1,
191+
dataTypeIDs: [3000000003],
192+
}
193+
185194
const testForMessage = function (buffer: Buffer, expectedMessage: any) {
186195
it('receives and parses ' + expectedMessage.name, async () => {
187196
const messages = await parseBuffers([buffer])
@@ -288,6 +297,7 @@ describe('PgPacketStream', function () {
288297
testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage)
289298
testForMessage(oneParameterDescBuf, expectedOneParameterMessage)
290299
testForMessage(twoParameterDescBuf, expectedTwoParameterMessage)
300+
testForMessage(bigOidParameterDescBuf, expectedBigOidParameterMessage)
291301
})
292302

293303
describe('parsing rows', function () {

packages/pg-protocol/src/parser.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ const parseParameterDescriptionMessage = (reader: BufferReader) => {
300300
const parameterCount = reader.int16()
301301
const message = new ParameterDescriptionMessage(LATEINIT_LENGTH, parameterCount)
302302
for (let i = 0; i < parameterCount; i++) {
303-
message.dataTypeIDs[i] = reader.int32()
303+
// OIDs are unsigned, same as dataTypeID in parseField above
304+
message.dataTypeIDs[i] = reader.uint32()
304305
}
305306
return message
306307
}

0 commit comments

Comments
 (0)