diff --git a/message_cache.cc b/message_cache.cc index 695ffe5..5b2aff6 100644 --- a/message_cache.cc +++ b/message_cache.cc @@ -230,18 +230,44 @@ namespace pEp { if (!src || emptystr(src->id)) return PEP_ILLEGAL_VALUE; - PEP_STATUS status = ::decrypt_message(session, src, dst, keylist, + ::message *_msg; + { + std::lock_guard l(_mtx); + _msg = message_cache._cache.at(src->id).src; + } + + free(src->longmsg); + src->longmsg = _msg->longmsg; + _msg->longmsg = nullptr; + + free(src->longmsg_formatted); + src->longmsg_formatted = _msg->longmsg_formatted; + _msg->longmsg_formatted = nullptr; + + free_bloblist(src->attachments); + src->attachments = _msg->attachments; + _msg->attachments = nullptr; + + ::message *_dst = nullptr; + PEP_STATUS status = ::decrypt_message(session, src, &_dst, keylist, rating, flags); - ::message *_cpy = empty_message_copy(src); + _msg->longmsg = src->longmsg; + src->longmsg = nullptr; - ::message *_src = (::message *) malloc(sizeof(::message)); - ::memcpy(_src, src, sizeof(::message)); - ::memcpy(src, _cpy, sizeof(::message)); + _msg->longmsg_formatted = src->longmsg_formatted; + src->longmsg_formatted = nullptr; - ::message *_dst = *dst; + _msg->attachments = src->attachments; + src->attachments = nullptr; + *dst = empty_message_copy(_dst); + { + std::lock_guard l(_mtx); + ::free_message(message_cache._cache.at(src->id).dst); + message_cache._cache.at(src->id).dst = _dst; + } return status; }