mirror of
https://github.com/corundum/corundum.git
synced 2025-01-30 08:32:52 +08:00
Add checks for out-of-range pointers
This commit is contained in:
parent
fe8fdab002
commit
c3eba353fb
@ -105,6 +105,11 @@ struct mqnic *mqnic_open(const char *dev_name)
|
|||||||
interface->regs = dev->regs + k*dev->if_stride;
|
interface->regs = dev->regs + k*dev->if_stride;
|
||||||
interface->csr_regs = interface->regs + dev->if_csr_offset;
|
interface->csr_regs = interface->regs + dev->if_csr_offset;
|
||||||
|
|
||||||
|
if (interface->regs >= dev->regs+dev->regs_size)
|
||||||
|
goto fail_range;
|
||||||
|
if (interface->csr_regs >= dev->regs+dev->regs_size)
|
||||||
|
goto fail_range;
|
||||||
|
|
||||||
interface->if_id = mqnic_reg_read32(interface->csr_regs, MQNIC_IF_REG_IF_ID);
|
interface->if_id = mqnic_reg_read32(interface->csr_regs, MQNIC_IF_REG_IF_ID);
|
||||||
interface->if_features = mqnic_reg_read32(interface->csr_regs, MQNIC_IF_REG_IF_FEATURES);
|
interface->if_features = mqnic_reg_read32(interface->csr_regs, MQNIC_IF_REG_IF_FEATURES);
|
||||||
|
|
||||||
@ -142,6 +147,9 @@ struct mqnic *mqnic_open(const char *dev_name)
|
|||||||
struct mqnic_port *port = &interface->ports[l];
|
struct mqnic_port *port = &interface->ports[l];
|
||||||
port->regs = interface->regs + interface->port_offset + interface->port_stride*l;
|
port->regs = interface->regs + interface->port_offset + interface->port_stride*l;
|
||||||
|
|
||||||
|
if (port->regs >= dev->regs+dev->regs_size)
|
||||||
|
goto fail_range;
|
||||||
|
|
||||||
port->port_id = mqnic_reg_read32(port->regs, MQNIC_PORT_REG_PORT_ID);
|
port->port_id = mqnic_reg_read32(port->regs, MQNIC_PORT_REG_PORT_ID);
|
||||||
port->port_features = mqnic_reg_read32(port->regs, MQNIC_PORT_REG_PORT_FEATURES);
|
port->port_features = mqnic_reg_read32(port->regs, MQNIC_PORT_REG_PORT_FEATURES);
|
||||||
|
|
||||||
@ -156,12 +164,17 @@ struct mqnic *mqnic_open(const char *dev_name)
|
|||||||
{
|
{
|
||||||
struct mqnic_sched *sched = &port->sched[m];
|
struct mqnic_sched *sched = &port->sched[m];
|
||||||
sched->regs = port->regs + port->sched_offset + port->sched_stride*m;
|
sched->regs = port->regs + port->sched_offset + port->sched_stride*m;
|
||||||
|
|
||||||
|
if (sched->regs >= dev->regs+dev->regs_size)
|
||||||
|
goto fail_range;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
|
|
||||||
|
fail_range:
|
||||||
|
fprintf(stderr, "Error: computed pointer out of range\n");
|
||||||
fail_reset:
|
fail_reset:
|
||||||
munmap((void *)dev->regs, dev->regs_size);
|
munmap((void *)dev->regs, dev->regs_size);
|
||||||
fail_mmap_regs:
|
fail_mmap_regs:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user