ndef: Fixed potential crash in ndef record memory free
authorRavi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Mon, 30 Jan 2012 10:56:13 +0000 (12:56 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 30 Jan 2012 23:03:33 +0000 (00:03 +0100)
src/ndef.c

index b9df27b..898487b 100644 (file)
@@ -457,42 +457,43 @@ static void free_ndef_record(struct near_ndef_record *record)
 
        g_free(record->path);
 
-       switch (record->header->rec_type) {
-       case RECORD_TYPE_WKT_SIZE:
-       case RECORD_TYPE_WKT_TYPE:
-       case RECORD_TYPE_WKT_ACTION:
-       case RECORD_TYPE_WKT_HANDOVER_REQUEST:
-       case RECORD_TYPE_WKT_HANDOVER_SELECT:
-       case RECORD_TYPE_WKT_HANDOVER_CARRIER:
-       case RECORD_TYPE_WKT_ALTERNATIVE_CARRIER:
-       case RECORD_TYPE_WKT_COLLISION_RESOLUTION:
-       case RECORD_TYPE_WKT_ERROR:
-       case RECORD_TYPE_UNKNOWN:
-       case RECORD_TYPE_ERROR:
-               break;
+       if (record->header != NULL) {
 
-       case RECORD_TYPE_WKT_TEXT:
-               free_text_record(record->text);
-               break;
+               switch (record->header->rec_type) {
+               case RECORD_TYPE_WKT_SIZE:
+               case RECORD_TYPE_WKT_TYPE:
+               case RECORD_TYPE_WKT_ACTION:
+               case RECORD_TYPE_WKT_HANDOVER_REQUEST:
+               case RECORD_TYPE_WKT_HANDOVER_SELECT:
+               case RECORD_TYPE_WKT_HANDOVER_CARRIER:
+               case RECORD_TYPE_WKT_ALTERNATIVE_CARRIER:
+               case RECORD_TYPE_WKT_COLLISION_RESOLUTION:
+               case RECORD_TYPE_WKT_ERROR:
+               case RECORD_TYPE_UNKNOWN:
+               case RECORD_TYPE_ERROR:
+                       break;
 
-       case RECORD_TYPE_WKT_URI:
-               free_uri_record(record->uri);
-               break;
+               case RECORD_TYPE_WKT_TEXT:
+                       free_text_record(record->text);
+                       break;
 
-       case RECORD_TYPE_WKT_SMART_POSTER:
-               free_sp_record(record->sp);
-               break;
+               case RECORD_TYPE_WKT_URI:
+                       free_uri_record(record->uri);
+                       break;
 
-       case RECORD_TYPE_MIME_TYPE:
-               free_mime_record(record->mime);
-       }
+               case RECORD_TYPE_WKT_SMART_POSTER:
+                       free_sp_record(record->sp);
+                       break;
+
+               case RECORD_TYPE_MIME_TYPE:
+                       free_mime_record(record->mime);
+               }
 
-       if (record->header != NULL) {
                g_free(record->header->il_field);
                g_free(record->header->type_name);
-               g_free(record->header);
        }
 
+       g_free(record->header);
        g_free(record);
        record = NULL;
 }