4

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 でJIRA チケットを提出しましたが、好奇心に負けてしまいました。\u0000Žö何が特別なのか誰にもわかりませんか?

明確にするために編集\u0000そして\u0000Ž大丈夫です、そしてそうです\u0000Žsomerandomtext

4

2 に答える 2

1

うまくいかない理由は、Unicodeリテラルステートメントが壊れている方法です。UnicodeリテラルステートメントにUnicodeが存在する可能性があるため、Javaドライバーが可能性を適切にチェックしていない可能性があります;) mongoシェルで、そのようなキー(UTF8ベースの端末にコピーされた)でオブジェクトを作成すると、エラーがスローされます:BSONElement: bad type -59

于 2012-11-16T19:07:54.500 に答える
0

JavaStringは ASCII エンコーディングでのみ表現できます。Unicode リテラルを取得するには、各 Unicode コードを取得して文字列を作成する必要があります。

String unicode = "\u1123\u5678hello";

結果は次のとおりです。

ᄣ噸hello
于 2012-11-16T19:32:49.067 に答える