Re: fixing Kannel leaks

Aarno Syvänen <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
You have a point. Smsc is lapi driver, not heavy production code it.

So again, without dlrs.

Aarno



On 26.11.2003, at 16:24, Alexander Malysh wrote:

> On Wednesday 26 November 2003 15:45, Aarno Syvänen wrote:
>> A new try :(
>
> try again ;) see bellow...
> Please just skip dlr.c because dlr-core/dlr-mysql/dlr-internal were 
> tested for
> memleaks with valgrind ...
>
> RCS file: /home/cvs/gateway/gw/dlr.c,v
> retrieving revision 1.43
> diff -u -B -b -r1.43 dlr.c
> --- gw/dlr.c	15 Nov 2003 13:14:23 -0000	1.43
> +++ gw/dlr.c	26 Nov 2003 14:19:40 -0000
> @@ -373,11 +373,13 @@
>      }
>
>      /* check if we have handler registered */
> -    if (handles == NULL || handles->dlr_get == NULL)
> +    if (handles == NULL || handles->dlr_get == NULL) {
>          return NULL;
> +    }
>
>      debug("dlr.dlr", 0, "DLR[%s]: Looking for DLR smsc=%s, ts=%s, 
> dst=%s,
> type=%d",
> -                                 dlr_type(), octstr_get_cstr(smsc),
> octstr_get_cstr(ts), octstr_get_cstr(dst), typ);
> +          dlr_type(), octstr_get_cstr(smsc), octstr_get_cstr(ts),
> +          octstr_get_cstr(dst), typ);
>
>      dlr = handles->dlr_get(smsc, ts, dst);
>      if (dlr == NULL)  {
> @@ -392,7 +394,7 @@
>          msg->sms.sms_type = report;
>          msg->sms.service = octstr_duplicate(dlr->service);
>          msg->sms.dlr_mask = typ;
> -        msg->sms.smsc_id = octstr_duplicate(dlr->smsc);
> +        msg->sms.smsc_id = dlr->smsc;
>
> that should not be cnahged; otherwise smsc Octstr will be freed 
> twice...
>
>          msg->sms.receiver = octstr_duplicate(dlr->destination);
>          msg->sms.sender = octstr_duplicate(dlr->source);
>          /* if dlr_url was present, recode it here again */
>
> -- 
> Best regards / Mit besten Grüßen aus Düsseldorf
>
> Dipl.-Ing.
> Alexander Malysh
> ___________________________________________
>
> Centrium GmbH
> Vogelsanger Weg 80
> 40470 Düsseldorf
>
> Fon: +49 (0211) 74 84 51 80
> Fax: +49 (0211) 277 49 109
>
> email: [email protected]
> web: www.centrium.de
> msn: [email protected]
> icq: 98063111
> ___________________________________________
>
> Please avoid sending me Word, Excel or PowerPoint attachments.
> See http://www.fsf.org/philosophy/no-word-attachments.html
>
>
cvs.diff (application/octet-stream, 14.7 KB)
Index: gw/bb_store.c
===================================================================
RCS file: /home/cvs/gateway/gw/bb_store.c,v
retrieving revision 1.24
diff -u -B -b -r1.24 bb_store.c
--- gw/bb_store.c	15 Nov 2003 13:14:23 -0000	1.24
+++ gw/bb_store.c	1 Dec 2003 09:50:07 -0000
@@ -448,6 +448,7 @@
 	if (msg_type(msg) == sms) {
 	    if (msg->sms.sms_type == report) {
 		octstr_destroy(pack);
+                msg_destroy(msg);
 		continue;
 	    }
 	    key = octstr_format("%d-%d", msg->sms.time, msg->sms.id);
Index: gw/msg.c
===================================================================
RCS file: /home/cvs/gateway/gw/msg.c,v
retrieving revision 1.30
diff -u -B -b -r1.30 msg.c
--- gw/msg.c	15 Nov 2003 13:14:23 -0000	1.30
+++ gw/msg.c	1 Dec 2003 09:50:07 -0000
@@ -88,11 +88,12 @@
  * Implementations of the exported functions.
  */
 
-Msg *msg_create(enum msg_type type)
+Msg *msg_create_real(enum msg_type type, const char *file, long line,
+                     const char *func)
 {
     Msg *msg;
 
-    msg = gw_malloc(sizeof(Msg));
+    msg = gw_malloc_trace(sizeof(Msg), file, line, func);
 
     msg->type = type;
 #define INTEGER(name) p->name = MSG_PARAM_UNDEFINED;
@@ -185,13 +186,13 @@
 }
 
 
-Msg *msg_unpack(Octstr *os)
+Msg *msg_unpack_real(Octstr *os, const char *file, long line, const char *func)
 {
     Msg *msg;
     int off;
     long i;
 
-    msg = msg_create(0);
+    msg = msg_create_real(0, file, line, func);
     if (msg == NULL)
         goto error;
 
@@ -219,6 +220,7 @@
 
 error:
     error(0, "Msg packet was invalid.");
+    msg_destroy(msg);
     return NULL;
 }
 
Index: gw/msg.h
===================================================================
RCS file: /home/cvs/gateway/gw/msg.h,v
retrieving revision 1.17
diff -u -B -b -r1.17 msg.h
--- gw/msg.h	15 Nov 2003 13:14:23 -0000	1.17
+++ gw/msg.h	1 Dec 2003 09:50:07 -0000
@@ -117,8 +117,10 @@
 /*
  * Create a new, empty Msg object. Panics if fails.
  */
-Msg *msg_create(enum msg_type type);
-
+Msg *msg_create_real(enum msg_type type, const char *file, long line,
+                     const char *func);
+#define msg_create(type) \
+    gw_claim_area(msg_create_real((type), __FILE__, __LINE__, __func__))
 
 /*
  * Create a new Msg object that is a copy of an existing one.
@@ -163,6 +165,9 @@
  * Unpack an Msg from an Octstr. Return NULL for failure, otherwise a pointer
  * to the Msg.
  */
-Msg *msg_unpack(Octstr *os);
+
+Msg *msg_unpack_real(Octstr *os, const char *file, long line, const char *func);
+#define msg_unpack(os) \
+    gw_claim_area(msg_unpack_real((os), __FILE__, __LINE__, __func__))
 
 #endif
Index: gw/wap-appl.c
===================================================================
RCS file: /home/cvs/gateway/gw/wap-appl.c,v
retrieving revision 1.100
diff -u -B -b -r1.100 wap-appl.c
--- gw/wap-appl.c	15 Nov 2003 13:14:23 -0000	1.100
+++ gw/wap-appl.c	1 Dec 2003 09:50:07 -0000
@@ -1221,6 +1221,8 @@
          * POST requests for the HTTP server.
          * Mainly this is used for multipart/form-data transmissions,
          * including MMS on-the-fly message decoding.
+         * When we are doing mms, the phone POSTs contents and acknowled-
+         * gements. In this case, we dont do not deconvert anything.
          */
         if (octstr_str_compare(method, "POST") == 0 && request_body && 
             octstr_len(request_body)) {
@@ -1235,6 +1237,8 @@
                 http_header_mark_transformation(actual_headers, content.body, 
                                                 content.type);
             request_body = content.body;
+            octstr_destroy(content.type);
+            octstr_destroy(content.charset);
         }
 
         /* struct that is used for the HTTP response identifier */
Index: gw/wap_push_ppg.c
===================================================================
RCS file: /home/cvs/gateway/gw/wap_push_ppg.c,v
retrieving revision 1.63
diff -u -B -b -r1.63 wap_push_ppg.c
--- gw/wap_push_ppg.c	20 Nov 2003 13:14:32 -0000	1.63
+++ gw/wap_push_ppg.c	1 Dec 2003 09:50:08 -0000
@@ -1730,6 +1730,7 @@
  * chapter 6.1.1, states that we MUST reject a push having an erroneous PAP
  * push message element. So we must validate it even when we do not compile
  * it.
+ * If message content was not si or sl, we pass it without modifications.
  * We do not do any (formally optional, but phones may disagree) header 
  * conversions to the binary format here, these are responsibility of our OTA 
  * module (gw/wap_push_ota.c). 
@@ -1737,7 +1738,7 @@
  *
  * Return 
  *    a) message, either transformed or not (if there is no-transform cache 
- *       directive or wml code is erroneous) 
+ *       directive, wml code is erroneous or content was not si or sl.) 
  *    b) The transformed gw address. Use here global-sender, when the bearer
  *       is SMS (some SMS centers would require this).
  *    c) the transformed message content type
