mirror of
				https://github.com/libssh2/libssh2.git
				synced 2025-11-03 22:13:11 +03:00 
			
		
		
		
	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:
		
							
								
								
									
										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];
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user