*/
#define DECODE_VALUE_MAX ((5 * TLV_VALUE_MAX_LEN) + 1)
-static void decode_tlv(struct tlvinfo_tlv *tlv)
+static void decode_tlv_value(struct tlvinfo_tlv *tlv, char *value, int value_len)
{
- char name[DECODE_NAME_MAX];
- char value[DECODE_VALUE_MAX];
int i;
- strncpy(name, tlv_type2name(tlv->type), DECODE_NAME_MAX);
+ if (value_len < tlv->length) {
+ printf("ERROR: destination buffer too short for key length\n");
+ return;
+ }
switch (tlv->type) {
case TLV_CODE_PRODUCT_NAME:
break;
case TLV_CODE_MAC_BASE:
sprintf(value, "%02X:%02X:%02X:%02X:%02X:%02X",
- tlv->value[0], tlv->value[1], tlv->value[2],
- tlv->value[3], tlv->value[4], tlv->value[5]);
+ tlv->value[0], tlv->value[1], tlv->value[2],
+ tlv->value[3], tlv->value[4], tlv->value[5]);
break;
case TLV_CODE_DEVICE_VERSION:
sprintf(value, "%u", tlv->value[0]);
}
break;
}
+}
+static void decode_tlv(struct tlvinfo_tlv *tlv)
+{
+ char name[DECODE_NAME_MAX];
+ char value[DECODE_VALUE_MAX];
+
+ strncpy(name, tlv_type2name(tlv->type), DECODE_NAME_MAX);
name[DECODE_NAME_MAX - 1] = 0;
+
+ decode_tlv_value(tlv, value, sizeof(value));
+
printf("%-20s 0x%02X %3d %s\n", name, tlv->type, tlv->length, value);
}