Changeset 186

Show
Ignore:
Timestamp:
01/23/05 03:35:42 (4 years ago)
Author:
morris
Message:

Fix wr_text_convert() so it won't write past its buffers

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wire/trunk/wire/client.c

    r185 r186  
    1 /* $Id: client.c,v 1.57 2005/01/23 01:08:34 morris Exp $ */ 
     1/* $Id: client.c,v 1.58 2005/01/23 02:35:42 morris Exp $ */ 
    22 
    33/* 
     
    349349int wr_parse_message(char *buffer) { 
    350350        za_argv_t               *argv; 
    351     char                        *p, *buf, *msg = NULL, *arg = NULL; 
     351    char                        *p, *cbuf, *buf, *msg = NULL, *arg = NULL; 
    352352        unsigned int    message; 
    353     int                         i, bytes
     353    int                         i
    354354         
    355355        argv = za_argv_alloc(); 
    356356 
    357357        /* convert buffer */ 
    358         bytes = strlen(buffer); 
    359         wr_received_bytes += bytes; 
    360         wr_text_convert(wr_conv_from, buffer, &bytes); 
     358        wr_received_bytes += strlen(buffer); 
     359        cbuf = wr_text_convert(wr_conv_from, buffer); 
    361360 
    362361        /* get message */ 
    363         buf = buffer
     362        buf = cbuf
    364363 
    365364        for(p = buf; *buf && !isspace(*buf); buf++) 
     
    570569 
    571570 
     571        if(cbuf) 
     572                free(cbuf); 
     573 
    572574        if(msg) 
    573575                free(msg); 
     
    601603 
    602604void wr_send_command_on_ssl(SSL *ssl, const char *fmt, ...) { 
    603         char            *inbuffer, *outbuffer
     605        char            *inbuffer, *outbuffer, *cbuffer
    604606        va_list         ap; 
    605607        int                     bytes; 
     
    607609        va_start(ap, fmt); 
    608610 
    609         if(vasprintf(&inbuffer, fmt, ap) == -1 || inbuffer == NULL) 
     611        if((bytes = vasprintf(&inbuffer, fmt, ap)) < 0 || inbuffer == NULL) 
    610612                return; 
    611613         
     
    613615                wr_printf_prefix("<<< %s\n", inbuffer); 
    614616         
    615         bytes = strlen(inbuffer) + 2; 
     617        bytes += 2; 
    616618        outbuffer = (char *) malloc(bytes); 
    617619        bytes = snprintf(outbuffer, bytes, "%s%s", 
    618620                inbuffer, WR_MESSAGE_SEPARATOR); 
    619621 
    620         wr_text_convert(wr_conv_to, outbuffer, &bytes); 
    621  
    622622        if(ssl) { 
    623                 SSL_write(ssl, outbuffer, bytes); 
     623                cbuffer = wr_text_convert(wr_conv_to, outbuffer); 
     624                bytes = strlen(cbuffer); 
     625                SSL_write(ssl, cbuffer, bytes); 
    624626                wr_transferred_bytes += bytes; 
    625627        } 
     
    676678        za_strtoui(argv[0], &cid); 
    677679        za_strtoui(argv[1], &uid); 
    678  
    679680        user = wr_user_with_uid(uid); 
    680681 
  • wire/trunk/wire/main.c

    r184 r186  
    1 /* $Id: main.c,v 1.70 2005/01/23 01:01:04 morris Exp $ */ 
     1/* $Id: main.c,v 1.71 2005/01/23 02:35:42 morris Exp $ */ 
    22 
    33/* 
     
    494494#pragma mark - 
    495495 
    496 void wr_text_convert(iconv_t conv, char *inbuffer, int *inbytes) { 
    497         char            *in, *out, *outbuffer; 
    498         size_t          outbytes, length; 
    499  
    500         if(conv == (iconv_t) -1) 
    501                 return; 
    502  
    503         length = outbytes = *inbytes * 2; 
    504         outbuffer = (char *) malloc(outbytes); 
    505         memset(outbuffer, 0, outbytes); 
     496char * wr_text_convert(iconv_t conv, const char *inbuffer) { 
     497        const char      *in; 
     498        char            *out, *outbuffer; 
     499        size_t          bytes, inbytes, outbytes; 
     500 
     501        inbytes = strlen(inbuffer); 
     502        bytes = outbytes = inbytes * 4; 
     503        outbuffer = (char *) malloc(bytes); 
     504        in = inbuffer; 
    506505        out = outbuffer; 
    507         in = inbuffer; 
    508  
    509         if((iconv_t) iconv(conv, (const char **) &in, (size_t *) inbytes, &out, &outbytes) != (iconv_t) -1) { 
    510                 memcpy(inbuffer, outbuffer, length - outbytes); 
    511                 inbuffer[length - outbytes] = '\0'; 
    512  
    513                 *inbytes = length - outbytes; 
     506 
     507        if((iconv_t) iconv(conv, &in, &inbytes, &out, &outbytes) != (iconv_t) -1) { 
     508                outbuffer[bytes - outbytes] = '\0'; 
    514509        } else { 
    515510                wr_printf_prefix("iconv: %s\n", strerror(errno)); 
    516         } 
    517  
    518         free(outbuffer); 
     511                wr_printf_prefix("inbuffer: %u '%s'\n", inbytes, inbuffer); 
     512                wr_printf_prefix("outbuffer: %u '%s'\n", outbytes, outbuffer); 
     513                strlcpy(outbuffer, inbuffer, bytes); 
     514        } 
     515 
     516        return outbuffer; 
    519517} 
    520518 
  • wire/trunk/wire/main.h

    r183 r186  
    1 /* $Id: main.h,v 1.21 2005/01/23 00:06:02 morris Exp $ */ 
     1/* $Id: main.h,v 1.22 2005/01/23 02:35:42 morris Exp $ */ 
    22 
    33/* 
     
    5959void                                                                    wr_loop(bool, int, double); 
    6060 
    61 void                                                                   wr_text_convert(iconv_t, char *, int *); 
     61char *                                                                 wr_text_convert(iconv_t, const char *); 
    6262char *                                                                  wr_expand_path(const char *, char *); 
    6363