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,
* for debugging and logging purposes. The pointer returned points
* to an internal buffer and is valid until the next call to
* olm_session_describe on the same olm session object.
* Write a string describing the internal state of an olm session
* to the buffer provided for debugging and logging purposes.
*/
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
* if multiple messages are sent to this account before this account sends a

View file

@ -17,8 +17,6 @@
#include "olm/ratchet.hh"
#define DESCRIBE_BUFFER_LEN 256
namespace olm {
struct Account;
@ -37,8 +35,6 @@ struct Session {
bool received_message;
char describe_buffer[DESCRIBE_BUFFER_LEN];
_olm_curve25519_public_key alice_identity_key;
_olm_curve25519_public_key alice_base_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
* private key)
* The pointer returned refers to an internal buffer which will be valid
* up until the next time describe() is called.
* Write a string describing this session and its state (not including the
* private key) into the buffer provided.
*
* 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() {
var description_buf = session_method(Module['_olm_session_describe'])(
this.ptr
var description_buf;
try {
description_buf = malloc(256);
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() {

View file

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

View file

@ -398,32 +398,32 @@ std::size_t olm::Session::decrypt(
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';
char *buf_pos = describe_buffer;
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
);
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) {
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
);
}
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) {
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
);
}
return describe_buffer;
}
namespace {