Commit Graph

905 Commits

Author SHA1 Message Date
Richard Hughes
4a78fed13c trivial: Check input parameters to fu_strsplit() 2022-07-29 12:57:35 +01:00
Mario Limonciello
5ded4f44fe Add support for reading and writing firmware attributes
This support is comprehensive:
 * Client library support
 * Daemon support
 * plugin support
 * Client tool support (with new commands)
2022-07-28 17:30:57 -05:00
Richard Hughes
829258401e Allow plugins and backends to print debugging information to the console
This is really useful for debugging.
2022-07-28 16:10:06 +01:00
Richard Hughes
b6ad1f248e trivial: Use fu_bytes_new_offset() in more places 2022-07-25 17:07:33 +01:00
Richard Hughes
0e74b89282 trivial: Enable fatal-criticals harder when fuzzing 2022-07-25 17:07:33 +01:00
Richard Hughes
66532a1293 trivial: Make fuzzing less verbose 2022-07-25 17:07:33 +01:00
Richard Hughes
9188060ce2 trivial: Reduce the debug output when fuzzing
At the moment the log is ~150,000 lines, and quite a bit of CPU time is
being spent just generating ignored XML for successful runs.
2022-07-25 17:07:33 +01:00
Mario Limonciello
4a02a154fe trivial: don't use /proc/self/exe on Windows
Fixes: #4864
2022-07-24 09:27:16 -05:00
Richard Hughes
8dc50c086f Fix a crash when a peripheral uses _USE_PARENT_FOR_BATTERY
Call the parent class method to avoid getting stuck in a recursive loop
which eventually causes the daemon to segfault.
2022-07-21 21:27:24 +01:00
Richard Hughes
74e9b04b39 trivial: Return a more invalid value if FWUPD_IS_DEVICE() fails
We don't want to return something that's actually the initial value.
2022-07-21 21:27:24 +01:00
Richard Hughes
221238b4c0 trivial: Allow each device to specify a different acquiesce delay
Different device classes may need different values, and these may need
modifying by quirks. Also use 50ms to flush out any pending events.
2022-07-21 15:27:04 +01:00
Richard Hughes
4f9b455880 Add UDev devices to the _REQUIRES_ACQUIESCE opt-in 2022-07-21 15:27:04 +01:00
Mario Limonciello
445a8af362 fu-smbios: Fix parsing smbios data
When support was added for falling back to SMBIOS data from the kernel
in /sys/class/dmi, we inadvertently stopped caring about the data parsed
directly from DMI tables as first priority.  This caused a regression in
hwids from some OEMs that relied upon IDs that could only be properly built
from DMI tables, not the kernel /sys/class/dmi interface.

Link: https://bugs.launchpad.net/ubuntu/+source/fwupd/+bug/1982103
Fixes: 464425fb5 ("SMBIOS: try reading from /sys/class/dmi if direct access fails")
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
2022-07-20 16:23:56 -05:00
Richard Hughes
847151a51a Wait for the system to acquiesce after doing each update
We want to allow all the device hotplug events to be processed before
marking the update as completed. Otherwise, we might have a situation
where we have a child device attached to a parent, where we want to
update the parent, then the child. e.g.

 1. Add parent
 2. Add child
 3. Update parent
 4. Attach parent
 5. Wait for parent

...some time passes...

 6. Parent re-appears
 7. Update finishes, client indicates success

...child update is scheduled...
...which returns with failure as it does not exist...

 8. Add child

The child should have been added *before* the update completed to avoid
the caller from needing an unspecified delay as a *workaround*.
2022-07-20 19:10:12 +01:00
Richard Hughes
f336a43936 Avoid duplicate device actions where possible
This removes at least two open(),probe(),setup(),close() chains for the
common case where the vfuncs are not implemented.
2022-07-20 19:01:02 +01:00
Richard Hughes
62fc515714 Allow loading in emulated host profiles for debugging
This allows us to load sets of different host security attributes
for testing the various front end tools we have now. e.g.

    sudo FWUPD_HOST_EMULATE=thinkpad-p1-iommu.json.gz fwupd