@@ -1785,8 +1786,7 @@
     if (content.body == NULL)
         goto no_transform;
 
-    content.type = http_header_find_first(push_headers, 
-        "Content-Transfer-Encoding");
+    content.type = http_header_find_first(push_headers, "Content-Transfer-Encoding");
     if (content.type) {
 	    octstr_strip_blanks(content.type);
 	    debug("wap.push.ppg", 0, "PPG: Content-Transfer-Encoding is \"%s\"",
@@ -1801,8 +1801,8 @@
 	    }
     }
 
-    http_header_get_content_type(push_headers, &content.type,
-                                 &content.charset);   
+    octstr_destroy(content.type);
+    http_header_get_content_type(push_headers, &content.type, &content.charset);   
     message_deliverable = pap_convert_content(&content);
 
     if (content.type == NULL)
@@ -1823,6 +1823,7 @@
 
 herror:
     warning(0, "PPG: transform_message: no push headers, cannot accept");
+    octstr_destroy(content.type);
     return 0;
 
 error:
@@ -1834,8 +1835,6 @@
 
 no_transform:
     warning(0, "PPG: transform_message: push content non transformable");
-    octstr_destroy(content.type);
-    octstr_destroy(content.charset);
     return 1;
 }
 
@@ -3314,10 +3313,12 @@
     if ((masklen = octstr_parse_long(&dlr_mask, dlrmaskos, 0, 10)) != -1 &&
              masklen == octstr_len(dlrmaskos) &&
              dlr_mask >= -1 && dlr_mask <= 31) {
+         octstr_destroy(dlrmaskos);
          return dlr_mask;
     }
 
     warning(0, "unparsable dlr mask, rejected");
