Skip to content

UPSTREAM PR #26917: python: fix duplicate proto field detection to use field number instead of JSON name#146

Open
loci-dev wants to merge 1 commit into
mainfrom
loci/pr-26917-main
Open

UPSTREAM PR #26917: python: fix duplicate proto field detection to use field number instead of JSON name#146
loci-dev wants to merge 1 commit into
mainfrom
loci/pr-26917-main

Conversation

@loci-dev
Copy link
Copy Markdown

Note

Source pull request: protocolbuffers/protobuf#26917

Summary

Fix duplicate proto field detection in the Python JSON parser to use resolved field identity instead of raw JSON key strings.

Root cause

_ConvertMessage() tracked seen fields by their raw JSON key string. Because every proto field with an underscore has two valid JSON representations (snake_case proto name and camelCase json_name), a payload containing both aliases passed the duplicate check undetected.

Fix

# Before
if name in names:
    raise ParseError(...)
names.append(name)

# After
if field.number in names:
    raise ParseError(...)
names.append(field.number)

Field numbers are unique per message and independent of JSON representation, so both aliases for the same field are correctly detected as a duplicate.

Conformance

This brings the Python implementation into conformance with the proto3 JSON specification:

"Parsers are required to reject JSON that contains the same field (either by proto field name or by JSON name) more than once."

The C++ and Go implementations already handle this correctly.

…ad of JSON name

The _ConvertMessage function tracked seen fields by their raw JSON key
string rather than by resolved field identity. Because every proto field
with an underscore has two valid JSON representations (snake_case proto
name and camelCase json_name), a payload containing both aliases passed
the duplicate check undetected — the two strings are different even
though they refer to the same field.

Fix: compare against field.number instead of the raw key string.
Field numbers are unique per message and independent of JSON
representation, so both aliases for the same field are correctly
detected as a duplicate regardless of the order they appear.

This brings the Python implementation into conformance with the proto3
JSON specification which states: "Parsers are required to reject JSON
that contains the same field (either by proto field name or by JSON
name) more than once."

The C++ and Go implementations already handle this correctly.
@loci-dev loci-dev force-pushed the main branch 29 times, most recently from 558f1f4 to 6014f4a Compare April 22, 2026 16:47
@loci-dev loci-dev force-pushed the main branch 22 times, most recently from f292971 to 1fdfb93 Compare April 29, 2026 07:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants