decomp: remove the free_dest argument
Since the decompress function ALWAYS returns allocated memory we get a lot simpler code by removing the ability to return data unallocated.
This commit is contained in:
parent
a6fc9aeec9
commit
588c8946fc
22
src/comp.c
22
src/comp.c
@ -80,7 +80,6 @@ comp_method_none_decomp(LIBSSH2_SESSION * session,
|
|||||||
unsigned char **dest,
|
unsigned char **dest,
|
||||||
size_t *dest_len,
|
size_t *dest_len,
|
||||||
size_t payload_limit,
|
size_t payload_limit,
|
||||||
int *free_dest,
|
|
||||||
const unsigned char *src,
|
const unsigned char *src,
|
||||||
size_t src_len, void **abstract)
|
size_t src_len, void **abstract)
|
||||||
{
|
{
|
||||||
@ -89,9 +88,6 @@ comp_method_none_decomp(LIBSSH2_SESSION * session,
|
|||||||
(void) abstract;
|
(void) abstract;
|
||||||
*dest = (unsigned char *) src;
|
*dest = (unsigned char *) src;
|
||||||
*dest_len = src_len;
|
*dest_len = src_len;
|
||||||
|
|
||||||
*free_dest = 0;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,7 +218,6 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session,
|
|||||||
unsigned char **dest,
|
unsigned char **dest,
|
||||||
size_t *dest_len,
|
size_t *dest_len,
|
||||||
size_t payload_limit,
|
size_t payload_limit,
|
||||||
int *free_dest,
|
|
||||||
const unsigned char *src,
|
const unsigned char *src,
|
||||||
size_t src_len, void **abstract)
|
size_t src_len, void **abstract)
|
||||||
{
|
{
|
||||||
@ -234,22 +229,16 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session,
|
|||||||
int limiter = 0;
|
int limiter = 0;
|
||||||
|
|
||||||
/* If strm is null, then we have not yet been initialized. */
|
/* If strm is null, then we have not yet been initialized. */
|
||||||
if (strm == NULL) {
|
if (strm == NULL)
|
||||||
*dest = (unsigned char *) src;
|
return _libssh2_error(session, LIBSSH2_ERROR_COMPRESS,
|
||||||
*dest_len = src_len;
|
"decompression unitilized");;
|
||||||
|
|
||||||
*free_dest = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* In practice they never come smaller than this */
|
/* In practice they never come smaller than this */
|
||||||
if (out_maxlen < 25) {
|
if (out_maxlen < 25)
|
||||||
out_maxlen = 25;
|
out_maxlen = 25;
|
||||||
}
|
|
||||||
|
|
||||||
if (out_maxlen > (int) payload_limit) {
|
if (out_maxlen > (int) payload_limit)
|
||||||
out_maxlen = payload_limit;
|
out_maxlen = payload_limit;
|
||||||
}
|
|
||||||
|
|
||||||
strm->next_in = (unsigned char *) src;
|
strm->next_in = (unsigned char *) src;
|
||||||
strm->avail_in = src_len;
|
strm->avail_in = src_len;
|
||||||
@ -340,7 +329,6 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session,
|
|||||||
|
|
||||||
*dest = (unsigned char *) out;
|
*dest = (unsigned char *) out;
|
||||||
*dest_len = out_maxlen - strm->avail_out;
|
*dest_len = out_maxlen - strm->avail_out;
|
||||||
*free_dest = 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -892,9 +892,11 @@ struct _LIBSSH2_COMP_METHOD
|
|||||||
void **abstract);
|
void **abstract);
|
||||||
int (*decomp) (LIBSSH2_SESSION *session,
|
int (*decomp) (LIBSSH2_SESSION *session,
|
||||||
unsigned char **dest,
|
unsigned char **dest,
|
||||||
size_t *dest_len, size_t payload_limit,
|
size_t *dest_len,
|
||||||
int *free_dest, const unsigned char *src,
|
size_t payload_limit,
|
||||||
size_t src_len, void **abstract);
|
const unsigned char *src,
|
||||||
|
size_t src_len,
|
||||||
|
void **abstract);
|
||||||
int (*dtor) (LIBSSH2_SESSION * session, int compress, void **abstract);
|
int (*dtor) (LIBSSH2_SESSION * session, int compress, void **abstract);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -198,47 +198,18 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ )
|
|||||||
if (session->remote.comp && session->remote.comp->compress) {
|
if (session->remote.comp && session->remote.comp->compress) {
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
size_t data_len;
|
size_t data_len;
|
||||||
int free_payload = 1;
|
|
||||||
|
|
||||||
rc = session->remote.comp->decomp(session,
|
rc = session->remote.comp->decomp(session,
|
||||||
&data, &data_len,
|
&data, &data_len,
|
||||||
LIBSSH2_PACKET_MAXDECOMP,
|
LIBSSH2_PACKET_MAXDECOMP,
|
||||||
&free_payload,
|
|
||||||
p->payload,
|
p->payload,
|
||||||
session->fullpacket_payload_len,
|
session->fullpacket_payload_len,
|
||||||
&session->remote.comp_abstract);
|
&session->remote.comp_abstract);
|
||||||
if(rc) {
|
|
||||||
LIBSSH2_FREE(session, p->payload);
|
LIBSSH2_FREE(session, p->payload);
|
||||||
|
if(rc)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
|
||||||
|
|
||||||
if (free_payload) {
|
|
||||||
LIBSSH2_FREE(session, p->payload);
|
|
||||||
p->payload = data;
|
p->payload = data;
|
||||||
session->fullpacket_payload_len = data_len;
|
session->fullpacket_payload_len = data_len;
|
||||||
} else {
|
|
||||||
if (data == p->payload) {
|
|
||||||
/* It's not to be freed, because the
|
|
||||||
* compression layer reused payload, So let's
|
|
||||||
* do the same!
|
|
||||||
*/
|
|
||||||
session->fullpacket_payload_len = data_len;
|
|
||||||
} else {
|
|
||||||
/* No comp_method actually lets this happen,
|
|
||||||
* but let's prepare for the future */
|
|
||||||
|
|
||||||
LIBSSH2_FREE(session, p->payload);
|
|
||||||
|
|
||||||
/* We need a freeable struct otherwise the
|
|
||||||
* brigade won't know what to do with it */
|
|
||||||
p->payload = LIBSSH2_ALLOC(session, data_len);
|
|
||||||
if (!p->payload)
|
|
||||||
return LIBSSH2_ERROR_ALLOC;
|
|
||||||
|
|
||||||
memcpy(p->payload, data, data_len);
|
|
||||||
session->fullpacket_payload_len = data_len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
session->fullpacket_packet_type = p->payload[0];
|
session->fullpacket_packet_type = p->payload[0];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user