1
1

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.
Этот коммит содержится в:
Daniel Stenberg 2010-11-03 15:03:57 +01:00
родитель a6fc9aeec9
Коммит 588c8946fc
3 изменённых файлов: 14 добавлений и 53 удалений

Просмотреть файл

@ -80,7 +80,6 @@ comp_method_none_decomp(LIBSSH2_SESSION * session,
unsigned char **dest,
size_t *dest_len,
size_t payload_limit,
int *free_dest,
const unsigned char *src,
size_t src_len, void **abstract)
{
@ -89,9 +88,6 @@ comp_method_none_decomp(LIBSSH2_SESSION * session,
(void) abstract;
*dest = (unsigned char *) src;
*dest_len = src_len;
*free_dest = 0;
return 0;
}
@ -222,7 +218,6 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session,
unsigned char **dest,
size_t *dest_len,
size_t payload_limit,
int *free_dest,
const unsigned char *src,
size_t src_len, void **abstract)
{
@ -234,22 +229,16 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session,
int limiter = 0;
/* If strm is null, then we have not yet been initialized. */
if (strm == NULL) {
*dest = (unsigned char *) src;
*dest_len = src_len;
*free_dest = 0;
return 0;
}
if (strm == NULL)
return _libssh2_error(session, LIBSSH2_ERROR_COMPRESS,
"decompression unitilized");;
/* In practice they never come smaller than this */
if (out_maxlen < 25) {
if (out_maxlen < 25)
out_maxlen = 25;
}
if (out_maxlen > (int) payload_limit) {
if (out_maxlen > (int) payload_limit)
out_maxlen = payload_limit;
}
strm->next_in = (unsigned char *) src;
strm->avail_in = src_len;
@ -340,7 +329,6 @@ comp_method_zlib_decomp(LIBSSH2_SESSION * session,
*dest = (unsigned char *) out;
*dest_len = out_maxlen - strm->avail_out;
*free_dest = 1;
return 0;
}

Просмотреть файл

@ -892,9 +892,11 @@ struct _LIBSSH2_COMP_METHOD
void **abstract);
int (*decomp) (LIBSSH2_SESSION *session,
unsigned char **dest,
size_t *dest_len, size_t payload_limit,
int *free_dest, const unsigned char *src,
size_t src_len, void **abstract);
size_t *dest_len,
size_t payload_limit,
const unsigned char *src,
size_t src_len,
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) {
unsigned char *data;
size_t data_len;
int free_payload = 1;
rc = session->remote.comp->decomp(session,
&data, &data_len,
LIBSSH2_PACKET_MAXDECOMP,
&free_payload,
p->payload,
session->fullpacket_payload_len,
&session->remote.comp_abstract);
if(rc) {
LIBSSH2_FREE(session, p->payload);
LIBSSH2_FREE(session, p->payload);
if(rc)
return rc;
}
if (free_payload) {
LIBSSH2_FREE(session, p->payload);
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;
}
}
p->payload = data;
session->fullpacket_payload_len = data_len;
}
session->fullpacket_packet_type = p->payload[0];