or, using a non-compressed absolute path:

    sudo FWUPD_HOST_EMULATE=/tmp/test/thinkpad-p1-iommu.json fwupd

Data can be created with `./contrib/generate-emulation.py file.json`
and then can be manually modified if required. Running the script on
a file that already exists will just strip out any unneeded data, as
well as piping content into it using stdin.

As a precaution, the org.fwupd.hsi.HostEmulation attribute is added
so we do not ask the user to upload the HSI report. It also allows
the LVFS to ignore any HSI reports with this attribute for clients
that upload HSI reports regardless.

See https://github.com/fwupd/fwupd/discussions/4832
2022-07-18 16:27:59 +01:00
Richard Hughes
fdc5131dca Only validate source artifacts at cabinet load time
The LVFS was being over-eager, and setting 'binary' for both -- but
for new firmware it's important to specify the correct thing.
2022-07-18 16:12:43 +01:00
Richard Hughes
a5749f4d23 Set the HSI levels in a central place
This means we don't need to worry about changing multiple
implementations if the HSI levels change for a specific ID.

It also means we can fake HSI results in the future without having
to also store the 'correct' level in the input file.
2022-07-15 20:21:22 +01:00
Richard Hughes
dc91444b46 trivial: Export fu_security_attrs_get_by_appstream_id() for future use 2022-07-14 14:49:00 +01:00
Richard Hughes
0c51630991 Check firmware magic in a more standard way
Some parsers are ignoring the magic when using _FLAG_IGNORE_CHECKSUM
(which is wrong; fuzzers have no problem with enforcing a static prefix)
and other either disregard the offset or check the magic in an unsafe
way. Also, use FWUPD_ERROR_INVALID_FILE consistently for magic failure.

Add a vfunc, and move all the clever code into one place.
2022-07-14 14:48:15 +01:00
Richard Hughes
a06dedb253 trivial: Add a fu_memread_uint24_safe() to make some code more correct 2022-07-14 11:03:13 +01:00
Richard Hughes
1ffc2608b0 Check for overflow when copying buffers with huge offset values 2022-07-13 22:04:10 +01:00
Richard Hughes
56e5c1b7a9 Fix critical warning when parsing invalid FDT firmware
Never let firmware_current be NULL by checking for the root node ENDing.

Fixes https://oss-fuzz.com/testcase-detail/5454411320655872
2022-07-13 22:04:01 +01:00
Richard Hughes
3b71918346 trivial: Remove some dead code spotted by Coverity 2022-07-11 10:17:59 +01:00
Richard Hughes
71c0641394 trivial: Fix a -Wunused-function warning on Windows 2022-07-10 11:15:16 +01:00
Richard Hughes
a6b96e2330 Use the SHA256 binary hash for the quirk GResource key
There's no security issue, but it's one less thing I have to justify
during a security review.
2022-07-09 14:56:28 +01:00
Richard Hughes
15536eb1bc Do not make failing to parse the i2c bus number fatal
This acccidentally become more strict in bb548f15f0 and means there
should be no more false-positive daemon warnings at startup.

Fixes the 2nd half of https://github.com/fwupd/fwupd/discussions/4810
2022-07-08 17:24:26 +01:00
Richard Hughes
6f5ebc5492 Handle ENOTTY with the correct error code for ioctl calls
Fixes half of https://github.com/fwupd/fwupd/discussions/4810
2022-07-08 16:25:38 +01:00
Richard Hughes
cb0966858d Fix fuzzing timeout in the new IFW CPD parsing
Limit the number of images to an order of magnitide more than we've ever seen.

