Changeset 4979


Ignore:
Timestamp:
Feb 10, 2015 3:20:04 AM (10 years ago)
Author:
ming
Message:

Re #1782 (misc): Prevent buffer overrun in pjsip message/uri printing
Thanks to Sagi Iltus for the patch

Location:
pjproject/trunk/pjsip
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsip/print_util.h

    r4537 r4979  
    2020#ifndef __PJSIP_PRINT_H__ 
    2121#define __PJSIP_PRINT_H__ 
     22 
     23#define copy_advance_char_check(buf,chr)   \ 
     24        do { \ 
     25            if (1 >= (endbuf-buf)) return -1;   \ 
     26            *buf++ = chr; \ 
     27        } while (0) 
    2228 
    2329#define copy_advance_check(buf,str)   \ 
  • pjproject/trunk/pjsip/src/pjsip/sip_msg.c

    r4849 r4979  
    12211221 
    12221222        copy_advance(buf, (*hname)); 
    1223         *buf++ = ':'; 
    1224         *buf++ = ' '; 
     1223        copy_advance_char_check(buf, ':'); 
     1224        copy_advance_char_check(buf, ' '); 
    12251225 
    12261226        printed = pjsip_uri_print(PJSIP_URI_IN_CONTACT_HDR, hdr->uri,  
  • pjproject/trunk/pjsip/src/pjsip/sip_uri.c

    r4537 r4979  
    122122 
    123123    do { 
    124         *buf++ = (char)sep; 
     124        copy_advance_char_check(buf, (char)sep); 
    125125        copy_advance_escape(buf, p->name, (*pname_spec)); 
    126126        if (p->value.slen) { 
    127             *buf++ = '='; 
     127            copy_advance_char_check(buf, '='); 
    128128            if (*p->value.ptr == '"') 
    129129                copy_advance(buf, p->value); 
     
    266266    scheme = pjsip_uri_get_scheme(url); 
    267267    copy_advance_check(buf, *scheme); 
    268     *buf++ = ':'; 
     268    copy_advance_char_check(buf, ':'); 
    269269 
    270270    /* Print "user:password@", if any. */ 
     
    275275        copy_advance_escape(buf, url->user, *spec); 
    276276        if (url->passwd.slen) { 
    277             *buf++ = ':'; 
     277            copy_advance_char_check(buf, ':'); 
    278278            copy_advance_escape(buf, url->passwd, pc->pjsip_PASSWD_SPEC); 
    279279        } 
    280280 
    281         *buf++ = '@'; 
     281        copy_advance_char_check(buf, '@'); 
    282282    } 
    283283 
     
    305305            return -1; 
    306306 
    307         *buf++ = ':'; 
     307        copy_advance_char_check(buf, ':'); 
    308308        printed = pj_utoa(url->port, buf); 
    309309        buf += printed; 
     
    567567    if (context != PJSIP_URI_IN_REQ_URI) { 
    568568        if (name->display.slen) { 
    569             if (endbuf-buf < 8) return -1; 
    570             *buf++ = '"'; 
     569            if (endbuf-buf < name->display.slen + 3) return -1; 
     570            copy_advance_char_check(buf, '"'); 
    571571            copy_advance(buf, name->display); 
    572             *buf++ = '"'; 
    573             *buf++ = ' '; 
     572            copy_advance_char_check(buf, '"'); 
     573            copy_advance_char_check(buf, ' '); 
    574574        } 
    575         *buf++ = '<'; 
     575        copy_advance_char_check(buf, '<');; 
    576576    } 
    577577 
     
    582582 
    583583    if (context != PJSIP_URI_IN_REQ_URI) { 
    584         *buf++ = '>'; 
     584        copy_advance_char_check(buf, '>'); 
    585585    } 
    586586 
Note: See TracChangeset for help on using the changeset viewer.