mirror of
https://github.com/chipsec/chipsec
synced 2026-06-08 13:31:00 +00:00
09f421639e
When using chipsec.chipset Python module from an unprivileged user, the Python interpreter crashes with a segmentation fault on an `outl` instruction. This is because `iopl(3)` failed and the "legacy PCI" implementation tried to write a value to an I/O port without being allowed to. Fix this by checking the return value of `iopl`. While at it, enable using `error` in the C library, to properly report the `EPERM` error. While working on this code, it appeared that: - `self.addr` was written twice in `PORTS`' constructor: once for the `inl` implementation and another one for `outl`. - Everytime `PORTS` or `LEGACY_PCI` objects were created, some memory was allocated (with `mmap.mmap`) to run the helpers and this memory was never freed. - The global variables `IN_PORT` and `OUT_PORT` were defined as lists but always used as bytes. Fix these issues by spliting `self.addr` into two variables, by introducing a class property which re-use previous `PORTS` instances (making this class a singleton) and by making `IN_PORT` and `OUT_PORT` directly `bytes`. While at it, change the names to the usual camel case convention (`PORTS` -> `Ports` and `LEGACY_PCI` -> `LegacyPci`) and add type hints. Signed-off-by: Nicolas Iooss <nicolas.iooss_git@polytechnique.org>