]> granicus.if.org Git - php/commitdiff
Fix valgrind error (sending of initialized bytes over the network).
authorAndrey Hristov <andrey@php.net>
Wed, 31 Aug 2011 18:18:23 +0000 (18:18 +0000)
committerAndrey Hristov <andrey@php.net>
Wed, 31 Aug 2011 18:18:23 +0000 (18:18 +0000)
When the compression was successful the compressed data + uninitialized data
at the end was sent to the server, because the length of the compressed payload
wasn't correctly calculated (actually the length of the uncompressed payload as assumed).
However, the uncompress() function has internally the length of the real payload and skips
the binary trash at the end - thus no data damage occurs!

ext/mysqlnd/mysqlnd_net.c
ext/mysqlnd/mysqlnd_structs.h

index 606d919e3bd1cc02c4648c938061c759e94f4c0d..15a539fdb99eb24321e7bd56665fbf9d7e476abb 100644 (file)
@@ -272,7 +272,7 @@ MYSQLND_METHOD(mysqlnd_net, send)(MYSQLND * const conn, zend_uchar * const buf,
                        STORE_HEADER_SIZE(safe_storage, uncompressed_payload);
                        int3store(uncompressed_payload, to_be_sent);
                        int1store(uncompressed_payload + 3, net->packet_no);
-                       if (PASS == net->m.encode((compress_buf + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE), tmp_complen,
+                       if (PASS == net->m.encode((compress_buf + COMPRESSED_HEADER_SIZE + MYSQLND_HEADER_SIZE), &tmp_complen,
                                                                           uncompressed_payload, to_be_sent + MYSQLND_HEADER_SIZE TSRMLS_CC))
                        {
                                int3store(compress_buf + MYSQLND_HEADER_SIZE, to_be_sent + MYSQLND_HEADER_SIZE);
@@ -498,20 +498,22 @@ MYSQLND_METHOD(mysqlnd_net, decode)(zend_uchar * uncompressed_data, size_t uncom
 
 /* {{{ mysqlnd_net::encode */
 static enum_func_status
-MYSQLND_METHOD(mysqlnd_net, encode)(zend_uchar * compress_buffer, size_t compress_buffer_len,
+MYSQLND_METHOD(mysqlnd_net, encode)(zend_uchar * compress_buffer, size_t compress_buffer_len,
                                                                        const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC)
 {
 #ifdef MYSQLND_COMPRESSION_ENABLED
        int error;
-       uLongf tmp_complen = compress_buffer_len;
+       uLongf tmp_complen = *compress_buffer_len;
        DBG_ENTER("mysqlnd_net::encode");
        error = compress(compress_buffer, &tmp_complen, uncompressed_data, uncompressed_data_len);
 
        if (error != Z_OK) {
                DBG_INF_FMT("compression NOT successful. error=%d Z_OK=%d Z_BUF_ERROR=%d Z_MEM_ERROR=%d", error, Z_OK, Z_BUF_ERROR, Z_MEM_ERROR);
        } else {
+               *compress_buffer_len = tmp_complen;
                DBG_INF_FMT("compression successful. compressed size=%lu", tmp_complen);
        }
+       
        DBG_RETURN(error == Z_OK? PASS:FAIL);
 #else
        DBG_ENTER("mysqlnd_net::encode");
index 8c3762f9a4bfaa76ed69a8c7bc2a178c8fb05a25..b0b4d9bd76b986cfc517356a550f258cc846bb43 100644 (file)
@@ -267,7 +267,7 @@ typedef enum_func_status    (*func_mysqlnd_net__set_client_option)(MYSQLND_NET * co
 typedef enum_func_status       (*func_mysqlnd_net__network_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC);
 typedef size_t                         (*func_mysqlnd_net__network_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC);
 typedef enum_func_status       (*func_mysqlnd_net__decode)(zend_uchar * uncompressed_data, size_t uncompressed_data_len, const zend_uchar * const compressed_data, size_t compressed_data_len TSRMLS_DC);
-typedef enum_func_status       (*func_mysqlnd_net__encode)(zend_uchar * compress_buffer, size_t compress_buffer_len, const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC);
+typedef enum_func_status       (*func_mysqlnd_net__encode)(zend_uchar * compress_buffer, size_t compress_buffer_len, const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC);
 typedef size_t                         (*func_mysqlnd_net__consume_uneaten_data)(MYSQLND_NET * const net, enum php_mysqlnd_server_command cmd TSRMLS_DC);
 typedef void                           (*func_mysqlnd_net__free_contents)(MYSQLND_NET * net TSRMLS_DC);
 typedef enum_func_status       (*func_mysqlnd_net__enable_ssl)(MYSQLND_NET * const net TSRMLS_DC);