Hi,

attached is a patch that implements relaxed source_addr checks in SMPP and
adds additionally error reporting why kannel rejected this MO.

Comments & votes please!

P.S. IMO: this patch should go into 1.4.1 because some SMSC doesn't work
with 1.4.0 anymore though they worked fine with 1.2.1.

-- 
Thanks,
Alex
Index: gw/smsc/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_smpp.c,v
retrieving revision 1.80
diff -a -u -p -r1.80 smsc_smpp.c
--- gw/smsc/smsc_smpp.c	1 Mar 2005 01:41:44 -0000	1.80
+++ gw/smsc/smsc_smpp.c	11 Mar 2005 13:27:14 -0000
@@ -59,7 +59,7 @@
  *
  * Lars Wirzenius
  * Stipe Tolj <[EMAIL PROTECTED]>
- * Alexander Malysh  <[EMAIL PROTECTED]>
+ * Alexander Malysh  <amalysh at kannel.org>
  */
 
 /* XXX check SMSCConn conformance */
@@ -351,13 +351,34 @@ static Msg *pdu_to_msg(SMPP *smpp, SMPP_
     ton = pdu->u.deliver_sm.source_addr_ton;
     npi = pdu->u.deliver_sm.source_addr_npi;
 
-    /* check if intl. and digit only; assume number is larger then 7 chars */
-    if (ton == GSM_ADDR_TON_INTERNATIONAL &&
-        octstr_len(pdu->u.deliver_sm.source_addr) >= 7 &&
-        ((octstr_get_char(pdu->u.deliver_sm.source_addr, 0) == '+' &&
-         octstr_check_range(pdu->u.deliver_sm.source_addr, 1, 256, gw_isdigit)) ||
-        octstr_check_range(pdu->u.deliver_sm.source_addr, 0, 256, gw_isdigit))) {
-
+    switch(ton) {
+    case GSM_ADDR_TON_INTERNATIONAL:
+        /*
+         * Checks to perform:
+         *   1) assume international number has at least 7 chars
+         *   2) the whole source addr consist of digits, exception '+' in front
+         */
+        if (octstr_len(pdu->u.deliver_sm.source_addr) < 7) {
+            error(0, "SMPP[%s]: Mallformed source_addr `%s', expected at least 7 digits. "
+                     "Discarding MO message.", octstr_get_cstr(smpp->conn->id),
+                     octstr_get_cstr(pdu->u.deliver_sm.source_addr));
+            *reason = SMPP_ESME_RINVSRCADR;
+            goto error;
+        } else if (octstr_get_char(pdu->u.deliver_sm.source_addr, 0) == '+' &&
+                   !octstr_check_range(pdu->u.deliver_sm.source_addr, 1, 256, gw_isdigit)) {
+            error(0, "SMPP[%s]: Mallformed source_addr `%s', expected all digits. "
+                     "Discarding MO message.", octstr_get_cstr(smpp->conn->id),
+                     octstr_get_cstr(pdu->u.deliver_sm.source_addr));
+            *reason = SMPP_ESME_RINVSRCADR;
+            goto error;
+        } else if (octstr_get_char(pdu->u.deliver_sm.source_addr, 0) != '+' &&
+                   !octstr_check_range(pdu->u.deliver_sm.source_addr, 0, 256, gw_isdigit)) {
+            error(0, "SMPP[%s]: Mallformed source_addr `%s', expected all digits. "
+                     "Discarding MO message.", octstr_get_cstr(smpp->conn->id),
+                     octstr_get_cstr(pdu->u.deliver_sm.source_addr));
+            *reason = SMPP_ESME_RINVSRCADR;
+            goto error;
+        }
         /* check if we received leading '00', then remove it*/
         if (octstr_search(pdu->u.deliver_sm.source_addr, octstr_imm("00"), 0) == 0)
             octstr_delete(pdu->u.deliver_sm.source_addr, 0, 2);
@@ -365,13 +386,22 @@ static Msg *pdu_to_msg(SMPP *smpp, SMPP_
         /* international, insert '+' if not already here */
         if (octstr_get_char(pdu->u.deliver_sm.source_addr, 0) != '+')
             octstr_insert_char(pdu->u.deliver_sm.source_addr, 0, '+');
-    } else if (octstr_len(pdu->u.deliver_sm.source_addr) > 11 &&
-               (ton == GSM_ADDR_TON_ALPHANUMERIC ||
-               !octstr_check_range(pdu->u.deliver_sm.source_addr, 0, 256, gw_isdigit))) {
-        /* alphanum sender, max. allowed length is 11 (according to GSM specs) */
-        *reason = SMPP_ESME_RINVSRCADR;
-        goto error;
+
+        break;
+    case GSM_ADDR_TON_ALPHANUMERIC:
+        if (octstr_len(pdu->u.deliver_sm.source_addr) > 11) {
+            /* alphanum sender, max. allowed length is 11 (according to GSM specs) */
+            error(0, "SMPP[%s]: Mallformed source_addr `%s', alphanum length greater 11 chars. "
+                     "Discarding MO message.", octstr_get_cstr(smpp->conn->id),
+                     octstr_get_cstr(pdu->u.deliver_sm.source_addr));
+            *reason = SMPP_ESME_RINVSRCADR;
+            goto error;
+        }
+        break;
+    default: /* otherwise don't touch source_addr, user should handle it */
+        break;
     }
+
     msg->sms.sender = pdu->u.deliver_sm.source_addr;
     pdu->u.deliver_sm.source_addr = NULL;
 
@@ -380,6 +410,9 @@ static Msg *pdu_to_msg(SMPP *smpp, SMPP_
      * it's not allowed to have destination_addr NULL 
      */
     if (pdu->u.deliver_sm.destination_addr == NULL) {
+        error(0, "SMPP[%s]: Mallformed destination_addr `%s', may not be empty. "
+                 "Discarding MO message.", octstr_get_cstr(smpp->conn->id),
+                     octstr_get_cstr(pdu->u.deliver_sm.destination_addr));
         *reason = SMPP_ESME_RINVDSTADR;
         goto error;
     }
@@ -401,6 +434,9 @@ static Msg *pdu_to_msg(SMPP *smpp, SMPP_
 
     /* now check dest addr range */
     if (ton != GSM_ADDR_TON_ALPHANUMERIC && !octstr_check_range(pdu->u.deliver_sm.destination_addr, 1, 256, gw_isdigit)) {
+        error(0, "SMPP[%s]: Mallformed destination_addr `%s', expected all digits. "
+                 "Discarding MO message.", octstr_get_cstr(smpp->conn->id),
+                     octstr_get_cstr(pdu->u.deliver_sm.destination_addr));
         *reason = SMPP_ESME_RINVDSTADR;
         goto error;
     }

Reply via email to