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:
Daniel Stenberg 2010-11-03 15:03:57 +01:00
parent a6fc9aeec9
commit 588c8946fc
3 changed files with 14 additions and 53 deletions

View File

@ -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;
} }

View File

@ -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);
}; };

View File

@ -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) { p->payload = data;
LIBSSH2_FREE(session, p->payload); session->fullpacket_payload_len = data_len;
p->payload = data;
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];