Skip to content

Commit dca26ba

Browse files
committed
Breaking: fromObject now throws for entirely bogus values (repeated, map and inner message fields), fixes #601
1 parent b4f4f48 commit dca26ba

18 files changed

+429
-82
lines changed

dist/light/protobuf.js

+8-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/light/protobuf.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/light/protobuf.min.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/light/protobuf.min.js.gz

67 Bytes
Binary file not shown.

dist/light/protobuf.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/minimal/protobuf.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/minimal/protobuf.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/minimal/protobuf.min.js.gz

-1 Bytes
Binary file not shown.

dist/protobuf.js

+8-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/protobuf.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/protobuf.min.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/protobuf.min.js.gz

51 Bytes
Binary file not shown.

dist/protobuf.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/converter.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
3434
}); gen
3535
("}");
3636
} else gen
37+
("if(typeof d%s!==\"object\")", prop)
38+
("throw TypeError(%j)", field.fullName + ": object expected")
3739
("m%s=types[%d].fromObject(d%s)", prop, fieldIndex, prop);
3840
} else {
3941
var isUnsigned = false;
@@ -70,7 +72,7 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
7072
case "bytes": gen
7173
("if(typeof d%s===\"string\")", prop)
7274
("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", prop, prop, prop)
73-
("else if(d%s&&d%s.length)", prop, prop)
75+
("else if(d%s.length)", prop)
7476
("m%s=d%s", prop, prop);
7577
break;
7678
case "string": gen
@@ -110,6 +112,8 @@ converter.fromObject = function fromObject(mtype) {
110112
// Map fields
111113
if (field.map) { gen
112114
("if(d%s){", prop)
115+
("if(typeof d%s!==\"object\")", prop)
116+
("throw TypeError(%j)", field.fullName + ": object expected")
113117
("m%s={}", prop)
114118
("for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){", prop);
115119
genValuePartial_fromObject(gen, field, i, prop + "[ks[i]]")
@@ -119,6 +123,8 @@ converter.fromObject = function fromObject(mtype) {
119123
// Repeated fields
120124
} else if (field.repeated) { gen
121125
("if(d%s){", prop)
126+
("if(!Array.isArray(d%s))", prop)
127+
("throw TypeError(%j)", field.fullName + ": array expected")
122128
("m%s=[]", prop)
123129
("for(var i=0;i<d%s.length;++i){", prop);
124130
genValuePartial_fromObject(gen, field, i, prop + "[i]")

tests/data/convert.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,8 @@ $root.Message = (function() {
311311
if (object.stringVal !== undefined && object.stringVal !== null)
312312
message.stringVal = String(object.stringVal);
313313
if (object.stringRepeated) {
314+
if (!Array.isArray(object.stringRepeated))
315+
throw TypeError(".Message.stringRepeated: array expected");
314316
message.stringRepeated = [];
315317
for (var i = 0; i < object.stringRepeated.length; ++i)
316318
message.stringRepeated[i] = String(object.stringRepeated[i]);
@@ -325,6 +327,8 @@ $root.Message = (function() {
325327
else if (typeof object.uint64Val === "object")
326328
message.uint64Val = new $util.LongBits(object.uint64Val.low, object.uint64Val.high).toNumber(true);
327329
if (object.uint64Repeated) {
330+
if (!Array.isArray(object.uint64Repeated))
331+
throw TypeError(".Message.uint64Repeated: array expected");
328332
message.uint64Repeated = [];
329333
for (var i = 0; i < object.uint64Repeated.length; ++i)
330334
if ($util.Long)
@@ -339,14 +343,16 @@ $root.Message = (function() {
339343
if (object.bytesVal !== undefined && object.bytesVal !== null)
340344
if (typeof object.bytesVal === "string")
341345
$util.base64.decode(object.bytesVal, message.bytesVal = $util.newBuffer($util.base64.length(object.bytesVal)), 0);
342-
else if (object.bytesVal && object.bytesVal.length)
346+
else if (object.bytesVal.length)
343347
message.bytesVal = object.bytesVal;
344348
if (object.bytesRepeated) {
349+
if (!Array.isArray(object.bytesRepeated))
350+
throw TypeError(".Message.bytesRepeated: array expected");
345351
message.bytesRepeated = [];
346352
for (var i = 0; i < object.bytesRepeated.length; ++i)
347353
if (typeof object.bytesRepeated[i] === "string")
348354
$util.base64.decode(object.bytesRepeated[i], message.bytesRepeated[i] = $util.newBuffer($util.base64.length(object.bytesRepeated[i])), 0);
349-
else if (object.bytesRepeated[i] && object.bytesRepeated[i].length)
355+
else if (object.bytesRepeated[i].length)
350356
message.bytesRepeated[i] = object.bytesRepeated[i];
351357
}
352358
switch (object.enumVal) {
@@ -360,6 +366,8 @@ $root.Message = (function() {
360366
break;
361367
}
362368
if (object.enumRepeated) {
369+
if (!Array.isArray(object.enumRepeated))
370+
throw TypeError(".Message.enumRepeated: array expected");
363371
message.enumRepeated = [];
364372
for (var i = 0; i < object.enumRepeated.length; ++i)
365373
switch (object.enumRepeated[i]) {
@@ -375,6 +383,8 @@ $root.Message = (function() {
375383
}
376384
}
377385
if (object.int64Map) {
386+
if (typeof object.int64Map !== "object")
387+
throw TypeError(".Message.int64Map: object expected");
378388
message.int64Map = {};
379389
for (var keys = Object.keys(object.int64Map), i = 0; i < keys.length; ++i)
380390
if ($util.Long)

tests/data/mapbox/vector_tile.js

+24-3
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,14 @@ $root.vector_tile = (function() {
149149
return object;
150150
var message = new $root.vector_tile.Tile();
151151
if (object.layers) {
152+
if (!Array.isArray(object.layers))
153+
throw TypeError(".vector_tile.Tile.layers: array expected");
152154
message.layers = [];
153-
for (var i = 0; i < object.layers.length; ++i)
155+
for (var i = 0; i < object.layers.length; ++i) {
156+
if (typeof object.layers[i] !== "object")
157+
throw TypeError(".vector_tile.Tile.layers: object expected");
154158
message.layers[i] = $types[0].fromObject(object.layers[i]);
159+
}
155160
}
156161
return message;
157162
};
@@ -744,6 +749,8 @@ $root.vector_tile = (function() {
744749
else if (typeof object.id === "object")
745750
message.id = new $util.LongBits(object.id.low, object.id.high).toNumber(true);
746751
if (object.tags) {
752+
if (!Array.isArray(object.tags))
753+
throw TypeError(".vector_tile.Tile.Feature.tags: array expected");
747754
message.tags = [];
748755
for (var i = 0; i < object.tags.length; ++i)
749756
message.tags[i] = object.tags[i] >>> 0;
@@ -767,6 +774,8 @@ $root.vector_tile = (function() {
767774
break;
768775
}
769776
if (object.geometry) {
777+
if (!Array.isArray(object.geometry))
778+
throw TypeError(".vector_tile.Tile.Feature.geometry: array expected");
770779
message.geometry = [];
771780
for (var i = 0; i < object.geometry.length; ++i)
772781
message.geometry[i] = object.geometry[i] >>> 0;
@@ -1057,19 +1066,31 @@ $root.vector_tile = (function() {
10571066
if (object.name !== undefined && object.name !== null)
10581067
message.name = String(object.name);
10591068
if (object.features) {
1069+
if (!Array.isArray(object.features))
1070+
throw TypeError(".vector_tile.Tile.Layer.features: array expected");
10601071
message.features = [];
1061-
for (var i = 0; i < object.features.length; ++i)
1072+
for (var i = 0; i < object.features.length; ++i) {
1073+
if (typeof object.features[i] !== "object")
1074+
throw TypeError(".vector_tile.Tile.Layer.features: object expected");
10621075
message.features[i] = $types[2].fromObject(object.features[i]);
1076+
}
10631077
}
10641078
if (object.keys) {
1079+
if (!Array.isArray(object.keys))
1080+
throw TypeError(".vector_tile.Tile.Layer.keys: array expected");
10651081
message.keys = [];
10661082
for (var i = 0; i < object.keys.length; ++i)
10671083
message.keys[i] = String(object.keys[i]);
10681084
}
10691085
if (object.values) {
1086+
if (!Array.isArray(object.values))
1087+
throw TypeError(".vector_tile.Tile.Layer.values: array expected");
10701088
message.values = [];
1071-
for (var i = 0; i < object.values.length; ++i)
1089+
for (var i = 0; i < object.values.length; ++i) {
1090+
if (typeof object.values[i] !== "object")
1091+
throw TypeError(".vector_tile.Tile.Layer.values: object expected");
10721092
message.values[i] = $types[4].fromObject(object.values[i]);
1093+
}
10731094
}
10741095
if (object.extent !== undefined && object.extent !== null)
10751096
message.extent = object.extent >>> 0;

tests/data/package.js

+18-1
Original file line numberDiff line numberDiff line change
@@ -451,47 +451,64 @@ $root.Package = (function() {
451451
message.author = String(object.author);
452452
if (object.license !== undefined && object.license !== null)
453453
message.license = String(object.license);
454-
if (object.repository !== undefined && object.repository !== null)
454+
if (object.repository !== undefined && object.repository !== null) {
455+
if (typeof object.repository !== "object")
456+
throw TypeError(".Package.repository: object expected");
455457
message.repository = $types[6].fromObject(object.repository);
458+
}
456459
if (object.bugs !== undefined && object.bugs !== null)
457460
message.bugs = String(object.bugs);
458461
if (object.homepage !== undefined && object.homepage !== null)
459462
message.homepage = String(object.homepage);
460463
if (object.keywords) {
464+
if (!Array.isArray(object.keywords))
465+
throw TypeError(".Package.keywords: array expected");
461466
message.keywords = [];
462467
for (var i = 0; i < object.keywords.length; ++i)
463468
message.keywords[i] = String(object.keywords[i]);
464469
}
465470
if (object.main !== undefined && object.main !== null)
466471
message.main = String(object.main);
467472
if (object.bin) {
473+
if (typeof object.bin !== "object")
474+
throw TypeError(".Package.bin: object expected");
468475
message.bin = {};
469476
for (var keys = Object.keys(object.bin), i = 0; i < keys.length; ++i)
470477
message.bin[keys[i]] = String(object.bin[keys[i]]);
471478
}
472479
if (object.scripts) {
480+
if (typeof object.scripts !== "object")
481+
throw TypeError(".Package.scripts: object expected");
473482
message.scripts = {};
474483
for (var keys = Object.keys(object.scripts), i = 0; i < keys.length; ++i)
475484
message.scripts[keys[i]] = String(object.scripts[keys[i]]);
476485
}
477486
if (object.dependencies) {
487+
if (typeof object.dependencies !== "object")
488+
throw TypeError(".Package.dependencies: object expected");
478489
message.dependencies = {};
479490
for (var keys = Object.keys(object.dependencies), i = 0; i < keys.length; ++i)
480491
message.dependencies[keys[i]] = String(object.dependencies[keys[i]]);
481492
}
482493
if (object.optionalDependencies) {
494+
if (typeof object.optionalDependencies !== "object")
495+
throw TypeError(".Package.optionalDependencies: object expected");
483496
message.optionalDependencies = {};
484497
for (var keys = Object.keys(object.optionalDependencies), i = 0; i < keys.length; ++i)
485498
message.optionalDependencies[keys[i]] = String(object.optionalDependencies[keys[i]]);
486499
}
487500
if (object.devDependencies) {
501+
if (typeof object.devDependencies !== "object")
502+
throw TypeError(".Package.devDependencies: object expected");
488503
message.devDependencies = {};
489504
for (var keys = Object.keys(object.devDependencies), i = 0; i < keys.length; ++i)
490505
message.devDependencies[keys[i]] = String(object.devDependencies[keys[i]]);
491506
}
492507
if (object.types !== undefined && object.types !== null)
493508
message.types = String(object.types);
494509
if (object.cliDependencies) {
510+
if (!Array.isArray(object.cliDependencies))
511+
throw TypeError(".Package.cliDependencies: array expected");
495512
message.cliDependencies = [];
496513
for (var i = 0; i < object.cliDependencies.length; ++i)
497514
message.cliDependencies[i] = String(object.cliDependencies[i]);

0 commit comments

Comments
 (0)