dnp3-gen: fix heap buffer overflow in generated code

Due to missing check before memcpy.
pull/3228/merge
Philippe Antoine 9 years ago committed by Victor Julien
parent 261f15a146
commit 6a6aa04f55

@ -527,6 +527,10 @@ static int DNP3DecodeObjectG{{object.group}}V{{object.variation}}(const uint8_t
object->{{field.len_field}} = prefix - (offset - *len); object->{{field.len_field}} = prefix - (offset - *len);
{% endif %} {% endif %}
if (object->{{field.len_field}} > 0) { 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}}); memcpy(object->{{field.name}}, *buf, object->{{field.len_field}});
*buf += object->{{field.len_field}}; *buf += object->{{field.len_field}};
*len -= object->{{field.len_field}}; *len -= object->{{field.len_field}};
@ -538,20 +542,20 @@ static int DNP3DecodeObjectG{{object.group}}V{{object.variation}}(const uint8_t
if (!DNP3ReadUint8(buf, len, &octet)) { if (!DNP3ReadUint8(buf, len, &octet)) {
goto error; goto error;
} }
{% set shift = 0 %} {% set ns = namespace(shift=0) %}
{% for field in field.fields %} {% for field in field.fields %}
{% if field.width == 1 %} {% if field.width == 1 %}
object->{{field.name}} = (octet >> {{shift}}) & 0x1; object->{{field.name}} = (octet >> {{ns.shift}}) & 0x1;
{% elif field.width == 2 %} {% elif field.width == 2 %}
object->{{field.name}} = (octet >> {{shift}}) & 0x3; object->{{field.name}} = (octet >> {{ns.shift}}) & 0x3;
{% elif field.width == 4 %} {% elif field.width == 4 %}
object->{{field.name}} = (octet >> {{shift}}) & 0xf; object->{{field.name}} = (octet >> {{ns.shift}}) & 0xf;
{% elif field.width == 7 %} {% elif field.width == 7 %}
object->{{field.name}} = (octet >> {{shift}}) & 0x7f; object->{{field.name}} = (octet >> {{ns.shift}}) & 0x7f;
{% else %} {% else %}
{{ raise("Unhandled width of %d." % (field.width)) }} {{ raise("Unhandled width of %d." % (field.width)) }}
{% endif %} {% endif %}
{% set shift = shift + field.width %} {% set ns.shift = ns.shift + field.width %}
{% endfor %} {% endfor %}
} }
{% else %} {% else %}

Loading…
Cancel
Save