diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-10-30 15:08:02 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-10-30 20:42:59 +0100 |
commit | 4c98ff41cca3c83498c8f8b6f502fa56e4e31653 (patch) | |
tree | 7935c2d8132809eeb74c7cd655d9f87b560f8db3 /build-aux/qmi-codegen/VariableInteger.py | |
parent | 7cce18820ef2142781c334d20e162d814695a409 (diff) |
qmi-codegen: validate TLV before really reading it
Try to handle buggy firmware, or just make the library more robust, by
validating the read TLV before really reading it. If a TLV is not considered
valid, we just skip it for now.
E.g.: the "Detailed Service Status" TLV (0x21) in the "NAS Get Serving System"
message is supposed to be a sequence of 5 bytes, but some models (e.g. ZTE MF683)
end up sending only the first 4 bytes.
Diffstat (limited to 'build-aux/qmi-codegen/VariableInteger.py')
-rw-r--r-- | build-aux/qmi-codegen/VariableInteger.py | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/build-aux/qmi-codegen/VariableInteger.py b/build-aux/qmi-codegen/VariableInteger.py index b891283..63d1d02 100644 --- a/build-aux/qmi-codegen/VariableInteger.py +++ b/build-aux/qmi-codegen/VariableInteger.py @@ -101,6 +101,32 @@ class VariableInteger(Variable): """ + Emits the code involved in computing the size of the variable. + """ + def emit_size_read(self, f, line_prefix, variable_name, buffer_name, buffer_len): + translations = { 'lp' : line_prefix, + 'len' : self.guint_sized_size, + 'variable_name' : variable_name } + template = '' + if self.format == 'guint-sized': + template += ( + '${lp}${variable_name} += ${len};\n') + elif self.private_format == 'guint8' or self.private_format == 'gint8': + template += ( + '${lp}${variable_name} += 1;\n') + elif self.private_format == 'guint16' or self.private_format == 'gint16': + template += ( + '${lp}${variable_name} += 2;\n') + elif self.private_format == 'guint32' or self.private_format == 'gint32': + template += ( + '${lp}${variable_name} += 4;\n') + elif self.private_format == 'guint64' or self.private_format == 'gint64': + template += ( + '${lp}${variable_name} += 8;\n') + f.write(string.Template(template).substitute(translations)) + + + """ Write a single integer to the raw byte buffer """ def emit_buffer_write(self, f, line_prefix, variable_name, buffer_name, buffer_len): |