18
18
19
19
package org .bson ;
20
20
21
+ import com .mongodb .DBRefBase ;
22
+ import org .bson .io .BasicOutputBuffer ;
23
+ import org .bson .io .OutputBuffer ;
24
+ import org .bson .types .BSONTimestamp ;
25
+ import org .bson .types .Binary ;
26
+ import org .bson .types .Code ;
27
+ import org .bson .types .CodeWScope ;
28
+ import org .bson .types .MaxKey ;
29
+ import org .bson .types .MinKey ;
30
+ import org .bson .types .ObjectId ;
31
+ import org .bson .types .Symbol ;
32
+
33
+ import java .lang .reflect .Array ;
34
+ import java .nio .Buffer ;
35
+ import java .util .Date ;
36
+ import java .util .List ;
37
+ import java .util .Map ;
38
+ import java .util .Map .Entry ;
39
+ import java .util .Set ;
40
+ import java .util .UUID ;
41
+ import java .util .concurrent .atomic .AtomicInteger ;
42
+ import java .util .concurrent .atomic .AtomicLong ;
43
+ import java .util .regex .Pattern ;
44
+
21
45
import static org .bson .BSON .ARRAY ;
22
46
import static org .bson .BSON .BINARY ;
23
47
import static org .bson .BSON .BOOLEAN ;
43
67
import static org .bson .BSON .UNDEFINED ;
44
68
import static org .bson .BSON .regexFlags ;
45
69
46
- import java .lang .reflect .Array ;
47
- import java .nio .Buffer ;
48
- import java .util .Date ;
49
- import java .util .List ;
50
- import java .util .Map ;
51
- import java .util .Map .Entry ;
52
- import java .util .Set ;
53
- import java .util .UUID ;
54
- import java .util .concurrent .atomic .AtomicInteger ;
55
- import java .util .concurrent .atomic .AtomicLong ;
56
- import java .util .regex .Pattern ;
57
-
58
- import org .bson .io .BasicOutputBuffer ;
59
- import org .bson .io .OutputBuffer ;
60
- import org .bson .types .BSONTimestamp ;
61
- import org .bson .types .Binary ;
62
- import org .bson .types .Code ;
63
- import org .bson .types .CodeWScope ;
64
- import org .bson .types .MaxKey ;
65
- import org .bson .types .MinKey ;
66
- import org .bson .types .ObjectId ;
67
- import org .bson .types .Symbol ;
68
-
69
- import com .mongodb .DBRefBase ;
70
-
71
70
/**
72
71
* this is meant to be pooled or cached
73
72
* there is some per instance memory for string conversion, etc...
@@ -433,8 +432,8 @@ protected void putObjectId( String name , ObjectId oid ){
433
432
434
433
private void putPattern ( String name , Pattern p ) {
435
434
_put ( REGEX , name );
436
- _put ( p .pattern () );
437
- _put ( regexFlags ( p .flags () ) );
435
+ _put ( p .pattern (), true );
436
+ _put ( regexFlags ( p .flags () ), true );
438
437
}
439
438
440
439
private void putMinKey ( String name ) {
@@ -454,13 +453,13 @@ private void putMaxKey( String name ) {
454
453
*/
455
454
protected void _put ( byte type , String name ){
456
455
_buf .write ( type );
457
- _put ( name );
456
+ _put ( name , true );
458
457
}
459
458
460
459
protected void _putValueString ( String s ){
461
460
int lenPos = _buf .getPosition ();
462
461
_buf .writeInt ( 0 ); // making space for size
463
- int strLen = _put ( s );
462
+ int strLen = _put ( s , false );
464
463
_buf .writeInt ( lenPos , strLen );
465
464
}
466
465
@@ -473,14 +472,21 @@ void _reset( Buffer b ){
473
472
* puts as utf-8 string
474
473
*/
475
474
protected int _put ( String str ){
475
+ return _put (str , false );
476
+ }
477
+
478
+ /**
479
+ * puts as utf-8 string
480
+ */
481
+ private int _put (String str , boolean checkForNullCharacters ) {
476
482
477
483
final int len = str .length ();
478
484
int total = 0 ;
479
485
480
486
for ( int i =0 ; i <len ; ){
481
487
int c = Character .codePointAt ( str , i );
482
488
483
- if (c == 0x0 ) {
489
+ if (checkForNullCharacters && c == 0x0 ) {
484
490
throw new BSONException (
485
491
String .format ("BSON cstring '%s' is not valid because it contains a null character at index %d" , str , i ));
486
492
}
@@ -525,7 +531,7 @@ public void writeLong( long x ){
525
531
}
526
532
527
533
public void writeCString ( String s ){
528
- _put ( s );
534
+ _put (s , true );
529
535
}
530
536
531
537
protected OutputBuffer _buf ;
0 commit comments