Changeset 5295

Show
Ignore:
Timestamp:
02/21/08 08:42:56 (6 months ago)
Author:
morris
Message:

Make wi_p7_socket_read_oobdata() return a malloc'd buffer of variable size, callers have to free() it

Introduce a new error, WI_ERROR_P7_MESSSAGETOOLARGE, a sanity check if a client feels like sending us something like 4 GB to malloc

Support checksumming of OOB data

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libwired/trunk/libwired/misc/wi-error.c

    r5279 r5295  
    108108        /* WI_ERROR_P7_NORSAKEY */ 
    109109        "No private RSA key set", 
     110        /* WI_ERROR_P7_MESSSAGETOOLARGE */ 
     111        "Message too large", 
    110112         
    111113        /* WI_ERROR_REGEXP_NOSLASH */ 
  • libwired/trunk/libwired/misc/wi-error.h

    r5279 r5295  
    6767        WI_ERROR_P7_CHECKSUMMISMATCH, 
    6868        WI_ERROR_P7_NORSAKEY, 
     69        WI_ERROR_P7_MESSSAGETOOLARGE, 
    6970 
    7071        WI_ERROR_REGEXP_NOSLASH, 
  • libwired/trunk/libwired/p7/wi-p7-socket.c

    r5280 r5295  
    6060#define _WI_P7_SOCKET_BINARY_MAGIC_SIZE                                         66 
    6161#define _WI_P7_SOCKET_LENGTH_SIZE                                                       4 
     62#define _WI_P7_SOCKET_MAX_BINARY_SIZE                                           65536 
    6263 
    6364#define _WI_P7_SOCKET_CHECKSUM_LENGTH                                           SHA_DIGEST_LENGTH 
     
    185186static void                                                                     _wi_p7_socket_configure_checksum(wi_p7_socket_t *); 
    186187static void                                                                     _wi_p7_socket_checksum_binary_message(wi_p7_socket_t *, wi_p7_message_t *, void *); 
     188static void                                                                     _wi_p7_socket_checksum_buffer(wi_p7_socket_t *, const void *, uint32_t, void *); 
    187189 
    188190 
     
    10821084        int32_t                         length; 
    10831085         
     1086        if(length > _WI_P7_SOCKET_MAX_BINARY_SIZE) { 
     1087                wi_error_set_libwired_error(WI_ERROR_P7_MESSSAGETOOLARGE); 
     1088                 
     1089                return NULL; 
     1090        } 
     1091 
    10841092        p7_message = wi_autorelease(wi_p7_message_init_with_serialization(wi_p7_message_alloc(), 
    10851093                WI_P7_BINARY, wi_p7_socket_spec(p7_socket))); 
     
    13171325 
    13181326 
    1319 static void _wi_p7_socket_checksum_binary_message(wi_p7_socket_t *p7_socket, wi_p7_message_t *p7_message, void *buffer) { 
     1327static void _wi_p7_socket_checksum_binary_message(wi_p7_socket_t *p7_socket, wi_p7_message_t *p7_message, void *out_buffer) { 
     1328        _wi_p7_socket_checksum_buffer(p7_socket, p7_message->binary_buffer, p7_message->binary_size, out_buffer); 
     1329
     1330 
     1331 
     1332 
     1333static void _wi_p7_socket_checksum_buffer(wi_p7_socket_t *p7_socket, const void *buffer, uint32_t size, void *out_buffer) { 
    13201334        SHA_CTX         c; 
    13211335 
    13221336        if(p7_socket->options & WI_P7_CHECKSUM_SHA1) { 
    13231337                SHA1_Init(&c); 
    1324                 SHA1_Update(&c, p7_message->binary_buffer, p7_message->binary_size); 
    1325                 SHA1_Final(buffer, &c); 
     1338                SHA1_Update(&c, buffer, size); 
     1339                SHA1_Final(out_buffer, &c); 
    13261340        } 
    13271341} 
     
    14921506 
    14931507 
    1494 wi_integer_t wi_p7_socket_write_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, const void *buffer, uint32_t size) { 
     1508wi_boolean_t wi_p7_socket_write_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, const void *buffer, uint32_t size) { 
    14951509        const void                      *send_buffer; 
    14961510        void                            *compressed_buffer = NULL, *encrypted_buffer = NULL; 
    14971511        char                            length_buffer[_WI_P7_SOCKET_LENGTH_SIZE]; 
    1498         wi_integer_t           result = -1
     1512        unsigned char          checksum_buffer[_WI_P7_SOCKET_CHECKSUM_LENGTH]
    14991513        uint32_t                        send_size, compressed_size, encrypted_size; 
    1500          
    1501         send_size       = size; 
     1514        wi_boolean_t            result = false; 
     1515         
     1516        send_size = size; 
    15021517        send_buffer     = buffer; 
    15031518         
     1519        if(p7_socket->checksum_enabled) 
     1520                _wi_p7_socket_checksum_buffer(p7_socket, send_buffer, send_size, checksum_buffer); 
     1521 
    15041522        if(p7_socket->compression_enabled) { 
    15051523                if(!_wi_p7_socket_xcompress_buffer(p7_socket, 
     
    15341552                goto end; 
    15351553 
    1536         result = wi_socket_write_buffer(p7_socket->socket, timeout, send_buffer, send_size); 
     1554        if(wi_socket_write_buffer(p7_socket->socket, timeout, send_buffer, send_size) < 0) 
     1555                goto end; 
     1556 
     1557        if(p7_socket->checksum_enabled) { 
     1558                if(wi_socket_write_buffer(p7_socket->socket, timeout, checksum_buffer, p7_socket->checksum_length) < 0) 
     1559                        goto end; 
     1560        } 
     1561         
     1562        result = true; 
    15371563 
    15381564end: 
     
    15451571 
    15461572 
    1547 wi_integer_t wi_p7_socket_read_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, void *out_buffer, uint32_t out_size) { 
     1573wi_integer_t wi_p7_socket_read_oobdata(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, void **out_buffer) { 
    15481574        void                            *receive_buffer = NULL, *decrypted_buffer, *decompressed_buffer; 
    15491575        char                            length_buffer[_WI_P7_SOCKET_LENGTH_SIZE]; 
    1550         wi_integer_t            result = -1; 
    1551         uint32_t                        receive_size, decompressed_size, decrypted_size; 
    1552          
    1553         if(wi_socket_read_buffer(p7_socket->socket, timeout, length_buffer, sizeof(length_buffer)) <= 0) 
    1554                 goto end; 
    1555          
    1556         receive_size    = wi_read_swap_big_to_host_int32(length_buffer, 0); 
    1557         receive_buffer  = wi_malloc(receive_size); 
    1558          
    1559         result = wi_socket_read_buffer(p7_socket->socket, timeout, receive_buffer, receive_size); 
     1576        unsigned char           local_checksum_buffer[_WI_P7_SOCKET_CHECKSUM_LENGTH]; 
     1577        unsigned char           remote_checksum_buffer[_WI_P7_SOCKET_CHECKSUM_LENGTH]; 
     1578        wi_integer_t            result; 
     1579        uint32_t                        receive_size, received_size, decompressed_size, decrypted_size; 
     1580         
     1581        result = wi_socket_read_buffer(p7_socket->socket, timeout, length_buffer, sizeof(length_buffer)); 
    15601582         
    15611583        if(result <= 0) 
    15621584                goto end; 
     1585         
     1586        receive_size = wi_read_swap_big_to_host_int32(length_buffer, 0); 
     1587         
     1588        if(receive_size > _WI_P7_SOCKET_MAX_BINARY_SIZE) { 
     1589                wi_error_set_libwired_error(WI_ERROR_P7_MESSSAGETOOLARGE); 
     1590                 
     1591                result = -1; 
     1592                 
     1593                goto end; 
     1594        } 
     1595         
     1596        receive_buffer = wi_malloc(receive_size); 
     1597        received_size = 0; 
     1598         
     1599        while(received_size < receive_size) { 
     1600                result = wi_socket_read_buffer(p7_socket->socket, timeout, receive_buffer + received_size, receive_size - received_size); 
     1601         
     1602                if(result <= 0) 
     1603                        goto end; 
     1604                 
     1605                received_size += result; 
     1606        } 
    15631607         
    15641608        if(p7_socket->encryption_enabled) { 
     
    15681612                                                                        &decrypted_buffer, 
    15691613                                                                        &decrypted_size)) { 
     1614                        result = -1; 
     1615                         
    15701616                        goto end; 
    15711617                } 
     
    15841630                                                                                   &decompressed_buffer, 
    15851631                                                                                   &decompressed_size)) { 
     1632                        result = -1; 
     1633 
    15861634                        goto end; 
    15871635                } 
     
    15931641        } 
    15941642         
    1595         memcpy(out_buffer, receive_buffer, receive_size); 
    1596          
     1643        if(p7_socket->checksum_enabled) { 
     1644                result = wi_socket_read_buffer(p7_socket->socket, timeout, remote_checksum_buffer, p7_socket->checksum_length); 
     1645                 
     1646                if(result <= 0) 
     1647                        goto end; 
     1648                 
     1649                _wi_p7_socket_checksum_buffer(p7_socket, receive_buffer, receive_size, local_checksum_buffer); 
     1650                 
     1651                if(memcmp(remote_checksum_buffer, local_checksum_buffer, p7_socket->checksum_length) != 0) { 
     1652                        wi_error_set_libwired_p7_error(WI_ERROR_P7_CHECKSUMMISMATCH, WI_STR("")); 
     1653                         
     1654                        result = -1; 
     1655                         
     1656                        goto end; 
     1657                } 
     1658        } 
     1659 
    15971660        result = receive_size; 
    15981661         
    15991662end: 
    1600         wi_free(receive_buffer); 
     1663        if(result > 0) 
     1664                *out_buffer = receive_buffer; 
     1665        else if(receive_buffer) 
     1666                wi_free(receive_buffer); 
    16011667         
    16021668        return result; 
  • libwired/trunk/libwired/p7/wi-p7-socket.h

    r5253 r5295  
    9393WI_EXPORT wi_boolean_t                                                          wi_p7_socket_write_message(wi_p7_socket_t *, wi_time_interval_t, wi_p7_message_t *); 
    9494WI_EXPORT wi_p7_message_t *                                                     wi_p7_socket_read_message(wi_p7_socket_t *, wi_time_interval_t); 
    95 WI_EXPORT int32_t                                                                     wi_p7_socket_write_oobdata(wi_p7_socket_t *, wi_time_interval_t, const void *, uint32_t); 
    96 WI_EXPORT int32_t                                                                      wi_p7_socket_read_oobdata(wi_p7_socket_t *, wi_time_interval_t, void *, uint32_t); 
     95WI_EXPORT wi_boolean_t                                                                wi_p7_socket_write_oobdata(wi_p7_socket_t *, wi_time_interval_t, const void *, uint32_t); 
     96WI_EXPORT wi_integer_t                                                         wi_p7_socket_read_oobdata(wi_p7_socket_t *, wi_time_interval_t, void **); 
    9797 
    9898