Fixes https://oss-fuzz.com/testcase-detail/4842982326534144
2022-07-08 15:17:25 +01:00
Richard Hughes
7a224007f2 Add support for Flat Image Tree aka FIT firmware 2022-07-08 14:05:20 +01:00
Richard Hughes
f3755ef708 Add support for Flattened Devicetree aka FDT firmware 2022-07-08 14:05:20 +01:00
Richard Hughes
57a1270bad Add fu_firmware_get_parent() for future use
Some firmware stacks images hierarchically, and it's useful to be able
to get the parent when unrolling them out into a linear format.
2022-07-05 16:47:18 +01:00
Richard Hughes
e6fee15d3c
Skip uSWID self tests when compiled without cbor support (#4800)
Fixes https://github.com/fwupd/fwupd/issues/4791
2022-07-05 10:20:46 +00:00
Richard Hughes
165b450e80 trivial: Fix a tiny memory leak caused by VENDOR_FROM_PARENT 2022-07-01 14:57:41 +01:00
Richard Hughes
be6af6d11c trivial: Fix a tiny memory leak when parsing oprom firmware 2022-07-01 13:57:18 +01:00
Richard Hughes
de31992522 trivial: Fix a tiny memory leak in the self tests 2022-07-01 13:57:18 +01:00
Richard Hughes
91cb4e7274 trivial: Relax some timings a little to fix running valgrind 2022-07-01 13:57:18 +01:00
Richard Hughes
726d20e498 Ensure more firmware formats can round-trip to and from XML
This greatly improves the coverage stats too.
2022-07-01 13:57:18 +01:00
Richard Hughes
95f7d23d58 Fix FuCfuOffer XML roundtrip 2022-07-01 13:57:18 +01:00
Richard Hughes
d7479423a0 trivial: Add SUBSYS instance data if *either* of the vendor or model are set 2022-06-30 19:06:38 +01:00
Richard Hughes
ced79fce4a Create the better device GType in the backend
It is weird to do this when constructing the object, and it allows us
to match PossiblePlugin quirk matches on potentially better instance
IDs added by the superclass.
2022-06-30 19:06:38 +01:00
Richard Hughes
bb548f15f0 Fix segfault when parsing an invalid i2c device
Confusingly, g_regex_match_full() returns FALSE and doesn't always set
the GError. Just use g_path_get_basename() and g_str_has_prefix().
2022-06-30 19:06:38 +01:00
Richard Hughes
7b96c2e6cd trivial: Implement FuMeiDevice->incorporate() 2022-06-30 19:06:38 +01:00
Richard Hughes
a694a1d915 trivial: Implement FuI2cDevice->incorporate() 2022-06-30 19:06:38 +01:00
Richard Hughes
006c75a82d trivial: Only print the MEI private data if set 2022-06-30 19:06:38 +01:00
Richard Hughes
a61bb37881 Build the quirk files into the daemon as a GResource
Interestingly, this increases the `fwupd` binary size by ~30kb but
reduces the installed size of /usr/share/fwupd/quirks.d by ~330kb.
2022-06-30 18:52:24 +01:00
Richard Hughes
6ac6372b2a trivial: Make the FuUdevDevice->to_string() more complete 2022-06-30 14:17:53 +01:00
Richard Hughes
c7b3cd5b8a Fix a hidraw regression
Ensure that udev_parent is actually set before checking it for NULL.
2022-06-30 14:17:53 +01:00
Richard Hughes
5b17189bc1 Fix FuUdevPlugin to use 0x0 for unset
We were using 0x0 and 0xFFFF in different places, and only checking the
former in most cases. Just restrict the range to 0xFFFE and use 0x0 as
*invalid or not set* as before.
2022-06-30 14:17:53 +01:00
Richard Hughes
3d654e9b68 Enforce that the UDEV VEN:DEV is a uint16_t
This was incompletely fixed in bf256a7ca7
and changing the type means that the compiler finds any places where
we compare it with a uint32_t.
2022-06-30 14:17:53 +01:00