From d73dae9f2ae5068642b8e62227c3c34560ca6e09 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 30 Jun 2009 18:23:23 -0500 Subject: [PATCH] Make sms_udh_iter work for Cell Broadcast messages --- src/smsutil.c | 96 +++++++++++++++++++++++++++++++++++---------------- src/smsutil.h | 3 +- 2 files changed, 69 insertions(+), 30 deletions(-) diff --git a/src/smsutil.c b/src/smsutil.c index 7cf56de7..ffee5550 100644 --- a/src/smsutil.c +++ b/src/smsutil.c @@ -1518,36 +1518,10 @@ const guint8 *sms_extract_common(const struct sms *sms, gboolean *out_udhi, return ud; } -gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter) +static gboolean verify_udh(const guint8 *hdr, guint8 max_len) { - gboolean udhi = FALSE; - const guint8 *hdr; - guint8 udl; - guint8 dcs; - guint8 max_len; - guint8 offset; guint8 max_offset; - guint8 max_ud_len; - - hdr = sms_extract_common(sms, &udhi, &dcs, &udl, &max_ud_len); - - if (!hdr) - return FALSE; - - if (!udhi) - return FALSE; - - if (sms->type == SMS_TYPE_COMMAND) - max_len = udl; - else - max_len = sms_udl_in_bytes(udl, dcs); - - /* Can't actually store the HDL + IEI / IEL */ - if (max_len < 3) - return FALSE; - - if (max_len > max_ud_len) - return FALSE; + guint8 offset; /* Must have at least one information-element if udhi is true */ if (hdr[0] < 2) @@ -1577,13 +1551,77 @@ gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter) if (offset != max_offset) return FALSE; - iter->sms = sms; + return TRUE; +} + +gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter) +{ + gboolean udhi = FALSE; + const guint8 *hdr; + guint8 udl; + guint8 dcs; + guint8 max_len; + guint8 max_ud_len; + + hdr = sms_extract_common(sms, &udhi, &dcs, &udl, &max_ud_len); + + if (!hdr) + return FALSE; + + if (!udhi) + return FALSE; + + if (sms->type == SMS_TYPE_COMMAND) + max_len = udl; + else + max_len = sms_udl_in_bytes(udl, dcs); + + /* Can't actually store the HDL + IEI / IEL */ + if (max_len < 3) + return FALSE; + + if (max_len > max_ud_len) + return FALSE; + + if (!verify_udh(hdr, max_len)) + return FALSE; + iter->data = hdr; iter->offset = 1; return TRUE; } +gboolean sms_udh_iter_init_from_cbs(const struct cbs *cbs, + struct sms_udh_iter *iter) +{ + gboolean udhi = FALSE; + const guint8 *hdr; + guint8 max_ud_len; + + cbs_dcs_decode(cbs->dcs, &udhi, NULL, NULL, NULL, NULL, NULL); + + if (!udhi) + return FALSE; + + hdr = cbs->ud; + max_ud_len = 82; + + /* Must have at least one information-element if udhi is true */ + if (hdr[0] < 2) + return FALSE; + + if (hdr[0] >= max_ud_len) + return FALSE; + + if (!verify_udh(hdr, max_ud_len)) + return FALSE; + + iter->data = hdr; + iter->offset = 1; + + return TRUE; +} guint8 sms_udh_iter_get_udh_length(struct sms_udh_iter *iter) { return iter->data[0]; diff --git a/src/smsutil.h b/src/smsutil.h index 3e5f269e..2a27fc03 100644 --- a/src/smsutil.h +++ b/src/smsutil.h @@ -344,7 +344,6 @@ struct sms { }; struct sms_udh_iter { - const struct sms *sms; const guint8 *data; guint8 offset; }; @@ -407,6 +406,8 @@ const guint8 *sms_extract_common(const struct sms *sms, gboolean *out_udhi, guint8 *out_max); gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter); +gboolean sms_udh_iter_init_from_cbs(const struct cbs *cbs, + struct sms_udh_iter *iter); guint8 sms_udh_iter_get_udh_length(struct sms_udh_iter *iter); const guint8 *sms_udh_iter_get_ud_after_header(struct sms_udh_iter *iter); enum sms_iei sms_udh_iter_get_ie_type(struct sms_udh_iter *iter);