summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAki Niemi <aki.niemi@nokia.com>2009-08-23 23:16:46 +0300
committerAki Niemi <aki.niemi@nokia.com>2009-08-23 23:16:46 +0300
commit5562438c5c37ef82a8691f2f0d78874e08f5e417 (patch)
treeb73a0478efca56067c03444f13b1006c295f400f /drivers
parent197cefbba552845955b7cde4c9646fc7940b568e (diff)
downloadofono-5562438c5c37ef82a8691f2f0d78874e08f5e417.tar.bz2
Fix memory leak in ISI phonebook driver
Diffstat (limited to 'drivers')
-rw-r--r--drivers/isimodem/isiphonebook.c70
1 files changed, 39 insertions, 31 deletions
diff --git a/drivers/isimodem/isiphonebook.c b/drivers/isimodem/isiphonebook.c
index c8138279..7c544741 100644
--- a/drivers/isimodem/isiphonebook.c
+++ b/drivers/isimodem/isiphonebook.c
@@ -88,7 +88,10 @@ static char *ucs2_to_utf8(const unsigned char *str, long len)
static int decode_read_response(const unsigned char *msg, size_t len,
struct ofono_phonebook *pb)
{
- unsigned int i, p;
+ int retval = -1;
+
+ unsigned int i;
+ unsigned int p;
char *name = NULL;
char *number = NULL;
@@ -103,17 +106,15 @@ static int decode_read_response(const unsigned char *msg, size_t len,
unsigned int servicetype;
unsigned int num_subblocks;
- dump_msg(msg, len);
-
if (len < 3)
- goto error;
+ goto cleanup;
messageid = msg[0];
servicetype = msg[1];
num_subblocks = msg[2];
if (messageid != SIM_PB_RESP_SIM_PB_READ || servicetype != SIM_PB_READ)
- goto error;
+ goto cleanup;
p = 3;
for (i=0; i < num_subblocks; i++) {
@@ -121,10 +122,10 @@ static int decode_read_response(const unsigned char *msg, size_t len,
unsigned int subblock_len;
if (p + 4 > len)
- goto error;
+ goto cleanup;
- subblock_type = (msg[p] << 8) + msg[p+1];
- subblock_len = (msg[p+2] << 8) + msg[p+3];
+ subblock_type = (msg[p] << 8) + msg[p + 1];
+ subblock_len = (msg[p + 2] << 8) + msg[p + 3];
switch (subblock_type) {
@@ -133,14 +134,14 @@ static int decode_read_response(const unsigned char *msg, size_t len,
unsigned int numberlength;
if (p + 8 > len)
- goto error;
+ goto cleanup;
location = (msg[p + 4] << 8) + msg[p + 5];
namelength = msg[p + 6];
numberlength = msg[p + 7];
if (p + 8 + namelength * 2 + numberlength * 2 > len)
- goto error;
+ goto cleanup;
name = ucs2_to_utf8(msg + p + 8, namelength * 2);
number = ucs2_to_utf8(msg + p + 8 + namelength * 2,
@@ -156,14 +157,14 @@ static int decode_read_response(const unsigned char *msg, size_t len,
unsigned int snefiller;
if (p + 8 > len)
- goto error;
+ goto cleanup;
locsne = (msg[p + 4] << 8) + msg[p + 5];
snelength = msg[p + 6];
snefiller = msg[p + 7];
if (p + 8 + snelength * 2 > len)
- goto error;
+ goto cleanup;
adn = ucs2_to_utf8(msg + p + 8, snelength * 2);
DBG("SNE subblock: name %s", adn);
@@ -176,14 +177,14 @@ static int decode_read_response(const unsigned char *msg, size_t len,
unsigned int anrfiller;
if (p + 8 > len)
- goto error;
+ goto cleanup;
locanr = (msg[p + 4] << 8) + msg[p + 5];
anrlength = msg[p + 6];
anrfiller = msg[p + 7];
if (p + 8 + anrlength * 2 > len)
- goto error;
+ goto cleanup;
snr = ucs2_to_utf8(msg + p + 8, anrlength * 2);
DBG("ANR subblock: number %s", snr);
@@ -196,14 +197,14 @@ static int decode_read_response(const unsigned char *msg, size_t len,
unsigned int emailfiller;
if (p + 8 > len)
- goto error;
+ goto cleanup;
locemail = (msg[p + 4] << 8) + msg[p + 5];
emaillength = msg[p + 6];
emailfiller = msg[p + 7];
if (p + 8 + emaillength * 2 > len)
- goto error;
+ goto cleanup;
email = ucs2_to_utf8(msg + p + 8, emaillength * 2);
DBG("EMAIL subblock: email %s", email);
@@ -212,7 +213,7 @@ static int decode_read_response(const unsigned char *msg, size_t len,
case SIM_PB_STATUS:
if (p + 5 > len)
- goto error;
+ goto cleanup;
status = msg[p + 4];
DBG("STATUS subblock: status %i", status);
@@ -226,17 +227,22 @@ static int decode_read_response(const unsigned char *msg, size_t len,
p += subblock_len;
}
+
if (status == SIM_SERV_OK) {
+
ofono_phonebook_entry(pb, -1, number, -1, name, -1, NULL,
snr, -1, adn, email, NULL, NULL);
- return location;
- } else {
- return -1;
+ retval = location;
}
-error:
- DBG("Malformed read response");
- return -1;
+cleanup:
+ g_free(name);
+ g_free(number);
+ g_free(adn);
+ g_free(snr);
+ g_free(email);
+
+ return retval;
}
static void read_next_entry(GIsiClient *client, int location, GIsiResponseFunc read_cb, struct isi_cb_data *cbd)
@@ -277,7 +283,6 @@ error:
cb(&error, cbd->data);
g_free(cbd);
}
-
}
static bool read_resp_cb(GIsiClient *client, const void *restrict data,
@@ -300,16 +305,15 @@ static bool read_resp_cb(GIsiClient *client, const void *restrict data,
}
{
- DECLARE_SUCCESS(e);
- cb(&e, cbd->data);
+ DECLARE_SUCCESS(error);
+ cb(&error, cbd->data);
+ goto out;
}
- goto out;
-
error:
{
- DECLARE_FAILURE(e);
- cb(&e, cbd->data);
+ DECLARE_FAILURE(error);
+ cb(&error, cbd->data);
}
out:
@@ -380,9 +384,13 @@ static int isi_phonebook_probe(struct ofono_phonebook *pb)
if (!data)
return -ENOMEM;
+ DBG("idx=%p", idx);
+
data->client = g_isi_client_create(idx, PN_SIM);
- if (!data->client)
+ if (!data->client) {
+ g_free(data);
return -ENOMEM;
+ }
ofono_phonebook_set_data(pb, data);