Skip to content

Commit 945925c

Browse files
committed
JAVA-1040: Added illegal key checks for insert, update, and replace
1 parent efdb9dd commit 945925c

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

src/main/com/mongodb/DBCollectionImpl.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import static java.util.Arrays.asList;
4545
import static org.bson.util.Assertions.isTrue;
4646

47+
@SuppressWarnings("deprecation")
4748
class DBCollectionImpl extends DBCollection {
4849
private final DBApiLayer db;
4950
private final String namespace;
@@ -166,7 +167,6 @@ protected WriteResult insert(List<DBObject> list, boolean shouldApply , WriteCon
166167
if (encoder == null)
167168
encoder = DefaultDBEncoder.FACTORY.create();
168169

169-
170170
if ( willTrace() ) {
171171
for (DBObject o : list) {
172172
trace("save: " + namespace + " " + JSON.serialize(o));
@@ -377,6 +377,10 @@ public void createIndex(final DBObject keys, final DBObject options, DBEncoder e
377377
private BulkWriteResult insertWithCommandProtocol(final List<DBObject> list, final WriteConcern writeConcern,
378378
final DBEncoder encoder,
379379
final DBPort port) {
380+
for (DBObject o : list) {
381+
_checkObject(o, false, false);
382+
}
383+
380384
BaseWriteCommandMessage message = new InsertCommandMessage(getNamespace(), writeConcern, list,
381385
DefaultDBEncoder.FACTORY.create(), encoder,
382386
getMessageSettings(port.getAddress()));
@@ -483,6 +487,10 @@ public CommandResult execute() throws IOException {
483487

484488
private WriteResult insertWithWriteProtocol(final List<DBObject> list, final WriteConcern concern, final DBEncoder encoder,
485489
final DBPort port) {
490+
for (DBObject o : list) {
491+
_checkObject(o, false, false);
492+
}
493+
486494
WriteResult last = null;
487495

488496
int cur = 0;
@@ -534,15 +542,13 @@ private Logger getLogger() {
534542

535543
private class OrderedRunGenerator implements Iterable<Run> {
536544
private final List<WriteRequest> writeRequests;
537-
private final DBPort port;
538545
private final WriteConcern writeConcern;
539546
private final DBEncoder encoder;
540547
private final int maxBatchWriteSize;
541548

542549
public OrderedRunGenerator(final List<WriteRequest> writeRequests, final WriteConcern writeConcern, final DBEncoder encoder,
543550
final DBPort port) {
544551
this.writeRequests = writeRequests;
545-
this.port = port;
546552
this.writeConcern = writeConcern.continueOnError(false);
547553
this.encoder = encoder;
548554
this.maxBatchWriteSize = db.getConnector().getServerDescription(port.getAddress()).getMaxWriteBatchSize();
@@ -590,15 +596,13 @@ public void remove() {
590596

591597
private class UnorderedRunGenerator implements Iterable<Run> {
592598
private final List<WriteRequest> writeRequests;
593-
private final DBPort port;
594599
private final WriteConcern writeConcern;
595600
private final DBEncoder encoder;
596601
private final int maxBatchWriteSize;
597602

598603
public UnorderedRunGenerator(final List<WriteRequest> writeRequests, final WriteConcern writeConcern,
599604
final DBEncoder encoder, final DBPort port) {
600605
this.writeRequests = writeRequests;
601-
this.port = port;
602606
this.writeConcern = writeConcern.continueOnError(true);
603607
this.encoder = encoder;
604608
this.maxBatchWriteSize = db.getConnector().getServerDescription(port.getAddress()).getMaxWriteBatchSize();
@@ -707,6 +711,14 @@ private List<ModifyRequest> getWriteRequestsAsModifyRequests() {
707711
}
708712

709713
BulkWriteResult executeUpdates(final List<ModifyRequest> updateRequests, final DBPort port) {
714+
for (ModifyRequest request : updateRequests) {
715+
for (String key : request.getUpdateDocument().keySet()) {
716+
if (!key.startsWith("$")) {
717+
throw new IllegalArgumentException("Update document keys must start with $: " + key);
718+
}
719+
}
720+
}
721+
710722
return new RunExecutor(port) {
711723
@Override
712724
BulkWriteResult executeWriteCommandProtocol() {
@@ -728,6 +740,10 @@ WriteRequest.Type getType() {
728740
}
729741

730742
BulkWriteResult executeReplaces(final List<ModifyRequest> replaceRequests, final DBPort port) {
743+
for (ModifyRequest request : replaceRequests) {
744+
_checkObject(request.getUpdateDocument(), false, false);
745+
}
746+
731747
return new RunExecutor(port) {
732748
@Override
733749
BulkWriteResult executeWriteCommandProtocol() {

0 commit comments

Comments
 (0)