使用 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 生存得很好,堆栈跟踪并没有让我变得更聪明。
我写了一篇短文 blog post在这个问题上,并提交了JIRA ticket在 mongodb.org,但我的好奇心要了我的命。谁能弄清楚是什么让 \u0000Žö
如此特别?
编辑澄清:\u0000
和\u0000Ž
没问题,\u0000Žsomerandomtext
也是如此
最佳答案
它不能正常工作的原因是 unicode 文字语句被破坏的方式。可能有这样的可能性,java 驱动程序没有正确检查可能性,unicode 文字语句中可能有 unicode ;)
在 mongo shell 上使用这样的键创建对象(复制到基于 UTF8 的终端)会抛出错误:BSONElement: bad type -59
关于java - 用一个错误命名的字段使 MongoDB 崩溃,它有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13422736/