Changeset 4613 for pjproject/trunk


Ignore:
Timestamp:
Oct 8, 2013 9:08:13 AM (11 years ago)
Author:
bennylp
Message:

Re #1703: fixing general bugs. First installment: correct handling of snprintf return value

Location:
pjproject/trunk
Files:
28 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib-util/src/pjlib-util/dns_dump.c

    r3553 r4613  
    3737    if (ttl > DAY) { 
    3838        len = pj_ansi_snprintf(p, size, "%dd ", ttl/DAY); 
    39         if (len < 1) 
     39        if (len < 1 || len >= size) 
    4040            return "-err-"; 
    4141        size -= len; 
     
    4646    if (ttl > HOUR) { 
    4747        len = pj_ansi_snprintf(p, size, "%dh ", ttl/HOUR); 
    48         if (len < 1) 
     48        if (len < 1 || len >= size) 
    4949            return "-err-"; 
    5050        size -= len; 
     
    5555    if (ttl > MINUTE) { 
    5656        len = pj_ansi_snprintf(p, size, "%dm ", ttl/MINUTE); 
    57         if (len < 1) 
     57        if (len < 1 || len >= size) 
    5858            return "-err-"; 
    5959        size -= len; 
     
    6464    if (ttl > 0) { 
    6565        len = pj_ansi_snprintf(p, size, "%ds ", ttl); 
    66         if (len < 1) 
     66        if (len < 1 || len >= size) 
    6767            return "-err-"; 
    6868        size -= len; 
  • pjproject/trunk/pjlib-util/src/pjlib-util/errno.c

    r4440 r4613  
    167167                                   "Unknown pjlib-util error %d", 
    168168                                   statcode); 
    169  
     169    if (errstr.slen < 1 || errstr.slen >= (pj_ssize_t)bufsize) 
     170        errstr.slen = bufsize - 1; 
    170171    return errstr; 
    171172} 
  • pjproject/trunk/pjlib-util/src/pjlib-util/http_client.c

    r4537 r4613  
    13591359    if (chal->qop.slen == 0) { 
    13601360        const pj_str_t STR_MD5 = { "MD5", 3 }; 
     1361        int max_len; 
    13611362 
    13621363        /* Server doesn't require quality of protection. */ 
     
    13661367                                    &hreq->param.method); 
    13671368 
     1369        max_len = len; 
    13681370        len = pj_ansi_snprintf( 
    1369                 phdr->value.ptr, len, 
     1371                phdr->value.ptr, max_len, 
    13701372                "Digest username=\"%.*s\", " 
    13711373                "realm=\"%.*s\", " 
     
    13801382                STR_PREC(STR_MD5), 
    13811383                STR_PREC(digest_response)); 
    1382         if (len < 0) 
     1384        if (len < 0 || len >= max_len) 
    13831385            return PJ_ETOOSMALL; 
    13841386        phdr->value.slen = len; 
     
    13921394        const pj_str_t nc = pj_str("00000001"); 
    13931395        const pj_str_t cnonce = pj_str("b39971"); 
     1396        int max_len; 
    13941397 
    13951398        auth_create_digest_response(&digest_response, cred, 
     
    13971400                                    &hreq->hurl.path, &chal->realm, 
    13981401                                    &hreq->param.method); 
     1402        max_len = len; 
    13991403        len = pj_ansi_snprintf( 
    1400                 phdr->value.ptr, len, 
     1404                phdr->value.ptr, max_len, 
    14011405                "Digest username=\"%.*s\", " 
    14021406                "realm=\"%.*s\", " 
     
    14171421                STR_PREC(nc), 
    14181422                STR_PREC(cnonce)); 
    1419         if (len < 0) 
     1423        if (len < 0 || len >= max_len) 
    14201424            return PJ_ETOOSMALL; 
    14211425        phdr->value.slen = len; 
  • pjproject/trunk/pjlib/src/pj/errno.c

    r4537 r4613  
    9292static int pjlib_error(pj_status_t code, char *buf, pj_size_t size) 
    9393{ 
     94    int len; 
     95 
    9496#if defined(PJ_HAS_ERROR_STRING) && PJ_HAS_ERROR_STRING!=0 
    9597    unsigned i; 
     
    106108#endif 
    107109 
    108     return pj_ansi_snprintf( buf, size, "Unknown pjlib error %d", code); 
     110    len = pj_ansi_snprintf( buf, size, "Unknown pjlib error %d", code); 
     111    if (len < 1 || len >= (int)size) 
     112        len = size - 1; 
     113    return len; 
    109114} 
    110115 
     
    200205    } 
    201206 
    202     if (len < 1) { 
    203         *buf = '\0'; 
    204         len = 0; 
     207    if (len < 1 || len >= (int)bufsize) { 
     208        len = bufsize - 1; 
     209        buf[len] = '\0'; 
    205210    } 
    206211 
  • pjproject/trunk/pjlib/src/pj/lock.c

    r4412 r4613  
    684684 
    685685        len = pj_ansi_snprintf(start, max_len, "%s:%d ", ref->file, ref->line); 
    686         if (len < 1 || len > max_len) { 
     686        if (len < 1 || len >= max_len) { 
    687687            len = strlen(ref->file); 
    688688            if (len > max_len - 1) 
  • pjproject/trunk/pjlib/src/pj/log.c

    r4537 r4613  
    446446                                     "<logging error: msg too long>"); 
    447447    } 
     448    if (print_len < 1 || print_len >= (int)(sizeof(log_buffer)-len)) { 
     449        print_len = sizeof(log_buffer) - len - 1; 
     450    } 
    448451    len = len + print_len; 
    449452    if (len > 0 && len < (int)sizeof(log_buffer)-2) { 
  • pjproject/trunk/pjlib/src/pj/os_error_symbian.cpp

    r3553 r4613  
    163163 
    164164    if (!len) { 
    165         len = pj_ansi_snprintf( buf, bufsize, "Symbian native error %d",  
     165        len = pj_ansi_snprintf( buf, bufsize-1, "Symbian native error %d", 
    166166                                os_errcode); 
    167167        buf[len] = '\0'; 
  • pjproject/trunk/pjlib/src/pj/ssl_sock_ossl.c

    r4537 r4613  
    273273                                   "Unknown OpenSSL error %lu", 
    274274                                   ssl_err); 
    275  
     275    if (errstr.slen < 1 || errstr.slen >= (int)bufsize) 
     276        errstr.slen = bufsize - 1; 
    276277    return errstr; 
    277278} 
  • pjproject/trunk/pjmedia/src/pjmedia-audiodev/alsa_dev.c

    r4283 r4613  
    172172{ 
    173173    char err_msg[128]; 
    174     int index; 
     174    int index, len; 
    175175    va_list arg; 
    176176 
     
    181181    index = snprintf (err_msg, sizeof(err_msg), "ALSA lib: "); 
    182182#endif 
     183    if (index < 1 || index >= (int)sizeof(err_msg)) { 
     184        index = sizeof(err_msg)-1; 
     185        err_msg[index] = '\0'; 
     186        goto print_msg; 
     187    } 
     188 
    183189    va_start (arg, fmt); 
    184     if (index < sizeof(err_msg)-1) 
    185         index += vsnprintf (err_msg+index, sizeof(err_msg)-index, fmt, arg); 
     190    if (index < sizeof(err_msg)-1) { 
     191        len = vsnprintf( err_msg+index, sizeof(err_msg)-index, fmt, arg); 
     192        if (len < 1 || len >= (int)sizeof(err_msg)-index) 
     193            len = sizeof(err_msg)-index-1; 
     194        index += len; 
     195        err_msg[index] = '\0'; 
     196    } 
    186197    va_end(arg); 
    187     if (err && index < sizeof(err_msg)-1) 
    188         index += snprintf (err_msg+index, sizeof(err_msg)-index, ": %s", 
    189                            snd_strerror(err)); 
     198    if (err && index < sizeof(err_msg)-1) { 
     199        len = snprintf( err_msg+index, sizeof(err_msg)-index, ": %s", 
     200                        snd_strerror(err)); 
     201        if (len < 1 || len >= (int)sizeof(err_msg)-index) 
     202            len = sizeof(err_msg)-index-1; 
     203        index += len; 
     204        err_msg[index] = '\0'; 
     205    } 
     206print_msg: 
    190207    PJ_LOG (4,(THIS_FILE, "%s", err_msg)); 
    191208} 
  • pjproject/trunk/pjmedia/src/pjmedia-audiodev/errno.c

    r4537 r4613  
    215215                                   "Unknown pjmedia-audiodev error %d", 
    216216                                   statcode); 
    217  
     217    if (errstr.slen < 1 || errstr.slen >= (pj_ssize_t)bufsize) 
     218        errstr.slen = bufsize - 1; 
    218219    return errstr; 
    219220} 
  • pjproject/trunk/pjmedia/src/pjmedia-videodev/errno.c

    r3715 r4613  
    112112                                   "Unknown pjmedia-videodev error %d", 
    113113                                   statcode); 
    114  
     114    if (errstr.slen < 1 || errstr.slen >= (pj_ssize_t)bufsize) 
     115        errstr.slen = bufsize - 1; 
    115116    return errstr; 
    116117} 
  • pjproject/trunk/pjmedia/src/pjmedia/endpoint.c

    r4537 r4613  
    491491 
    492492            /* Print codec PT */ 
    493             buf_len += pj_ansi_snprintf(buf,  
    494                                         MAX_FMTP_STR_LEN - buf_len,  
    495                                         "%d",  
     493            buf_len += pj_ansi_snprintf(buf, 
     494                                        MAX_FMTP_STR_LEN - buf_len, 
     495                                        "%d", 
    496496                                        codec_info->pt); 
    497497 
     
    501501                /* Check if buf still available */ 
    502502                test_len = dec_fmtp->param[i].val.slen +  
    503                            dec_fmtp->param[i].name.slen; 
     503                           dec_fmtp->param[i].name.slen + 2; 
    504504                if (test_len + buf_len >= MAX_FMTP_STR_LEN) 
    505505                    return PJ_ETOOBIG; 
     
    687687                /* Check if buf still available */ 
    688688                test_len = dec_fmtp->param[j].val.slen +  
    689                            dec_fmtp->param[j].name.slen; 
     689                           dec_fmtp->param[j].name.slen + 2; 
    690690                if (test_len + buf_len >= MAX_FMTP_STR_LEN) 
    691691                    return PJ_ETOOBIG; 
  • pjproject/trunk/pjmedia/src/pjmedia/errno.c

    r3945 r4613  
    267267                                   "Unknown pjmedia error %d", 
    268268                                   statcode); 
    269  
     269    if (errstr.slen < 1 || errstr.slen >= (pj_ssize_t)bufsize) 
     270        errstr.slen = bufsize - 1; 
    270271    return errstr; 
    271272} 
  • pjproject/trunk/pjmedia/src/pjmedia/ffmpeg_util.c

    r4537 r4613  
    115115        AVClass* avc = *(AVClass**)ptr; 
    116116        len = pj_ansi_snprintf(buf, bufsize, "%s: ", avc->item_name(ptr)); 
     117        if (len < 1 || len >= bufsize) 
     118            len = bufsize - 1; 
    117119        bufsize -= len; 
    118120    } 
  • pjproject/trunk/pjmedia/src/pjmedia/sdp.c

    r4537 r4613  
    504504                           rtpmap->param.ptr); 
    505505 
    506     if (len < 1 || len > (int)sizeof(tempbuf)) 
     506    if (len < 1 || len >= (int)sizeof(tempbuf)) 
    507507        return PJMEDIA_SDP_ERTPMAPTOOLONG; 
    508508 
     
    527527                               (int)c->addr.slen, 
    528528                               c->addr.ptr); 
    529     if (printed < 1 || printed > len) 
     529    if (printed < 1 || printed >= len) 
    530530        return -1; 
    531531 
  • pjproject/trunk/pjmedia/src/pjmedia/stream.c

    r4537 r4613  
    24122412                                   "Frame type, RTP Seq, RTP TS, RTP M, " 
    24132413                                   "JB size, JB burst level, JB prefetch\n"); 
     2414            if (len < 1 || len >= PJ_LOG_MAX_SIZE) 
     2415                len = PJ_LOG_MAX_SIZE-1; 
    24142416            pj_file_write(stream->trace_jb_fd, stream->trace_jb_buf, &len); 
    24152417            pj_file_flush(stream->trace_jb_fd); 
  • pjproject/trunk/pjmedia/src/pjmedia/transport_ice.c

    r4606 r4613  
    350350        break; 
    351351    } 
    352     if (len2 < 1 || len2 >= max_len) 
     352    if (len2 < 1 || len2 >= max_len-len) 
    353353        return -1; 
    354354 
     
    546546                           pj_sockaddr_get_port(&check->rcand->addr) 
    547547                           ); 
    548                 if (len < 1 || len >= RATTR_BUF_LEN) { 
     548                if (len < 1 || len >= RATTR_BUF_LEN - rem_cand.slen) { 
    549549                    pj_assert(!"Not enough buffer to print " 
    550550                               "remote-candidates"); 
  • pjproject/trunk/pjmedia/src/pjmedia/transport_srtp.c

    r4537 r4613  
    10441044    char b64_key[PJ_BASE256_TO_BASE64_LEN(MAX_KEY_LEN)+1]; 
    10451045    int b64_key_len = sizeof(b64_key); 
     1046    int print_len; 
    10461047 
    10471048    if (cs_idx == -1) 
     
    11021103 
    11031104    /* Print the crypto attribute value. */ 
    1104     *buffer_len = pj_ansi_snprintf(buffer, *buffer_len, "%d %s inline:%s", 
     1105    print_len = pj_ansi_snprintf(buffer, *buffer_len, "%d %s inline:%s", 
    11051106                                   tag,  
    11061107                                   crypto_suites[cs_idx].name, 
    11071108                                   b64_key); 
     1109    if (print_len < 1 || print_len >= *buffer_len) 
     1110        return PJ_ETOOSMALL; 
     1111 
     1112    *buffer_len = print_len; 
    11081113 
    11091114    return PJ_SUCCESS; 
  • pjproject/trunk/pjmedia/src/pjmedia/vid_stream.c

    r4537 r4613  
    16511651                                   "Frame type, RTP Seq, RTP TS, RTP M, " 
    16521652                                   "JB size, JB burst level, JB prefetch\n"); 
     1653            if (len < 1 || len >= PJ_LOG_MAX_SIZE) 
     1654                len = PJ_LOG_MAX_SIZE - 1; 
    16531655            pj_file_write(stream->trace_jb_fd, stream->trace_jb_buf, &len); 
    16541656            pj_file_flush(stream->trace_jb_fd); 
  • pjproject/trunk/pjnath/src/pjnath/errno.c

    r3553 r4613  
    134134                                   "Unknown pjnath error %d", 
    135135                                   statcode); 
    136     if (errstr.slen < 0) errstr.slen = 0; 
    137     else if (errstr.slen > (int)bufsize) errstr.slen = bufsize; 
     136    if (errstr.slen < 1 || errstr.slen >= (int)bufsize) 
     137        errstr.slen = bufsize-1; 
    138138 
    139139    return errstr; 
     
    165165    } 
    166166 
    167     if (errstr.slen < 0) errstr.slen = 0; 
    168     else if (errstr.slen > (int)bufsize) errstr.slen = bufsize; 
     167    if (errstr.slen < 1 || errstr.slen >= (int)bufsize) 
     168        errstr.slen = bufsize-1; 
    169169 
    170170    return errstr; 
  • pjproject/trunk/pjnath/src/pjnath/stun_msg.c

    r4537 r4613  
    24522452                                             err_msg1, 
    24532453                                             pj_stun_get_attr_name(attr_type)); 
    2454  
     2454                    if (e.slen < 1 || e.slen >= (int)sizeof(err_msg2)) 
     2455                        e.slen = sizeof(err_msg2) - 1; 
    24552456                    pj_stun_msg_create_response(pool, msg, 
    24562457                                                PJ_STUN_SC_BAD_REQUEST, 
  • pjproject/trunk/pjsip-apps/src/samples/icedemo.c

    r4537 r4613  
    518518        printed = pj_ansi_snprintf(p, maxlen - (p-buffer),  \ 
    519519                                   fmt, arg0, arg1, arg2, arg3, arg4, arg5); \ 
    520         if (printed <= 0) return -PJ_ETOOSMALL; \ 
     520        if (printed <= 0 || printed >= (int)(maxlen - (p-buffer))) \ 
     521            return -PJ_ETOOSMALL; \ 
    521522        p += printed 
    522523 
  • pjproject/trunk/pjsip/src/pjsip-simple/errno.c

    r3553 r4613  
    111111                                   "Unknown pjsip-simple error %d", 
    112112                                   statcode); 
    113  
     113    if (errstr.slen < 1 || errstr.slen >= (pj_ssize_t)bufsize) 
     114        errstr.slen = bufsize - 1; 
    114115    return errstr; 
    115116} 
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_100rel.c

    r4208 r4613  
    345345                                 (int)tsx->method.name.slen, 
    346346                                 tsx->method.name.ptr); 
     347    if (rack.slen < 1 || rack.slen >= (int)sizeof(rack_buf)) { 
     348        return PJ_ETOOSMALL; 
     349    } 
    347350    rack_hdr = pjsip_generic_string_hdr_create(tdata->pool, &RACK, &rack); 
    348351    pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) rack_hdr); 
  • pjproject/trunk/pjsip/src/pjsip/sip_errno.c

    r3553 r4613  
    205205                                   "Unknown pjsip error %d", 
    206206                                   statcode); 
    207  
     207    if (errstr.slen < 1 || errstr.slen >= (pj_ssize_t)bufsize) 
     208        errstr.slen = bufsize - 1; 
    208209    return errstr; 
    209210 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r4592 r4613  
    17501750                               (int)acc->cfg.contact_params.slen, 
    17511751                               acc->cfg.contact_params.ptr); 
    1752         if (len < 1) { 
     1752        if (len < 1 || len >= PJSIP_MAX_URL_SIZE) { 
    17531753            PJ_LOG(1,(THIS_FILE, "URI too long")); 
    17541754            pj_pool_release(pool); 
     
    31023102                                     (int)acc->cfg.contact_params.slen, 
    31033103                                     acc->cfg.contact_params.ptr); 
    3104  
     3104    if (contact->slen < 1 || contact->slen >= (int)PJSIP_MAX_URL_SIZE) 
     3105        return PJ_ETOOSMALL; 
    31053106    return PJ_SUCCESS; 
    31063107} 
     
    32723273                                     (int)acc->cfg.contact_params.slen, 
    32733274                                     acc->cfg.contact_params.ptr); 
     3275    if (contact->slen < 1 || contact->slen >= (int)PJSIP_MAX_URL_SIZE) 
     3276        return PJ_ETOOSMALL; 
    32743277 
    32753278    return PJ_SUCCESS; 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_aud.c

    r4537 r4613  
    17601760            if (param->base.clock_rate != pjsua_var.media_cfg.clock_rate) { 
    17611761                char tmp_buf[128]; 
    1762                 int tmp_buf_len = sizeof(tmp_buf); 
    1763  
    1764                 tmp_buf_len = pj_ansi_snprintf(tmp_buf, sizeof(tmp_buf)-1, 
     1762                int tmp_buf_len; 
     1763 
     1764                tmp_buf_len = pj_ansi_snprintf(tmp_buf, sizeof(tmp_buf), 
    17651765                                               "%s (%dKHz)", 
    17661766                                               rec_info.name, 
    17671767                                               param->base.clock_rate/1000); 
     1768                if (tmp_buf_len < 1 || tmp_buf_len >= (int)sizeof(tmp_buf)) 
     1769                    tmp_buf_len = sizeof(tmp_buf) - 1; 
    17681770                pj_strset(&tmp, tmp_buf, tmp_buf_len); 
    17691771                pjmedia_conf_set_port0_name(pjsua_var.mconf, &tmp); 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_dump.c

    r4537 r4613  
    129129           ); 
    130130 
    131     if (len < 1 || len > end-p) { 
     131    if (len < 1 || len >= end-p) { 
    132132        *p = '\0'; 
    133133        return (unsigned)(p-buf); 
     
    187187           ); 
    188188 
    189     if (len < 1 || len > end-p) { 
     189    if (len < 1 || len >= end-p) { 
    190190        *p = '\0'; 
    191191        return (unsigned)(p-buf); 
     
    202202           pj_math_stat_get_stddev(&stat->rtt) / 1000.0 
    203203           ); 
    204     if (len < 1 || len > end-p) { 
     204    if (len < 1 || len >= end-p) { 
    205205        *p = '\0'; 
    206206        return (unsigned)(p-buf); 
     
    260260                      "%s  #%d %s deactivated\n", 
    261261                      indent, i, media_type_str); 
    262             if (len < 1 || len > end-p) { 
     262            if (len < 1 || len >= end-p) { 
    263263                *p = '\0'; 
    264264                return; 
     
    364364                  dir_str, 
    365365                  rem_addr); 
    366         if (len < 1 || len > end-p) { 
     366        if (len < 1 || len >= end-p) { 
    367367            *p = '\0'; 
    368368            return; 
     
    471471 
    472472#   define VALIDATE_PRINT_BUF() \ 
    473         if (len < 1 || len > end-p) { *p = '\0'; return; } \ 
     473        if (len < 1 || len >= end-p) { *p = '\0'; return; } \ 
    474474        p += len; *p++ = '\n'; *p = '\0' 
    475475 
Note: See TracChangeset for help on using the changeset viewer.