Pass in a buffer to olm_session_describe

instead of having a static one, as that could end up taking up a
lot of memory if your app keeps olm sessions hanging about.
This commit is contained in:
David Baker 2019-10-04 11:43:40 +01:00
parent e73a208fb2
commit b482321213
5 changed files with 29 additions and 29 deletions

View file

@ -319,12 +319,10 @@ int olm_session_has_received_message(
); );
/** /**
* Return a string describing the internal state of an olm session, * Write a string describing the internal state of an olm session
* for debugging and logging purposes. The pointer returned points * to the buffer provided for debugging and logging purposes.
* to an internal buffer and is valid until the next call to
* olm_session_describe on the same olm session object.
*/ */
const char * olm_session_describe(OlmSession * session); void olm_session_describe(OlmSession * session, char *buf, size_t buflen);
/** Checks if the PRE_KEY message is for this in-bound session. This can happen /** Checks if the PRE_KEY message is for this in-bound session. This can happen
* if multiple messages are sent to this account before this account sends a * if multiple messages are sent to this account before this account sends a

View file

@ -17,8 +17,6 @@
#include "olm/ratchet.hh" #include "olm/ratchet.hh"
#define DESCRIBE_BUFFER_LEN 256
namespace olm { namespace olm {
struct Account; struct Account;
@ -37,8 +35,6 @@ struct Session {
bool received_message; bool received_message;
char describe_buffer[DESCRIBE_BUFFER_LEN];
_olm_curve25519_public_key alice_identity_key; _olm_curve25519_public_key alice_identity_key;
_olm_curve25519_public_key alice_base_key; _olm_curve25519_public_key alice_base_key;
_olm_curve25519_public_key bob_one_time_key; _olm_curve25519_public_key bob_one_time_key;
@ -137,12 +133,12 @@ struct Session {
); );
/** /**
* Return a string describing this session and its state (not including the * Write a string describing this session and its state (not including the
* private key) * private key) into the buffer provided.
* The pointer returned refers to an internal buffer which will be valid *
* up until the next time describe() is called. * Takes a buffer to write to and the length of that buffer
*/ */
const char *describe(); void describe(char *buf, size_t buflen);
}; };

View file

@ -460,10 +460,16 @@ Session.prototype['decrypt'] = restore_stack(function(
}); });
Session.prototype['describe'] = restore_stack(function() { Session.prototype['describe'] = restore_stack(function() {
var description_buf = session_method(Module['_olm_session_describe'])( var description_buf;
this.ptr try {
); description_buf = malloc(256);
return UTF8ToString(description_buf); session_method(Module['_olm_session_describe'])(
this.ptr, description_buf, 256
);
return UTF8ToString(description_buf);
} finally {
if (description_buf !== undefined) free(description_buf);
}
}); });
function Utility() { function Utility() {

View file

@ -535,10 +535,10 @@ int olm_session_has_received_message(
return from_c(session)->received_message; return from_c(session)->received_message;
} }
const char * olm_session_describe( void olm_session_describe(
OlmSession * session OlmSession * session, char *buf, size_t buflen
) { ) {
return from_c(session)->describe(); from_c(session)->describe(buf, buflen);
} }
size_t olm_matches_inbound_session( size_t olm_matches_inbound_session(

View file

@ -398,32 +398,32 @@ std::size_t olm::Session::decrypt(
return result; return result;
} }
const char * olm::Session::describe() { void olm::Session::describe(char *describe_buffer, size_t buflen) {
if (buflen == 0) return;
describe_buffer[0] = '\0'; describe_buffer[0] = '\0';
char *buf_pos = describe_buffer; char *buf_pos = describe_buffer;
buf_pos += snprintf( buf_pos += snprintf(
buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer), buf_pos, buflen - (buf_pos - describe_buffer),
"sender chain index: %d ", ratchet.sender_chain[0].chain_key.index "sender chain index: %d ", ratchet.sender_chain[0].chain_key.index
); );
buf_pos += snprintf(buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer), "receiver chain indcies:"); buf_pos += snprintf(buf_pos, buflen - (buf_pos - describe_buffer), "receiver chain indcies:");
for (size_t i = 0; i < ratchet.receiver_chains.size(); ++i) { for (size_t i = 0; i < ratchet.receiver_chains.size(); ++i) {
buf_pos += snprintf( buf_pos += snprintf(
buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer), buf_pos, buflen - (buf_pos - describe_buffer),
" %d", ratchet.receiver_chains[i].chain_key.index " %d", ratchet.receiver_chains[i].chain_key.index
); );
} }
buf_pos += snprintf(buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer), " skipped message keys:"); buf_pos += snprintf(buf_pos, buflen - (buf_pos - describe_buffer), " skipped message keys:");
for (size_t i = 0; i < ratchet.skipped_message_keys.size(); ++i) { for (size_t i = 0; i < ratchet.skipped_message_keys.size(); ++i) {
buf_pos += snprintf( buf_pos += snprintf(
buf_pos, DESCRIBE_BUFFER_LEN - (buf_pos - describe_buffer), buf_pos, buflen - (buf_pos - describe_buffer),
" %d", ratchet.skipped_message_keys[i].message_key.index " %d", ratchet.skipped_message_keys[i].message_key.index
); );
} }
return describe_buffer;
} }
namespace { namespace {