diff --git a/src/dvparser.cc b/src/dvparser.cc index c526510..4aed0a7 100644 --- a/src/dvparser.cc +++ b/src/dvparser.cc @@ -87,7 +87,7 @@ bool parseDV(Telegram *t, // Since the data does not have the difvifs. data_has_difvifs = false; format_end = *format+format_len; - string s = bin2hex(*format, format_len); + string s = bin2hex(*format, format_end, format_len); debug("(dvparser) using format \"%s\"\n", s.c_str()); } @@ -247,24 +247,22 @@ bool parseDV(Telegram *t, DEBUG_PARSER("(dvparser debug) remaining data %d len=%d\n", remaining, datalen); if (remaining < datalen) { debug("(dvparser) warning: unexpected end of data\n"); - datalen = remaining; + datalen = remaining-1; } // Skip the length byte in the variable length data. if (variable_length) { t->addExplanation(data, 1, "%02X varlen=%d", datalen, datalen); } - string value = bin2hex(data, datalen); + string value = bin2hex(data, data_end, datalen); int offset = start_parse_here+data-data_start; (*values)[key] = { offset, DVEntry(vif&0x7f, storage_nr, tariff, subunit, value) }; if (value.length() > 0) { - assert(data != databytes.end()); - assert(data+datalen <= databytes.end()); // This call increments data with datalen. t->addExplanation(data, datalen, "%s", value.c_str()); DEBUG_PARSER("(dvparser debug) data \"%s\"\n\n", value.c_str()); } - if (remaining == datalen) { + if (remaining == datalen || data == databytes.end()) { // We are done here! break; } diff --git a/src/util.cc b/src/util.cc index 421ee05..a782596 100644 --- a/src/util.cc +++ b/src/util.cc @@ -126,9 +126,9 @@ std::string bin2hex(vector &target) { return str; } -std::string bin2hex(vector::iterator data, int len) { +std::string bin2hex(vector::iterator data, vector::iterator end, int len) { std::string str; - while (len-- > 0) { + while (data != end && len-- > 0) { const char ch = *data; data++; str.append(&hex[(ch & 0xF0) >> 4], 1); diff --git a/src/util.h b/src/util.h index e8fdd4b..c5f43bd 100644 --- a/src/util.h +++ b/src/util.h @@ -35,7 +35,7 @@ bool hex2bin(const char* src, std::vector *target); bool hex2bin(std::string &src, std::vector *target); bool hex2bin(std::vector &src, std::vector *target); std::string bin2hex(std::vector &target); -std::string bin2hex(std::vector::iterator data, int len); +std::string bin2hex(std::vector::iterator data, std::vector::iterator end, int len); void strprintf(std::string &s, const char* fmt, ...); // Return for example: 2010-03-21 std::string strdate(struct tm *date);