From patchwork Mon Dec 8 18:05:25 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?S=C5=82awomir_Demeszko?= X-Patchwork-Id: 418772 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 125FC14010F for ; Tue, 9 Dec 2014 05:05:59 +1100 (AEDT) Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 66D4C2805DB; Mon, 8 Dec 2014 19:04:04 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=unavailable version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 599362805DB for ; Mon, 8 Dec 2014 19:03:54 +0100 (CET) X-policyd-weight: using cached result; rate:hard: -7.6 Received: from hosting.nazwa24.pl (ns1.hosting.nazwa24.pl [46.242.129.143]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Mon, 8 Dec 2014 19:03:54 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=wireless-instruments.com; s=default; h=Content-Transfer-Encoding:Content-Type:MIME-Version:Message-Id:Date:Subject:Cc:To:From; bh=quGdvM//787M0Oz0uTwGd1cmAEyRhsZD4NG2tiyMAeI=; b=bMnR1YvWJYHbazfd13UfBYyuvhBKlxOfrZ0Hv2EjbG9Btjz8TnesXgYalNTmHegtzfeBePTTr43iC1QgZGyGcsVSXhPiyHLZwZzJRe8oNb6TaCyhV9anGZLzPeciykB2EBk7Km6kf+y9ZA0EOrQtz/HUwrpYy2fsxHnuwyiDGmQ=; Received: from afo149.internetdsl.tpnet.pl ([83.16.144.149]:35095 helo=localhost.localdomain) by hosting.nazwa24.pl with esmtpsa (UNKNOWN:AES128-SHA256:128) (Exim 4.82) (envelope-from ) id 1Xy2gd-0005PL-V6; Mon, 08 Dec 2014 19:05:32 +0100 From: =?UTF-8?q?S=C5=82awomir=20Demeszko?= To: openwrt-devel@lists.openwrt.org Date: Mon, 8 Dec 2014 19:05:25 +0100 Message-Id: <1418061925-14427-1-git-send-email-s.demeszko@wireless-instruments.com> X-Mailer: git-send-email 1.9.1 MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - hosting.nazwa24.pl X-AntiAbuse: Original Domain - lists.openwrt.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - wireless-instruments.com X-Get-Message-Sender-Via: hosting.nazwa24.pl: authenticated_id: s.demeszko@wireless-instruments.com Cc: =?UTF-8?q?S=C5=82awomir=20Demeszko?= Subject: [OpenWrt-Devel] [PATCH uqmi] Fix character "@" added at end of received messages X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" If 7 bit message encoded on 8 bit cells has one last bit occupying whole byte it need to be padded with 7 zero bits. To not mistake these last 7 bits with a character with code 0 (@) we need to check length from User Data Length field and not rely on actual length of received data. An example can be message "abcdefg" encoded as "61 f1 98 5c 36 9f 01", it is decoded as "abcdefg@". Signed-off-by: SÅ‚awomir Demeszko --- It depends on my last patches from today. commands-wms.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/commands-wms.c b/commands-wms.c index 74f50aa..47d4d76 100644 --- a/commands-wms.c +++ b/commands-wms.c @@ -1,5 +1,8 @@ #include "qmi-message.h" +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define CEILDIV(x,y) (((x) + (y) - 1) / (y)) + static void cmd_wms_list_messages_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg) { struct qmi_wms_list_messages_response res; @@ -191,8 +194,9 @@ static int decode_udh(const unsigned char *data) static void decode_7bit_field(char *name, const unsigned char *data, int data_len, int bit_offset) { - char *dest = blobmsg_alloc_string_buffer(&status, name, 3 * (data_len * 8 / 7) + 2); - pdu_decode_7bit_str(dest, data, data_len, bit_offset); + char *dest = blobmsg_alloc_string_buffer(&status, name, 3 * data_len + 2); + pdu_decode_7bit_str(dest, data, CEILDIV(data_len * 7, 8), bit_offset); + dest[data_len] = 0; blobmsg_add_string_buffer(&status); } @@ -366,12 +370,13 @@ static void cmd_wms_get_message_cb(struct qmi_dev *qmi, struct qmi_request *req, data += 7; } - data++; + int message_len = *(data++); + int udh_len = 0; int bit_offset = 0; /* User Data Header */ if (first & 0x40) { - int udh_len = decode_udh(data); + udh_len = decode_udh(data); data += udh_len; bit_offset = udh_len % 7; } @@ -382,15 +387,19 @@ static void cmd_wms_get_message_cb(struct qmi_dev *qmi, struct qmi_request *req, switch(dcs & 0x0c) { case 0x00: /* 7 bit GSM alphabet */ - decode_7bit_field("text", data, end - data, bit_offset); + message_len = message_len - CEILDIV(udh_len * 8, 7); + message_len = MIN(message_len, CEILDIV((end - data) * 8, 7)); + decode_7bit_field("text", data, message_len, bit_offset); break; case 0x04: /* 8 bit data */ - blobmsg_add_hex(&status, "data", data, end - data); + message_len = MIN(message_len - udh_len, end - data); + blobmsg_add_hex(&status, "data", data, message_len); break; case 0x08: /* 16 bit UCS-2 string */ - blobmsg_add_hex(&status, "ucs-2", data, end - data); + message_len = MIN(message_len - udh_len, end - data); + blobmsg_add_hex(&status, "ucs-2", data, message_len); break; default: goto error;