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;
 	}
