object->{{field.len_field}} = prefix - (offset - *len);
{% endif %}
if (object->{{field.len_field}} > 0) {
+ if (*len < object->{{field.len_field}}) {
+ /* Not enough data. */
+ goto error;
+ }
memcpy(object->{{field.name}}, *buf, object->{{field.len_field}});
*buf += object->{{field.len_field}};
*len -= object->{{field.len_field}};
if (!DNP3ReadUint8(buf, len, &octet)) {
goto error;
}
-{% set shift = 0 %}
+{% set ns = namespace(shift=0) %}
{% for field in field.fields %}
{% if field.width == 1 %}
- object->{{field.name}} = (octet >> {{shift}}) & 0x1;
+ object->{{field.name}} = (octet >> {{ns.shift}}) & 0x1;
{% elif field.width == 2 %}
- object->{{field.name}} = (octet >> {{shift}}) & 0x3;
+ object->{{field.name}} = (octet >> {{ns.shift}}) & 0x3;
{% elif field.width == 4 %}
- object->{{field.name}} = (octet >> {{shift}}) & 0xf;
+ object->{{field.name}} = (octet >> {{ns.shift}}) & 0xf;
{% elif field.width == 7 %}
- object->{{field.name}} = (octet >> {{shift}}) & 0x7f;
+ object->{{field.name}} = (octet >> {{ns.shift}}) & 0x7f;
{% else %}
{{ raise("Unhandled width of %d." % (field.width)) }}
{% endif %}
-{% set shift = shift + field.width %}
+{% set ns.shift = ns.shift + field.width %}
{% endfor %}
}
{% else %}