Protobuf: fixed a bug in deserialization of messages with size 0. Corresponding test cross-branch-access.proto added
This commit is contained in:
@@ -34,6 +34,7 @@ generate:
|
|||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/nested-msg.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/nested-msg.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/routeDone.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/routeDone.proto
|
||||||
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/route.proto
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/route.proto
|
||||||
|
./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/protoc-artifacts ./test/cross-branch-access.proto
|
||||||
|
|
||||||
debug:
|
debug:
|
||||||
gdb --args ./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/src ./test/addressbook.proto
|
gdb --args ./protoc --kotlin_out=$$HOME/Downloads/carkot/proto/compiler/src ./test/addressbook.proto
|
||||||
|
|||||||
Binary file not shown.
+13
-7
@@ -328,17 +328,23 @@ void ClassGenerator::generateParseMethods(io::Printer *printer) const {
|
|||||||
printer->Print(vars,
|
printer->Print(vars,
|
||||||
"fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): $builderName$ {\n");
|
"fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): $builderName$ {\n");
|
||||||
printer->Indent();
|
printer->Indent();
|
||||||
printer->Print("while(parseFieldFrom(input)) {\n");
|
|
||||||
|
// read while we won't exceed expected amount of bytes
|
||||||
|
printer->Print("while(getSize() < expectedSize) {\n");
|
||||||
printer->Indent();
|
printer->Indent();
|
||||||
printer->Print("if (getSize() == expectedSize) { break }\n");
|
|
||||||
vars["dollar"] = "$";
|
printer->Print("parseFieldFrom(input)\n");
|
||||||
printer->Print(vars,
|
|
||||||
"if (getSize() > expectedSize) { "
|
|
||||||
"throw InvalidProtocolBufferException(\"Error: expected size of message $dollar$expectedSize, but have read at least $dollar${getSize()}\") "
|
|
||||||
"}\n");
|
|
||||||
printer->Outdent(); // while-loop;
|
printer->Outdent(); // while-loop;
|
||||||
printer->Print("}\n");
|
printer->Print("}\n");
|
||||||
|
|
||||||
|
// check if we read more than expected
|
||||||
|
vars["dollar"] = "$";
|
||||||
|
printer->Print(vars,
|
||||||
|
"if (getSize() > expectedSize) { "
|
||||||
|
"throw InvalidProtocolBufferException(\"Error: expected size of message $dollar$expectedSize, but have read at least $dollar${getSize()}\") "
|
||||||
|
"}\n");
|
||||||
|
|
||||||
printer->Print("return this\n");
|
printer->Print("return this\n");
|
||||||
|
|
||||||
printer->Outdent(); // function body
|
printer->Outdent(); // function body
|
||||||
|
|||||||
+10
-1
@@ -194,8 +194,15 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead
|
|||||||
vars["fieldNumber"] = std::to_string(getFieldNumber());
|
vars["fieldNumber"] = std::to_string(getFieldNumber());
|
||||||
vars["dollar"] = "$";
|
vars["dollar"] = "$";
|
||||||
|
|
||||||
|
// We will create some temporary variables
|
||||||
|
// So we place following code into separate block for the sake of hygiene
|
||||||
|
printer->Print("run {\n");
|
||||||
|
printer->Indent();
|
||||||
|
|
||||||
// read tag
|
// read tag
|
||||||
printer->Print(vars, "input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n");
|
if (!noTag) {
|
||||||
|
printer->Print(vars, "input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n");
|
||||||
|
}
|
||||||
|
|
||||||
// read expected size
|
// read expected size
|
||||||
printer->Print(vars, "val expectedSize = input.readInt32NoTag()\n");
|
printer->Print(vars, "val expectedSize = input.readInt32NoTag()\n");
|
||||||
@@ -209,6 +216,8 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead
|
|||||||
"throw InvalidProtocolBufferException ("
|
"throw InvalidProtocolBufferException ("
|
||||||
"\"Expected size $dollar${expectedSize} got $dollar${$fieldName$.getSize()}"
|
"\"Expected size $dollar${expectedSize} got $dollar${$fieldName$.getSize()}"
|
||||||
"\") }\n");
|
"\") }\n");
|
||||||
|
printer->Outdent();
|
||||||
|
printer->Print("}\n");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
vars["fieldNumber"] = std::to_string(getFieldNumber());
|
vars["fieldNumber"] = std::to_string(getFieldNumber());
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "Direction";
|
||||||
|
|
||||||
|
message DirectionRequest {
|
||||||
|
enum Command {
|
||||||
|
stop = 0;
|
||||||
|
forward = 1;
|
||||||
|
backward = 2;
|
||||||
|
left = 3;
|
||||||
|
right = 4;
|
||||||
|
}
|
||||||
|
Command command = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DirectionResponse {
|
||||||
|
int32 code = 1;
|
||||||
|
string errorMsg = 2;
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "Connect";
|
||||||
|
|
||||||
|
message ConnectionRequest {
|
||||||
|
string ip = 1;
|
||||||
|
int32 port = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ConnectionResponse {
|
||||||
|
int32 uid = 1;
|
||||||
|
int32 code = 2;
|
||||||
|
string errorMsg = 3;
|
||||||
|
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
message Grandfather {
|
||||||
|
message FatherLeft {
|
||||||
|
message SonLeftLeft {
|
||||||
|
FatherLeft father = 1;
|
||||||
|
Grandfather.FatherRight.SonRightLeft brother = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SonLeftRight {
|
||||||
|
string foo = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message FatherRight {
|
||||||
|
message SonRightLeft {
|
||||||
|
string bar = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SonRightRight {
|
||||||
|
Grandfather.FatherLeft.SonLeftRight brother = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "Direction";
|
||||||
|
|
||||||
|
message DirectionRequest {
|
||||||
|
enum Command {
|
||||||
|
stop = 0;
|
||||||
|
forward = 1;
|
||||||
|
backward = 2;
|
||||||
|
left = 3;
|
||||||
|
right = 4;
|
||||||
|
}
|
||||||
|
Command command = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DirectionResponse {
|
||||||
|
int32 code = 1;
|
||||||
|
string errorMsg = 2;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "ErrorP";
|
||||||
|
|
||||||
|
message Error {
|
||||||
|
string errorMessage = 1;
|
||||||
|
int32 errorCode = 2;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "Location";
|
||||||
|
|
||||||
|
message LocationResponse {
|
||||||
|
|
||||||
|
LocationData locationResponseData = 1;
|
||||||
|
int32 code = 2;
|
||||||
|
string errorMsg = 3;
|
||||||
|
|
||||||
|
message LocationData {
|
||||||
|
double x = 1;
|
||||||
|
double y = 2;
|
||||||
|
double angle = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "Route";
|
||||||
|
|
||||||
|
message RouteRequest {
|
||||||
|
repeated WayPoint way_points = 1;
|
||||||
|
|
||||||
|
message WayPoint {
|
||||||
|
double distance = 2;
|
||||||
|
double angle_delta = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message RouteResponse {
|
||||||
|
int32 code = 1;
|
||||||
|
string errorMsg = 2;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "RouteDone";
|
||||||
|
|
||||||
|
message RouteDoneResponse {
|
||||||
|
int32 code = 1;
|
||||||
|
string errorMsg = 2;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package carkot;
|
||||||
|
|
||||||
|
option java_package = "proto.car";
|
||||||
|
option java_outer_classname = "RouteDone";
|
||||||
|
|
||||||
|
message RouteDoneResponse {
|
||||||
|
int32 code = 1;
|
||||||
|
string errorMsg = 2;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user