protobuf-javascript icon indicating copy to clipboard operation
protobuf-javascript copied to clipboard

AssertionError: Assertion failed when deserializing message from python in js

Open bhainesva opened this issue 6 years ago • 2 comments

What version of protobuf and what language are you using? Version: v.3.11.2 Language: Python, Javascript

What operating system (Linux, Windows, ...) and version? MacOS High Sierra Version 10.13.6

What runtime / compiler are you using (e.g., python version or gcc version) Python 3.7.3, NodeJS v13.3.0

What did you do? Steps to reproduce the behavior:

  1. Defined these protos:
syntax = "proto2";

message B {
  optional string b2 = 2;
}

message A {
  optional B b = 1;
  optional string id = 2;
}
  1. Attempted to deserialize this message in both js and python: 0a060a0131120131181e10a3c6ad8dcdeed0a274

Here's a sample repo to reproduce: https://github.com/bhainesva/protobuf-py-vs-js-demo (run node test.js / python3 test.py after installing requirements).

What did you expect to see I expected the deserialization to succeed in both python and js.

What did you see instead? Python deserialization succeeds but js deserialization produces this error:

/Users/bhaines/repo/proto-demo/node_modules/google-protobuf/google-protobuf.js:81
jspb.BinaryConstants.TWO_TO_32=4294967296;jspb.BinaryConstants.TWO_TO_52=4503599627370496;jspb.BinaryConstants.TWO_TO_63=0x7fffffffffffffff;jspb.BinaryConstants.TWO_TO_64=1.8446744073709552E19;jspb.BinaryConstants.ZERO_HASH="\x00\x00\x00\x00\x00\x00\x00\x00";goog.dom={};goog.dom.NodeType={ELEMENT:1,ATTRIBUTE:2,TEXT:3,CDATA_SECTION:4,ENTITY_REFERENCE:5,ENTITY:6,PROCESSING_INSTRUCTION:7,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,NOTATION:12};goog.debug={};goog.debug.Error=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,goog.debug.Error);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a));this.reportErrorToServer=!0};goog.inherits(goog.debug.Error,Error);goog.debug.Error.prototype.name="CustomError";goog.asserts={};goog.asserts.ENABLE_ASSERTS=goog.DEBUG;goog.asserts.AssertionError=function(a,b){goog.debug.Error.call(this,goog.asserts.subs_(a,b));this.messagePattern=a};goog.in
Error [AssertionError]: Assertion failed
    at new goog.asserts.AssertionError (/Users/bhaines/repo/proto-demo/node_modules/google-protobuf/google-protobuf.js:81:876)
    at Object.goog.asserts.doAssertFailure_ (/Users/bhaines/repo/proto-demo/node_modules/google-protobuf/google-protobuf.js:82:257)
    at Object.goog.asserts.assert (/Users/bhaines/repo/proto-demo/node_modules/google-protobuf/google-protobuf.js:83:83)
    at jspb.BinaryReader.readString (/Users/bhaines/repo/proto-demo/node_modules/google-protobuf/google-protobuf.js:394:64)
    at Function.proto.A.deserializeBinaryFromReader (/Users/bhaines/repo/proto-demo/demo_pb.js:263:49)
    at Function.proto.A.deserializeBinary (/Users/bhaines/repo/proto-demo/demo_pb.js:239:18)
    at Object.<anonymous> (/Users/bhaines/repo/proto-demo/test.js:13:20)
    at Module._compile (internal/modules/cjs/loader.js:1128:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
    at Module.load (internal/modules/cjs/loader.js:983:32) {
  message: 'Assertion failed',
  reportErrorToServer: true,
  messagePattern: 'Assertion failed'
}

Seems related to including unknown fields in messages but I'm not very familiar with protobuf, my understanding is that that's supported.

Potentially related to this issue? protocolbuffers/protobuf#4688.

bhainesva avatar Jan 13 '20 05:01 bhainesva

@bhainesva Did you ever resolve this? I have a very similar issue happening, but from C# -> JS.

Edit: I figured this out on my end. The following issue led me to the solution: protocolbuffers/protobuf-javascript#57

The previous dev was not encoding data in base64, and that was causing deserialize issues in JavaScript. Hopefully your issue is similar.

BBoldenow avatar Feb 04 '22 17:02 BBoldenow

The current binary parsing code doesn't correctly handle fields with the wrong wire type. It results in a runtime error instead of treating it as an unknown field.

However, we only support parsing base64, so if the input is hex encoded then you'll run into problems.

dibenede avatar Sep 09 '22 22:09 dibenede