Java 用一个名称不正确的字段使MongoDB崩溃,什么';有什么特别的吗?

Java 用一个名称不正确的字段使MongoDB崩溃,什么';有什么特别的吗?,java,mongodb,Java,Mongodb,使用Java驱动程序,我们今天发现有可能通过分段错误使MongoDB实例停止运行 new Mongo().getDB("test").getCollection("test"). insert(new BasicDBObject("\u0000Žö", "")); 这将在mongod死机之前从它产生以下输出: Fri Nov 16 18:53:18 Invalid access at address: 0xbac3c5fe from thread: conn5 Fri Nov 16

使用Java驱动程序,我们今天发现有可能通过分段错误使MongoDB实例停止运行

new Mongo().getDB("test").getCollection("test").
    insert(new BasicDBObject("\u0000Žö", ""));
这将在mongod死机之前从它产生以下输出:

Fri Nov 16 18:53:18 Invalid access at address: 0xbac3c5fe from thread: conn5

Fri Nov 16 18:53:18 Got signal: 11 (Segmentation fault: 11).

Fri Nov 16 18:53:18 Backtrace:
0x10004241b 0x10005628b 0x100056941 0x7fff828afcfa 0x1 0x100281611 0x100288c91 0x10006c501 0x10058e50c 0x1005e31d3 0x7fff8285b8bf 0x7fff8285eb75 
 0   mongod                              0x000000010004241b _ZN5mongo15printStackTraceERSo + 43
 1   mongod                              0x000000010005628b _ZN5mongo10abruptQuitEi + 987
 2   mongod                              0x0000000100056941 _ZN5mongo24abruptQuitWithAddrSignalEiP9__siginfoPv + 673
 3   libsystem_c.dylib                   0x00007fff828afcfa _sigtramp + 26
 4   ???                                 0x0000000000000001 0x0 + 1
 5   mongod                              0x0000000100281611 _ZN5mongo14receivedInsertERNS_7MessageERNS_5CurOpE + 1841
 6   mongod                              0x0000000100288c91 _ZN5mongo16assembleResponseERNS_7MessageERNS_10DbResponseERKNS_11HostAndPortE + 4705
 7   mongod                              0x000000010006c501 _ZN5mongo16MyMessageHandler7processERNS_7MessageEPNS_21AbstractMessagingPortEPNS_9LastErrorE + 257
 8   mongod                              0x000000010058e50c _ZN5mongo3pms9threadRunEPNS_13MessagingPortE + 1084
 9   mongod                              0x00000001005e31d3 thread_proxy + 163
 10  libsystem_c.dylib                   0x00007fff8285b8bf _pthread_start + 335
 11  libsystem_c.dylib                   0x00007fff8285eb75 thread_start + 13
我一直在试图理解到底是什么让这个神奇的域名变得特别。删除任何相关的字符都可以让mongodb生存得很好,而堆栈跟踪并没有让我变得更聪明

我已经写了一篇关于这个问题的短文,并在mongodb.org上提交了一份报告,但是我的好奇心让我很难受。有人能找出是什么使
\u0000Žö
特别吗


编辑以澄清
\u0000
\u0000Ž
是可以的,
\u0000Žsomerandomtext

它工作不好的原因是unicode文本语句的损坏方式。可能存在这样的可能性,java驱动程序没有正确检查这种可能性,unicode文本语句中可能存在unicode;)
在mongo shell上,使用这样的键创建对象(复制到基于UTF8的终端)会抛出错误:
bsonement:bad type-59
Java
String
s只能用ASCII编码表示,要获得unicode文本,必须获得每个unicode代码并生成字符串:

String unicode = "\u1123\u5678hello";
将导致:

ᄣ噸hello

将unicode字段添加为子文档的一部分可以通过
db.test.save({“x”:{“\u0000ö”:“}}})
工作,并在尝试通过
db.test.find()查看文档时导致断言错误。
。。。还有,你说的“unicode中的unicode文字语句”是什么意思?好吧,我可能是瞎了-我以为你漏掉了一个零,那将是\u000'UNICODECHAR'。下一个可能的解释是:BSON中的字符串是以null结尾的字符串,java()可能在一些库中遇到了一些问题。如果它真的在开始时向服务器发送空字符串,我们就到家了。看起来确实是BSON格式的NUL终止才是问题所在。崩溃发生的原因是,一旦达到空值,它就试图将接下来出现的内容作为某种控制字符串进行解析。如果NUL后面的两个字符都是多字节UTF-8字符串,它将在解析时崩溃。这个错误是否由最新的mongo java驱动程序2.10.1解决?我测试并发现,如果没有启用--objcheck,db服务器仍然会崩溃。