Changeset 5145:c1a3ca765154 in roaraudio for libroar/ctl.c


Ignore:
Timestamp:
10/11/11 13:47:59 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:
  • Fixed invalid pointer aliasing in filter code (pr0)
  • Fixed remote a local buffer overflow in client to message converter code as well as a remote attackable overflow in message to client converter code (pr0)
  • Updated error handling (pr0)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/ctl.c

    r5144 r5145  
    311311 m->data[1] = filter; 
    312312 m->data[2] = cmp; 
    313  *((uint32_t*)&(m->data[3])) = ROAR_HOST2NET32(id); 
     313 m->data[3] = (id & 0xFF000000LU) >> 24; 
     314 m->data[4] = (id & 0x00FF0000LU) >> 16; 
     315 m->data[5] = (id & 0x0000FF00LU) >>  8; 
     316 m->data[6] = (id & 0x000000FFLU) >>  0; 
    314317 
    315318 return 0; 
    316319} 
    317320int roar_ctl_m2f      (struct roar_message * m, unsigned char * filter, unsigned char * cmp, uint32_t * id) { 
     321 register uint32_t idreg; 
    318322 
    319323 if ( m->datalen != 7 ) 
     
    328332 *cmp    = m->data[2]; 
    329333 
    330  *id = ROAR_NET2HOST32(*((uint32_t*)&(m->data[3]))); 
     334 idreg   = ((uint32_t)(unsigned char)m->data[3]) << 24; 
     335 idreg  |= ((uint32_t)(unsigned char)m->data[4]) << 16; 
     336 idreg  |= ((uint32_t)(unsigned char)m->data[5]) <<  8; 
     337 idreg  |= ((uint32_t)(unsigned char)m->data[6]) <<  0; 
     338 *id     = idreg; 
    331339 
    332340 return 0; 
     
    345353   break; 
    346354  default: 
     355    roar_err_set(ROAR_ERROR_NOTSUP); 
    347356    return -1; 
    348357 } 
     
    352361 int i; 
    353362 
    354  if ( len > LIBROAR_BUFFER_MSGDATA ) 
    355   return -1; 
     363 if ( len > LIBROAR_BUFFER_MSGDATA ) { 
     364  roar_err_set(ROAR_ERROR_MSGSIZE); 
     365  return -1; 
     366 } 
    356367 
    357368 m->datalen = len; 
     
    365376 int i; 
    366377 
    367  if ( m->datalen > len ) 
    368   return -1; 
     378 if ( m->datalen > len ) { 
     379  roar_err_set(ROAR_ERROR_MSGSIZE); 
     380  return -1; 
     381 } 
    369382 
    370383 for (i = 0; i < m->datalen; i++) 
     
    380393 int max_len; 
    381394 uint32_t pid; 
    382  size_t len_rest; 
     395 signed long int len_rest; 
     396 size_t nnode_len; 
    383397 
    384398 if ( c == NULL ) 
     
    429443 cur += 4; 
    430444 
    431  len_rest = sizeof(m->data) - cur; 
    432  if ( roar_nnode_to_blob(&(c->nnode), &(m->data[cur]), &len_rest) == 0 ) { 
    433   cur += len_rest; 
     445 len_rest = (long int)sizeof(m->data) - (long int)cur; 
     446 if ( len_rest < 0 ) { 
     447  roar_panic(ROAR_FATAL_ERROR_MEMORY_CORRUPTION, NULL); 
     448 } 
     449 
     450 nnode_len = len_rest; 
     451 if ( roar_nnode_to_blob(&(c->nnode), &(m->data[cur]), &nnode_len) == 0 ) { 
     452  cur += nnode_len; 
    434453 } 
    435454 
     
    445464 size_t len; 
    446465 
    447  if ( m == NULL || c == NULL ) 
    448   return -1; 
    449  
    450  if ( m->datalen == 0 ) 
    451   return -1; 
     466 if ( m == NULL || c == NULL ) { 
     467  roar_err_set(ROAR_ERROR_FAULT); 
     468  return -1; 
     469 } 
     470 
     471 if ( m->datalen == 0 ) { 
     472  roar_err_set(ROAR_ERROR_MSGSIZE); 
     473  return -1; 
     474 } 
    452475 
    453476 ROAR_DBG("roar_ctl_m2c(*): got data!, len = %i", m->datalen); 
     
    455478 if ( m->data[0] != 0 ) { 
    456479  ROAR_DBG("roar_ctl_m2c(*): wrong version!"); 
    457   return -1; 
    458  } 
    459  
    460  if ( m->datalen < 3 ) 
    461   return -1; 
     480  roar_err_set(ROAR_ERROR_NSVERSION); 
     481  return -1; 
     482 } 
     483 
     484 if ( m->datalen < 3 ) { 
     485  roar_err_set(ROAR_ERROR_MSGSIZE); 
     486  return -1; 
     487 } 
    462488 
    463489 ROAR_DBG("roar_ctl_m2c(*): have usable data!"); 
     
    467493 for (i = 0; i < ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT; i++) 
    468494  c->streams[i] = -1; 
     495 
     496 if ( m->data[2] < 0 || m->data[2] > ROAR_CLIENTS_MAX_STREAMS_PER_CLIENT ) { 
     497  roar_err_set(ROAR_ERROR_TOOMANYARGS); 
     498  return -1; 
     499 } 
    469500 
    470501 for (i = 0; i < m->data[2]; i++) 
     
    555586 } 
    556587 
     588 roar_err_set(ROAR_ERROR_NOENT); 
    557589 return -1; 
    558590} 
     
    592624 } 
    593625 
     626 roar_err_set(ROAR_ERROR_NOENT); 
    594627 return -1; 
    595628} 
     
    632665   return _libroar_ot[i].ot; 
    633666 
     667 roar_err_set(ROAR_ERROR_NOENT); 
    634668 return -1; 
    635669} 
     
    642676   return _libroar_ot[i].name; 
    643677 
     678 roar_err_set(ROAR_ERROR_NOENT); 
    644679 return NULL; 
    645680} 
     
    650685 uint_least32_t s; 
    651686 
    652  if ( dst == NULL || src == NULL || dstchans < 0 || srcchans < 0 ) 
    653   return -1; 
     687 if ( dst == NULL || src == NULL ) { 
     688  roar_err_set(ROAR_ERROR_FAULT); 
     689  return -1; 
     690 } 
     691 
     692 if ( dstchans < 0 || srcchans < 0 ) { 
     693  roar_err_set(ROAR_ERROR_INVAL); 
     694  return -1; 
     695 } 
    654696 
    655697 if ( dstchans == srcchans ) { 
     
    709751       break; 
    710752      default: 
     753        roar_err_set(ROAR_ERROR_NOTSUP); 
    711754        return -1; 
    712755       break; 
     
    741784       break; 
    742785      default: 
     786        roar_err_set(ROAR_ERROR_NOTSUP); 
    743787        return -1; 
    744788       break; 
     
    772816       break; 
    773817      default: 
     818        roar_err_set(ROAR_ERROR_NOTSUP); 
    774819        return -1; 
    775820       break; 
     
    802847       break; 
    803848      default: 
     849        roar_err_set(ROAR_ERROR_NOTSUP); 
    804850        return -1; 
    805851       break; 
     
    831877       break; 
    832878      default: 
     879        roar_err_set(ROAR_ERROR_NOTSUP); 
    833880        return -1; 
    834881       break; 
     
    836883    break; 
    837884   default: 
     885     roar_err_set(ROAR_ERROR_NOTSUP); 
    838886     return -1; 
    839887    break; 
Note: See TracChangeset for help on using the changeset viewer.