1818
1919package org .bson ;
2020
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+
2145import static org .bson .BSON .ARRAY ;
2246import static org .bson .BSON .BINARY ;
2347import static org .bson .BSON .BOOLEAN ;
4367import static org .bson .BSON .UNDEFINED ;
4468import static org .bson .BSON .regexFlags ;
4569
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-
7170/**
7271 * this is meant to be pooled or cached
7372 * there is some per instance memory for string conversion, etc...
@@ -433,8 +432,8 @@ protected void putObjectId( String name , ObjectId oid ){
433432
434433 private void putPattern ( String name , Pattern p ) {
435434 _put ( REGEX , name );
436- _put ( p .pattern () );
437- _put ( regexFlags ( p .flags () ) );
435+ _put ( p .pattern (), true );
436+ _put ( regexFlags ( p .flags () ), true );
438437 }
439438
440439 private void putMinKey ( String name ) {
@@ -454,13 +453,13 @@ private void putMaxKey( String name ) {
454453 */
455454 protected void _put ( byte type , String name ){
456455 _buf .write ( type );
457- _put ( name );
456+ _put ( name , true );
458457 }
459458
460459 protected void _putValueString ( String s ){
461460 int lenPos = _buf .getPosition ();
462461 _buf .writeInt ( 0 ); // making space for size
463- int strLen = _put ( s );
462+ int strLen = _put ( s , false );
464463 _buf .writeInt ( lenPos , strLen );
465464 }
466465
@@ -473,14 +472,21 @@ void _reset( Buffer b ){
473472 * puts as utf-8 string
474473 */
475474 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 ) {
476482
477483 final int len = str .length ();
478484 int total = 0 ;
479485
480486 for ( int i =0 ; i <len ; ){
481487 int c = Character .codePointAt ( str , i );
482488
483- if (c == 0x0 ) {
489+ if (checkForNullCharacters && c == 0x0 ) {
484490 throw new BSONException (
485491 String .format ("BSON cstring '%s' is not valid because it contains a null character at index %d" , str , i ));
486492 }
@@ -525,7 +531,7 @@ public void writeLong( long x ){
525531 }
526532
527533 public void writeCString ( String s ){
528- _put ( s );
534+ _put (s , true );
529535 }
530536
531537 protected OutputBuffer _buf ;
0 commit comments