+    octstr_destroy(dlrmaskos);
     return 0;
 }
 
@@ -3332,12 +3333,11 @@
 
 static Octstr *set_smsbox_id(List *headers, Octstr *username, int trusted_pi)
 {
-    Octstr *smsboxidos;
     Octstr *smsbox_id = NULL;
 
-    smsboxidos = http_header_value(headers, octstr_imm("X-Kannel-Smsbox-Id"));
-    if (smsboxidos != NULL) {
-        return octstr_duplicate(smsboxidos);
+    smsbox_id = http_header_value(headers, octstr_imm("X-Kannel-Smsbox-Id"));
+    if (smsbox_id != NULL) {
+        return smsbox_id;
     }
 
     if (!trusted_pi)
Index: gwlib/http.c
===================================================================
RCS file: /home/cvs/gateway/gwlib/http.c,v
retrieving revision 1.212
diff -u -B -b -r1.212 http.c
--- gwlib/http.c	26 Nov 2003 17:00:37 -0000	1.212
+++ gwlib/http.c	1 Dec 2003 09:50:08 -0000
@@ -2702,7 +2702,8 @@
 }
 
 
-Octstr *http_header_find_first(List *headers, char *name)
+Octstr *http_header_find_first_real(List *headers, char *name, const char *file, long line,
+                                    const char *func)
 {
     long i, name_len;
     Octstr *h, *value;
@@ -2716,7 +2717,8 @@
     for (i = 0; i < list_len(headers); ++i) {
         h = list_get(headers, i);
         if (header_is_called(h, name)) {
-            value = octstr_copy(h, name_len + 1, octstr_len(h));
+            value = octstr_copy_real(h, name_len + 1, octstr_len(h),
+                                     file, line, func);
 	    octstr_strip_blanks(value);
 	    return value;
 	}
Index: gwlib/http.h
===================================================================
RCS file: /home/cvs/gateway/gwlib/http.h,v
retrieving revision 1.60
diff -u -B -b -r1.60 http.h
--- gwlib/http.h	15 Nov 2003 13:14:23 -0000	1.60
+++ gwlib/http.h	1 Dec 2003 09:50:09 -0000
@@ -539,7 +539,10 @@
  * as a new Octet string, which the caller must free. Return NULL for
  * not found.
  */
-Octstr *http_header_find_first(List *headers, char *name);
+Octstr *http_header_find_first_real(List *headers, char *name, 
+                                    const char *file, long line, const char *func);
+#define http_header_find_first(headers, name) \
+    gw_claim_area(http_header_find_first_real((headers), (name), __FILE__, __LINE__, __func__))
 List *http_header_find_all(List *headers, char *name);
 
 
Index: gwlib/octstr.c
===================================================================
RCS file: /home/cvs/gateway/gwlib/octstr.c,v
retrieving revision 1.153
diff -u -B -b -r1.153 octstr.c
--- gwlib/octstr.c	15 Nov 2003 13:14:23 -0000	1.153
+++ gwlib/octstr.c	1 Dec 2003 09:50:09 -0000
@@ -325,7 +325,8 @@
 }
 
 
-Octstr *octstr_copy_real(Octstr *ostr, long from, long len)
+Octstr *octstr_copy_real(Octstr *ostr, long from, long len, const char *file, long line,
+                         const char *func)
 {
     seems_valid(ostr);
     gw_assert(from >= 0);
@@ -337,7 +338,8 @@
     if (len > ostr->len - from)
         len = ostr->len - from;
 
-    return octstr_create_from_data(ostr->data + from, len);
+    return octstr_create_from_data_trace(ostr->data + from, len, file,
+                                         line, func);
 }
 
 
Index: gwlib/octstr.h
===================================================================
RCS file: /home/cvs/gateway/gwlib/octstr.h,v
retrieving revision 1.80
diff -u -B -b -r1.80 octstr.h
--- gwlib/octstr.h	15 Nov 2003 13:14:23 -0000	1.80
+++ gwlib/octstr.h	1 Dec 2003 09:50:09 -0000
@@ -173,9 +173,10 @@
  * octet string is created. If `from+len' is after the end of `ostr', 
  * `len' is reduced appropriately.
  */
-Octstr *octstr_copy_real(Octstr *ostr, long from, long len);
+Octstr *octstr_copy_real(Octstr *ostr, long from, long len, const char *file,
+                         long line, const char *func);
 #define octstr_copy(ostr, from, len) \
-    gw_claim_area(octstr_copy_real((ostr), (from), (len)))
+    gw_claim_area(octstr_copy_real((ostr), (from), (len), __FILE__, __LINE__, __func__))
 
 
 /*
Index: wap/wap.c
===================================================================
RCS file: /home/cvs/gateway/wap/wap.c,v
retrieving revision 1.2
diff -u -B -b -r1.2 wap.c
--- wap/wap.c	15 Nov 2003 13:14:23 -0000	1.2
+++ wap/wap.c	1 Dec 2003 09:50:09 -0000
@@ -76,14 +76,20 @@
     }
 
     /* XXX Assumption does not hold for client side */
-    if (dgram->u.T_DUnitdata_Ind.addr_tuple->local->port
-        == CONNECTIONLESS_PORT) {
+    if (dgram->u.T_DUnitdata_Ind.addr_tuple->local->port == CONNECTIONLESS_PORT) {
 	wsp_unit_dispatch_event(dgram);
     } else {
         List *events;
 
         events = wtp_unpack_wdp_datagram(dgram);
+
+        if (!events) {
+            debug("wap.wap", 0, "ignoring truncated datagram");
+            wap_event_dump(dgram);
 	wap_event_destroy(dgram);
+            return;
+        }
+
         while (list_len(events) > 0) {
 	    WAPEvent *event;
 
@@ -93,6 +99,8 @@
             else
                 wtp_initiator_dispatch_event(event);
         }
+
+        wap_event_destroy(dgram);
         list_destroy(events, NULL);
     }
 }
Index: wap/wap_events.c
===================================================================
RCS file: /home/cvs/gateway/wap/wap_events.c,v
retrieving revision 1.6
diff -u -B -b -r1.6 wap_events.c
--- wap/wap_events.c	15 Nov 2003 13:14:23 -0000	1.6
+++ wap/wap_events.c	1 Dec 2003 09:50:09 -0000
@@ -67,13 +67,14 @@
 #include "wap_events.h"
 #include "wtls_pdu.h"
 
-WAPEvent *wap_event_create(WAPEventName type) {
+WAPEvent *wap_event_create_real(WAPEventName type, const char *file, long line,
+                                const char *func) {
 	WAPEvent *event;
 	
 	gw_assert(type >= 0);
 	gw_assert(type < WAPEventNameCount);
 
-	event = gw_malloc(sizeof(WAPEvent));
+	event = gw_malloc_trace(sizeof(WAPEvent), file, line, func);
 	event->type = type;
 
 	switch (event->type) {
Index: wap/wap_events.h
===================================================================
RCS file: /home/cvs/gateway/wap/wap_events.h,v
retrieving revision 1.5
diff -u -B -b -r1.5 wap_events.h
--- wap/wap_events.h	15 Nov 2003 13:14:23 -0000	1.5
+++ wap/wap_events.h	1 Dec 2003 09:50:09 -0000
@@ -102,7 +102,10 @@
 
 
 
-WAPEvent *wap_event_create(WAPEventName type);
+WAPEvent *wap_event_create_real(WAPEventName type, const char *file, long line,
+                                const char *func);
+#define wap_event_create(type) \
+    gw_claim_area(wap_event_create_real((type), __FILE__, __LINE__, __func__))
 void wap_event_destroy(WAPEvent *event);
 void wap_event_destroy_item(void *event);
 WAPEvent *wap_event_duplicate(WAPEvent *event);
Index: wap/wtp.c
===================================================================
RCS file: /home/cvs/gateway/wap/wtp.c,v
retrieving revision 1.4
diff -u -B -b -r1.4 wtp.c
--- wap/wtp.c	15 Nov 2003 13:14:24 -0000	1.4
+++ wap/wtp.c	1 Dec 2003 09:50:10 -0000
@@ -348,8 +348,10 @@
 
     data = datagram->u.T_DUnitdata_Ind.user_data;
 
-    if (truncated_datagram(datagram))
+    if (truncated_datagram(datagram)) {
+        warning(0, "WTP: got a truncated datagram, ignoring");
 	return NULL;
+    }
 
     pdu = wtp_pdu_unpack(data);
 
@@ -357,7 +359,7 @@
  * Wtp_pdu_unpack returned NULL, we build a rcv error event. 
  */
     if (pdu == NULL) {
-        error(0, "pdu unpacking returned NULL");
+        error(0, "WTP: cannot unpack pdu, creating an error pdu");
         event = pack_error(datagram);
         return event;
     }   		
@@ -370,7 +372,7 @@
         event = unpack_invoke(pdu, datagram->u.T_DUnitdata_Ind.addr_tuple);
         /* if an WTP initiator gets invoke, it would be an illegal pdu. */
         if (!wtp_event_is_for_responder(event)){
-            debug("wap.wtp", 0, "Invoke when initiator. Message was");
+            debug("wap.wtp", 0, "WTP: Invoke when initiator. Message was");
             wap_event_destroy(event);
             event = pack_error(datagram);
         }
@@ -384,7 +386,7 @@
         event = unpack_result(pdu, datagram->u.T_DUnitdata_Ind.addr_tuple);
         /* if an WTP responder gets result, it would be an illegal pdu. */
         if (wtp_event_is_for_responder(event)){
-            debug("wap.wtp", 0, "Result when responder. Message was");
+            debug("wap.wtp", 0, "WTP: Result when responder. Message was");
             wap_event_destroy(event);
             event = pack_error(datagram);
         }
@@ -404,7 +406,7 @@
 
 	default:
 	    event = pack_error(datagram);
-	    debug("wap.wtp", 0, "Unhandled PDU type. Message was");
+	    debug("wap.wtp", 0, "WTP: Unhandled PDU type. Message was");
             wap_event_dump(datagram);
 	    return event;
 	}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.