summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDwight <dmerriman@gmail.com>2008-06-12 11:56:40 -0400
committerDwight <dmerriman@gmail.com>2008-06-12 11:56:40 -0400
commitc79a5e1753d25f261a059b33a172ea3534fd67f3 (patch)
tree698e457d475049866f07ad68231084705ffed9c7
parent1d8c3e37b32a11d2e2b64fee019782f5efdd19c6 (diff)
downloadmongo-c79a5e1753d25f261a059b33a172ea3534fd67f3.tar.gz
fix a jni issue with the last bug fix.
-rw-r--r--db/db.cpp8
-rw-r--r--grid/message.h5
2 files changed, 9 insertions, 4 deletions
diff --git a/db/db.cpp b/db/db.cpp
index 67cf5d15dd6..aed40b39fd3 100644
--- a/db/db.cpp
+++ b/db/db.cpp
@@ -336,7 +336,13 @@ void jniCallback(Message& m, Message& out)
bool log = false;
curOp = m.data->operation;
if( m.data->operation == dbQuery ) {
- receivedQuery(jmp, m, ss);
+ // on a query, the Message must have m.freeIt true so that the buffer data can be
+ // retained by cursors. As freeIt is false, we make a copy here.
+ assert( m.data->len > 0 && m.data->len < 32000000 );
+ Message copy(malloc(m.data->len), true);
+ memcpy(copy.data, m.data, m.data->len);
+
+ receivedQuery(jmp, copy, ss);
}
else if( m.data->operation == dbInsert ) {
ss << "insert ";
diff --git a/grid/message.h b/grid/message.h
index 3a26909dec9..1f4df0d83bd 100644
--- a/grid/message.h
+++ b/grid/message.h
@@ -75,7 +75,7 @@ struct MsgData {
int operation;
char _data[4];
- int dataLen();
+ int dataLen(); // len without header
};
const int MsgDataHeaderSize = sizeof(MsgData) - 4;
inline int MsgData::dataLen() { return len - MsgDataHeaderSize; }
@@ -85,7 +85,7 @@ inline int MsgData::dataLen() { return len - MsgDataHeaderSize; }
class Message {
public:
Message() { data = 0; freeIt = false; }
- Message( void * _data , bool _freeIt ){ data = (MsgData*)_data; freeIt = _freeIt; };
+ Message( void * _data , bool _freeIt ){ data = (MsgData*)_data; freeIt = _freeIt; };
~Message() { reset(); }
SockAddr from;
@@ -129,4 +129,3 @@ public:
private:
bool freeIt;
};
-