Changeset 1085 for trunk


Ignore:
Timestamp:
12/19/08 20:45:15 (3 years ago)
Author:
alonbl
Message:

Fix memory leak in OpenCT/src/ifd/ifd-cyberjack.c

By Ludovic Rousseau with some modifications.

http://www.opensc-project.org/pipermail/opensc-devel/2008-December/011502.html

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ifd/ifd-cyberjack.c

    r1008 r1085  
    368368    ifd_device_t * const dev = reader->device; 
    369369        int ret; 
    370         struct cyberjack_t1_state *state; 
     370        int result = -1; 
     371        struct cyberjack_t1_state *state = NULL; 
    371372   
    372373        cyberjack_ifd_debug(1, 40, "called (dev = 0x%x).", reader->device); 
     
    380381        state = calloc( 1, sizeof(struct cyberjack_t1_state) ); 
    381382        if( state == NULL ) 
    382                 return -1; 
     383                goto cleanup; 
    383384                 
    384385        state->dev = dev; 
     
    388389        { 
    389390                cyberjack_ct_error(80, "cyberjack: failed to activate 1"); 
    390                 return -1; 
     391                goto cleanup; 
    391392        } 
    392393         
     
    394395        if( (ret=cyberjack_recv_t1( state, 0xe2, read_buffer ))!=4 || memcmp( read_buffer, "\x2e\xe0\x00\xce", 4 )!=0 )  { 
    395396                cyberjack_ct_error(80, "cyberjack: failed to activate 2: no cookie"); 
    396                 return -1; 
     397                goto cleanup; 
    397398        } 
    398399 
     
    400401        if( cyberjack_send_t1( state, "\x12\x00\x04" "\x20\x11\x00\x00", 7 ) != 7 )  { 
    401402                cyberjack_ct_error(80, "cyberjack: failed to activate 5");               
    402                 return -1; 
     403                goto cleanup; 
    403404        } 
    404405        ret = cyberjack_recv_t1( state, 0x12, read_buffer ); 
    405406        if( ret < 0 )  { 
    406407                cyberjack_ct_error(80, "cyberjack: failed to activate 5.1");             
    407                 return -1; 
     408                goto cleanup; 
    408409        } 
    409410        cyberjack_ifd_debug(1, 80+ret*3, "cyberjack: t1 response is : %s",  
     
    411412        if( ret < 6 )  { 
    412413                cyberjack_ifd_debug(1, 80, "cyberjack: response is short 6.1"); 
    413                 return -1; 
     414                goto cleanup; 
    414415        } 
    415416        if( ret != 6 || read_buffer[3]!=0x90 || read_buffer[4]!=0 ) 
     
    419420                // could neever recover from this 
    420421                cyberjack_ct_error(80, "cyberjack: failed to activate: failed to reset the reader");             
    421                 return -1; 
     422                goto cleanup; 
    422423        } 
    423424 
     
    432433        if( ret < 3 || memcmp(read_buffer, "\x2e\xe0\x00", 3 )!=0 )  { 
    433434                cyberjack_ct_error(80, "cyberjack: failed to activate 7.1");             
    434                 return -1; 
     435                goto cleanup; 
    435436        } 
    436437         
    437438        reader->driver_data = state; 
    438          
    439         cyberjack_init_proto( reader, state ); 
    440          
    441         cyberjack_ifd_debug(1, 80, "cyberjack: activated OK, ns=%d", state->ns); 
    442          
    443         return 0; 
     439        state = NULL; 
     440         
     441        cyberjack_init_proto( reader, (struct cyberjack_t1_state *)reader->driver_data ); 
     442         
     443        cyberjack_ifd_debug(1, 80, "cyberjack: activated OK, ns=%d", 
     444                ((struct cyberjack_t1_state *)reader->driver_data)->ns); 
     445         
     446        result = 0; 
     447 
     448cleanup: 
     449        if (state != NULL) { 
     450                free(state); 
     451        } 
     452 
     453        return result; 
    444454} 
    445455 
Note: See TracChangeset for help on using the changeset viewer.