Changeset 4790:c1073581d7c2 in roaraudio for libroar/auth.c


Ignore:
Timestamp:
03/11/11 11:25:22 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support for long (> sizeof(mes.data)-4) cookies, fixed memory use-after-free bug in roard

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/auth.c

    r4788 r4790  
    133133 char                  * header = mes.data; 
    134134 int                     ret; 
     135 char                  * data = NULL; 
    135136 
    136137 memset(&mes, 0, sizeof(struct roar_message)); // make valgrind happy! 
     
    139140 mes.datalen = 4 + authmes->len; 
    140141 
    141  if ( mes.datalen > sizeof(mes.data) ) 
    142   return -1; 
     142 if ( mes.datalen > sizeof(mes.data) ) { 
     143  data = malloc(mes.datalen); 
     144  if ( data == NULL ) 
     145   return -1; 
     146 
     147  header   = data; 
     148 } 
    143149 
    144150 header[0] = authmes->type; 
     
    148154 
    149155 if ( authmes->len ) { 
    150   memcpy(mes.data + 4, authmes->data, authmes->len); 
    151  } 
    152  
    153  if ( (ret = roar_req(con, &mes, NULL)) == -1 ) { 
     156  if ( data == NULL ) { 
     157   memcpy(mes.data + 4, authmes->data, authmes->len); 
     158  } else { 
     159   memcpy(data + 4, authmes->data, authmes->len); 
     160  } 
     161 } 
     162 
     163 if ( (ret = roar_req(con, &mes, &data)) == -1 ) { 
    154164  authmes->type = -1; 
    155165  return -1; 
    156166 } 
    157167 
     168 if ( data != NULL ) { 
     169  header = data; 
     170 } else { 
     171  header = mes.data; 
     172 } 
     173 
    158174 if ( mes.cmd != ROAR_CMD_OK ) { 
     175  if ( data != NULL ) { 
     176   // we currently do not support long error frames. 
     177   free(data); 
     178   return -1; 
     179  } 
     180 
    159181  ret = -1; 
    160182  if ( roar_err_parsemsg(&mes, &error_frame) == -1 ) { 
     
    177199 authmes->reserved.c[0] = header[2]; 
    178200 authmes->reserved.c[1] = header[3]; 
     201 
     202 if ( data != NULL ) 
     203  free(data); 
    179204 
    180205 return ret; 
Note: See TracChangeset for help on using the changeset viewer.