if ((error = vlib_pci_read_config_u8 (vm, h, PCI_CAPABILITY_LIST, &pos)))
{
virtio_log_error (vif, "error in reading capabilty list position");
- clib_error_return (error, "error in reading capabilty list position");
+ return clib_error_return (error,
+ "error in reading capabilty list position");
}
while (pos)
{
{
virtio_log_error (vif, "%s [%2x]",
"error in reading the capability at", pos);
- clib_error_return (error,
- "error in reading the capability at [%2x]", pos);
+ return clib_error_return (error,
+ "error in reading the capability at [%2x]",
+ pos);
}
if (cap.cap_vndr == PCI_CAP_ID_MSIX)
if ((error =
vlib_pci_read_write_config (vm, h, VLIB_READ, pos + 2, &flags,
sizeof (flags))))
- clib_error_return (error,
- "error in reading the capability at [%2x]",
- pos + 2);
+ return clib_error_return (error,
+ "error in reading the capability at [%2x]",
+ pos + 2);
table_size = flags & table_size_mask;
virtio_log_debug (vif, "flags:0x%x %s 0x%x", flags,
"[%4x] cfg type: %u, bar: %u, offset: %04x, len: %u",
pos, cap.cfg_type, cap.bar, cap.offset, cap.length);
- vif->bar = bar[cap.bar];
- vif->bar_id = cap.bar;
+ if (cap.bar >= 1 && cap.bar <= 5)
+ {
+ vif->bar = bar[cap.bar];
+ vif->bar_id = cap.bar;
+ }
+ else
+ return clib_error_return (error, "invalid bar %u", cap.bar);
switch (cap.cfg_type)
{
{
args->rv = VNET_API_ERROR_UNSUPPORTED;
virtio_log_error (vif, "Device is not supported");
- clib_error_return (error, "Device is not supported");
+ return clib_error_return (error, "Device is not supported");
}
if (virtio_pci_reset_device (vm, vif) < 0)
{
args->rv = VNET_API_ERROR_INIT_FAILED;
virtio_log_error (vif, "Failed to reset the device");
- clib_error_return (error, "Failed to reset the device");
+ return clib_error_return (error, "Failed to reset the device");
}
/*
* read device features and negotiate (user) requested features
args->rv = VNET_API_ERROR_UNSUPPORTED;
virtio_log_error (vif,
"error encountered: Device doesn't support requested features");
- clib_error_return (error, "Device doesn't support requested features");
+ return clib_error_return (error,
+ "Device doesn't support requested features");
}
vif->status = status;