OSDN Git Service

audio: Fix memory leak while creating SDP records
authorAnderson Lizardo <anderson.lizardo@openbossa.org>
Wed, 12 Jun 2013 00:06:40 +0000 (21:06 -0300)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 12 Jun 2013 07:57:43 +0000 (10:57 +0300)
Fix these leaks:

==674== 8 bytes in 1 blocks are definitely lost in loss record 45 of 201
==674==    at 0x402BE68: malloc (in
/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==674==    by 0x80DF653: sdp_list_append (sdp.c:1742)
==674==    by 0x8063974: avrcp_ct_record (avrcp.c:297)
==674==    by 0x8068A6D: avrcp_remote_register (avrcp.c:3149)
==674==    by 0x805F31C: avrcp_remote_server_probe (manager.c:320)
==674==    by 0x80BCB4E: probe_profile (adapter.c:2629)
==674==    by 0x80C5880: btd_profile_foreach (profile.c:639)
==674==    by 0x80C3FD4: adapter_register (adapter.c:5619)
==674==    by 0x80C4A01: read_info_complete (adapter.c:5894)
==674==    by 0x80D489A: request_complete (mgmt.c:221)
==674==    by 0x80D4BA8: received_data (mgmt.c:319)
==674==    by 0x40BF17D: ??? (in
/lib/i386-linux-gnu/libglib-2.0.so.0.3200.3)
==674==
==674== 32 bytes in 1 blocks are definitely lost in loss record 127 of
201
==674==    at 0x402BE68: malloc (in
/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==674==    by 0x80DCE49: sdp_data_alloc_with_length (sdp.c:360)
==674==    by 0x80DD33F: sdp_data_alloc (sdp.c:497)
==674==    by 0x806379D: avrcp_ct_record (avrcp.c:272)
==674==    by 0x8068A6D: avrcp_remote_register (avrcp.c:3149)
==674==    by 0x805F31C: avrcp_remote_server_probe (manager.c:320)
==674==    by 0x80BCB4E: probe_profile (adapter.c:2629)
==674==    by 0x80C5880: btd_profile_foreach (profile.c:639)
==674==    by 0x80C3FD4: adapter_register (adapter.c:5619)
==674==    by 0x80C4A01: read_info_complete (adapter.c:5894)
==674==    by 0x80D489A: request_complete (mgmt.c:221)
==674==    by 0x80D4BA8: received_data (mgmt.c:319)

profiles/audio/avrcp.c

index 715ab8f..e6d0e72 100644 (file)
@@ -245,7 +245,7 @@ static sdp_record_t *avrcp_ct_record(void)
        sdp_profile_desc_t profile[1];
        sdp_list_t *aproto, *aproto1, *proto[2], *proto1[2];
        sdp_record_t *record;
-       sdp_data_t *psm, *version, *features;
+       sdp_data_t *psm[2], *version, *features;
        uint16_t lp = AVCTP_CONTROL_PSM, ap = AVCTP_BROWSING_PSM;
        uint16_t avrcp_ver = 0x0105, avctp_ver = 0x0103;
        uint16_t feat = ( AVRCP_FEATURE_CATEGORY_1 |
@@ -269,8 +269,8 @@ static sdp_record_t *avrcp_ct_record(void)
        /* Protocol Descriptor List */
        sdp_uuid16_create(&l2cap, L2CAP_UUID);
        proto[0] = sdp_list_append(0, &l2cap);
-       psm = sdp_data_alloc(SDP_UINT16, &lp);
-       proto[0] = sdp_list_append(proto[0], psm);
+       psm[0] = sdp_data_alloc(SDP_UINT16, &lp);
+       proto[0] = sdp_list_append(proto[0], psm[0]);
        apseq = sdp_list_append(0, proto[0]);
 
        sdp_uuid16_create(&avctp, AVCTP_UUID);
@@ -285,8 +285,8 @@ static sdp_record_t *avrcp_ct_record(void)
        /* Additional Protocol Descriptor List */
        sdp_uuid16_create(&l2cap, L2CAP_UUID);
        proto1[0] = sdp_list_append(0, &l2cap);
-       psm = sdp_data_alloc(SDP_UINT16, &ap);
-       proto1[0] = sdp_list_append(proto1[0], psm);
+       psm[1] = sdp_data_alloc(SDP_UINT16, &ap);
+       proto1[0] = sdp_list_append(proto1[0], psm[1]);
        apseq1 = sdp_list_append(0, proto1[0]);
 
        sdp_uuid16_create(&avctp, AVCTP_UUID);
@@ -308,13 +308,15 @@ static sdp_record_t *avrcp_ct_record(void)
 
        sdp_set_info_attr(record, "AVRCP CT", 0, 0);
 
-       free(psm);
+       free(psm[0]);
+       free(psm[1]);
        free(version);
        sdp_list_free(proto[0], 0);
        sdp_list_free(proto[1], 0);
        sdp_list_free(apseq, 0);
        sdp_list_free(proto1[0], 0);
        sdp_list_free(proto1[1], 0);
+       sdp_list_free(aproto1, 0);
        sdp_list_free(apseq1, 0);
        sdp_list_free(pfseq, 0);
        sdp_list_free(aproto, 0);