return -EINVAL;
}
- if (log_addrs->cec_version < CEC_OP_CEC_VERSION_2_0) {
- memset(log_addrs->all_device_types, 0,
- sizeof(log_addrs->all_device_types));
- memset(log_addrs->features, 0, sizeof(log_addrs->features));
- }
-
for (i = 0; i < log_addrs->num_log_addrs; i++) {
+ const u8 feature_sz = ARRAY_SIZE(log_addrs->features[0]);
u8 *features = log_addrs->features[i];
bool op_is_dev_features = false;
dprintk(1, "unknown logical address type\n");
return -EINVAL;
}
- if (log_addrs->cec_version < CEC_OP_CEC_VERSION_2_0)
- continue;
-
- for (i = 0; i < ARRAY_SIZE(log_addrs->features[0]); i++) {
+ for (i = 0; i < feature_sz; i++) {
if ((features[i] & 0x80) == 0) {
if (op_is_dev_features)
break;
op_is_dev_features = true;
}
}
- if (!op_is_dev_features ||
- i == ARRAY_SIZE(log_addrs->features[0])) {
+ if (!op_is_dev_features || i == feature_sz) {
dprintk(1, "malformed features\n");
return -EINVAL;
}
+ /* Zero unused part of the feature array */
+ memset(features + i, 0, feature_sz - i);
}
if (log_addrs->cec_version >= CEC_OP_CEC_VERSION_2_0) {
}
}
+ /* Zero unused LAs */
+ for (i = log_addrs->num_log_addrs; i < CEC_MAX_LOG_ADDRS; i++) {
+ log_addrs->primary_device_type[i] = 0;
+ log_addrs->log_addr_type[i] = 0;
+ log_addrs->all_device_types[i] = 0;
+ memset(log_addrs->features[i], 0,
+ sizeof(log_addrs->features[i]));
+ }
+
log_addrs->log_addr_mask = adap->log_addrs.log_addr_mask;
adap->log_addrs = *log_addrs;
if (adap->phys_addr != CEC_PHYS_ADDR_INVALID)