49387 Commits

Author SHA1 Message Date
Ramon Roche
1226fe9e90
style(mavlink): fix astyle formatting in FTP path validation
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-08 12:57:39 -07:00
Ramon Roche
419c5535a8
fix(mavlink): scope FTP symlink hardening to POSIX/SITL only
NuttX is not affected by GHSA-93v7-287q-qx4g: it has a flat VFS, the
FAT driver used for /fs/microsd does not support symlinks, and
CONFIG_PSEUDOFS_SOFTLINKS is off by default. Running realpath() and
parent canonicalization there is dead weight that costs flash for no
security benefit.

Move the canonicalize_path helper, the in-root check, the new
includes, and O_NOFOLLOW behind #ifndef __PX4_NUTTX so the NuttX
build is functionally identical to main, except that _workOpen and
_workWrite now also call _validatePathIsWritable for write paths
(matching the pattern already used by the other writable opcodes).
On POSIX/SITL the symlink-resolution hardening is unchanged.

Drop the now-unused _validatePathIsInRoot declaration from the
header.

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-07 18:44:28 -07:00
Ramon Roche
446a66149a
fix(mavlink): drop FTP boot-hook deny, keep symlink hardening
The previous commits in this branch blocked all writes under
PX4_STORAGEDIR/etc/ as a defence against attacker-controlled boot
hook files (rc.txt, config.txt, extras.txt). That subtree is the
documented user customization point for PX4 startup, and QGC's
MAVFTP file manager is the supported way to upload it. Blocking
writes there breaks a legitimate workflow on top of an already
unauthenticated channel where the real mitigation is MAVLink
signing.

Drop the boot-hook deny block. The symlink/canonicalization
hardening (\_validatePathIsInRoot, O_NOFOLLOW, parent-resolved
realpath fallback) for GHSA-93v7-287q-qx4g stays.

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-07 18:38:14 -07:00
Ramon Roche
98c8447ef3
fix(mavlink): canonicalize FTP boot-hook deny check and fix style
Address review feedback on the FTP path validation hardening:

- Extract canonicalization into a static helper canonicalize_path() that
  resolves either the full path or the parent directory plus the
  reattached leaf, and reuse it from both the in-root check and the
  boot-hook deny check. The previous deny check matched the raw input
  string against the literal "PX4_STORAGEDIR/etc/" prefix, which could
  be bypassed by paths such as "./etc/x" or "//etc/x" when the leaf did
  not yet exist. The new check always compares the canonical absolute
  path against the canonical "PX4_STORAGEDIR/etc/" prefix.

- Update the canonicalize_path() doc comment to state that the result
  is always an absolute path produced by realpath(), so future
  maintainers do not have to re-derive that property.

- Add the missing blank line between the realpath success branch and
  the NuttX fallback so the file matches the project astyle rules.

Refs: GHSA-c6f8-f7w2-785x, GHSA-93v7-287q-qx4g
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-07 11:46:50 -07:00
Ramon Roche
96f90f6602
fix(mavlink): harden FTP path validation against unsafe write targets
Tighten path validation in MavlinkFTP so that FTP write operations
consistently reject unsafe targets and resolve symlinks before checking
the result against the FTP root.

Add a new helper _validatePathIsInRoot() that canonicalizes the
requested path with realpath() and verifies the result is contained
inside PX4_STORAGEDIR. For paths that do not yet exist (CreateFile,
CreateDirectory) the parent directory is canonicalized and the leaf
name reattached so the check still produces a meaningful result. NuttX
falls back to the previous string based prefix and traversal check
because realpath() is not available there.

Rewrite _validatePathIsWritable() to call the new in-root check on all
platforms, and to deny writes that target the boot executed startup
hook subtree (PX4_STORAGEDIR /etc/). Drop the NuttX only ifdef around
the existing prefix check so the same logic runs on POSIX builds too.

Apply _validatePathIsWritable() in _workOpen() for write mode opens
(O_WRONLY or O_RDWR), and add the missing _validatePath() call to
_workWrite() so the WriteFile opcode now matches the pattern used by
the other write capable opcodes.

Open the leaf file with O_NOFOLLOW where the platform provides it so a
TOCTOU race cannot redirect the leaf through a symlink between
validation and open(2).

Refs: GHSA-c6f8-f7w2-785x, GHSA-93v7-287q-qx4g
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-07 08:12:11 -07:00
PX4BuildBot
be631ed584 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-07 11:48:55 +00:00
Niklas Hauser
9e0cd2fcf3 Fix mtd command for very small partition sizes of just 32B 2026-04-07 13:42:12 +02:00
PX4BuildBot
44c128aade docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-05 10:41:00 +00:00
Andrew Wilkins
6912ae7b14
feat(test): fixed wing test cards (#26824) 2026-04-05 20:34:22 +10:00
PX4BuildBot
f19adb896c docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-05 08:19:15 +00:00
PX4 Build Bot
c3f90af3ef
docs(i18n): PX4 guide translations (Crowdin) - ko (#26976)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-04-05 18:12:28 +10:00
PX4 Build Bot
a5e55ffd75
docs(i18n): PX4 guide translations (Crowdin) - uk (#26977)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-04-05 18:12:10 +10:00
PX4 Build Bot
3b4df0aead
docs(i18n): PX4 guide translations (Crowdin) - zh-CN (#26978)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-04-05 18:11:58 +10:00
PX4BuildBot
8576e07b73 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-04 19:52:21 +00:00
Anil Kircaliali
83c41dcf87
refactor(navigator): remove unused parameters from computeReturnAltitude (#26969)
* Remove unused parameters from function signature and make the parameter accessors consistent

* Update the caller function signature

* Update src/modules/navigator/rtl.cpp

---------

Co-authored-by: Jacob Dahl <37091262+dakejahl@users.noreply.github.com>
2026-04-04 11:45:22 -08:00
PX4BuildBot
550b7148a5 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-04 08:09:27 +00:00
Jacob Dahl
047fddbcd8
fix(sensors): fix baro publish rate limiter aliasing (#26967)
Use timestamp_sample instead of time_now_us for the rate limiter check
to sync to the sensor clock rather than the wall clock.

Switch from direct timestamp assignment to epoch-advance
(_last_publication_timestamp += interval_us) with a catch-up guard to
prevent aliasing artifacts when the sensor sample rate is close to the
configured publication rate.
2026-04-04 00:02:21 -08:00
PX4BuildBot
dd2530bb09 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-04 03:27:16 +00:00
Mirko Denecke
897ff241ce docs(sensor/airspeed): add UAV-DEV GmbH DroneCAN Airspeed and Barometer Sensor 2026-04-03 21:20:34 -06:00
Hamish Willee
6f18fa39e8 fix: template_module update to best practise 2026-04-03 21:14:55 -06:00
Pavel Guzenfeld
348a558a15 fix(navigator): correct mission resume waypoint with camera triggering
getPreviousPositionItems() already decrements the start index
internally before searching. The call in on_activation() at line 227
passed _inactivation_index - 1, causing a double-decrement that made
the vehicle resume at waypoint n-2 instead of n-1.

All other call sites (rtl_mission_fast_reverse.cpp:81,
rtl_mission_fast_reverse.cpp:133, mission_base.cpp:1149) pass the
index directly without pre-decrementing.

The bug has been present since commit 007ed11bbe (June 2023).

Closes #26795

Signed-off-by: Pavel Guzenfeld <pavelgu@gmail.com>
2026-04-03 21:10:11 -06:00
PX4BuildBot
b412796fc7 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-04 03:03:41 +00:00
Silvan
6597c4680c feat(battery): enable use of BAT_n_I_OVERWRITE for all battery estimation sources
Signed-off-by: Silvan <silvan@auterion.com>
2026-04-03 20:57:05 -06:00
PX4BuildBot
df8747eb10 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-03 21:15:36 +00:00
Jacob Dahl
04134dccab
fix(uavcan): use node-published timestamps for CAN sensor bridges (#26945)
The FC-side DroneCAN sensor bridges (accel, gyro, rangefinder) used
hrt_absolute_time() in the receive callback as timestamp_sample,
adding ~3-16ms of systematic CAN transport delay.

For messages with a uavcan.Timestamp field, the cannode can publish
the actual sample time via UAVCAN GlobalTimeSync. The RawIMU publisher
already did this for IMU data; apply the same pattern to the range
sensor publisher, and update all three FC bridges to prefer the
message timestamp with a fallback to hrt_absolute_time() for nodes
that don't set it.
2026-04-03 13:08:24 -08:00
PX4BuildBot
4d0efccb55 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-03 18:38:09 +00:00
Baardrw
115f205cbc
docs(gz_bridge): magnetometer device address documentation (#26940)
* fix: added comment explaining why dev id address can only be 3 or 4

* fix: change link to point to main px4 repo

* fix: typo

* formatted

* chore: formatting
2026-04-03 10:31:29 -08:00
Ramon Roche
039ec78d35 fix(ci): copy events metadata to top-level artifact directory
The packaging script only placed all_events.json.xz in an events/
subdirectory, but the firmware advertises the metadata URI at the
board directory top level. New build targets added after the
Jenkins-to-GHA migration had no legacy top-level copy, causing
QGC to get a 404 when fetching component metadata.

Fixes #26963

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-02 23:04:54 -06:00
PX4BuildBot
9cfd3a4506 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-03 01:03:39 +00:00
Ramon Roche
4281faa98a fix(docs): correct image path case mismatch in cuav_x25-evo pages
The asset file was renamed from X25-EVO.jpg to x25_evo.jpg in git but
all four locale files (en, ko, uk, zh) still referenced the old name.
macOS hid this because its filesystem is case-insensitive, but Linux CI
(case-sensitive) intermittently failed to resolve the reference during
Rollup bundling.

Fixes #26958

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-02 18:56:52 -06:00
PX4BuildBot
5189d42d68 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-02 23:37:34 +00:00
Jacob Dahl
9b6e7cb800
fix(ekf2): allow optical flow to start when range finder is height reference (#26960)
When EKF2_HGT_REF=2 (range sensor) with no GPS, optical flow could
never start. The starting condition required isTerrainEstimateValid()
or isHorizontalAidingActive(), but terrain is never "estimated" when
range is the height reference (ground is the datum, terrain state is
fixed at 0), and there's no horizontal aiding without GPS.

HAGL is directly known from the range measurement in this case, so
optical flow has everything it needs to fuse. Add the range height
reference check to the optical flow starting conditions.

Fixes: https://github.com/PX4/PX4-Autopilot/issues/25248
2026-04-02 15:30:24 -08:00
PX4BuildBot
ed387555e9 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-02 21:10:45 +00:00
Ramon Roche
dd03e18fee ci(packaging): publish container images with :latest tag
Add :latest tag alongside version tags for per-arch images and
multi-arch manifests on both Docker Hub and GHCR.

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-02 15:03:04 -06:00
Ramon Roche
1079c57fd0 build(packaging): add PX4 SITL .deb packages
Add cmake/cpack infrastructure for building .deb packages from
px4_sitl_sih and px4_sitl_default targets. Includes install rules,
package scripts, Gazebo wrapper, and CI workflow.

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-02 15:03:04 -06:00
Julian Oes
ebe0b727d8
fix(kakuteh7-wing): fix BOARD_FLASH_SECTORS to protect param sectors (#26897)
Set BOARD_FLASH_SECTORS to 13 so the bootloader does not erase the
parameter sectors (14 and 15) during firmware updates. Previously set
to 14 which allowed the bootloader to erase sector 14, potentially
wiping stored parameters.
2026-04-03 09:22:48 +13:00
Anil Kircaliali
ad895f7010
fix(setup): pin setuptools version to resolve pkg_resources ModuleNotFoundError (#26956) 2026-04-02 20:04:40 +02:00
Ramon Roche
685f9248e4 fix(sbom): fix false positives in monthly license audit
Three issues caused the monthly audit to report already-resolved submodules:

1. The audit workflow grepped for "NOASSERTION" anywhere in the output,
   matching the Detected column even when the Final column had a valid
   override (e.g. libtomcrypt detected as NOASSERTION but overridden to
   Unlicense). Changed to grep for "<-- UNRESOLVED" marker instead.

2. Submodules with an explicit NOASSERTION override in license-overrides.yaml
   (like libfc-sensor-api, which is proprietary) were still counted as
   failures. Now treated as "acknowledged" since someone intentionally
   added the override entry.

3. Added missing BSD-3-Clause override for sitl_gazebo-classic (PX4 org
   project with no LICENSE file in repo).

Fixes #26932

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
2026-04-02 11:15:30 -06:00
PX4BuildBot
0ffa4e72ac docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-02 14:27:39 +00:00
Marco Hauswirth
c8a1a38147 style(ekf2): minor style fixes 2026-04-02 16:20:19 +02:00
Marco Hauswirth
8624682db1 chore(boards): remove optical flow from holybro-kakutef7 build 2026-04-02 16:20:19 +02:00
Marco Hauswirth
4caee55a76 submodule(mavlink): update to latest mavlink/main to include ESTIMATOR_SENSOR_FUSION_STATUS, MAV_CMD_ESTIMATOR_SENSOR_ENABLE 2026-04-02 16:20:19 +02:00
Marco Hauswirth
fffc1b5d04 test(ekf2): sync EkfWrapper with FusionControl enabled flags
EkfWrapper now holds a FusionControl pointer and enables all sensors
by default. Sensor-specific enable methods also set fc.enabled = true.
2026-04-02 16:20:19 +02:00
Marco Hauswirth
6a7e39aa64 feat(mavlink): ESTIMATOR_SENSOR_FUSION_STATUS stream
Add MAVLink stream that maps EstimatorFusionControl uORB message to
ESTIMATOR_SENSOR_FUSION_STATUS, exposing per-sensor intended/active
bitmasks to the GCS.
2026-04-02 16:20:19 +02:00
Marco Hauswirth
6306c78f79 feat(ekf2): EKF2_SENS_EN param, SensEnBit enum, MAVLink fusion command
Add EKF2_SENS_EN bitmask parameter (replaces EKF2_EN_BOOT) with
per-sensor enable bits. initFusionControl reads SENS_EN while disarmed.
handleSensorFusionCommand sets FusionSensor.enabled via
VEHICLE_CMD_ESTIMATOR_SENSOR_ENABLE. syncSensEnParam writes back to
param on disarm. Update EstimatorFusionControl.msg to bool
intended/active fields. Update VehicleCommand.msg FUSION_SOURCE enum.
2026-04-02 16:20:19 +02:00
Marco Hauswirth
b9a1c429b3 refactor(ekf2): FusionSensor available/enabled/intended() data model
Split FusionSensor into available (CTRL param != disabled) and enabled
(runtime-toggleable). intended() = enabled && available. EKF core aid
sources now set available themselves and use intended() or _params
directly for CTRL-level checks. Remove drag/imu from FusionControl,
add aspd/rngbcn. Add AGP sourceFusingBitmask() for active-status.
2026-04-02 16:20:19 +02:00
Marco Hauswirth
0dd1640a54 feat(ekf2): enable fusion-ctrl toggle over mavlink cmd, CTRL param act only as reference 2026-04-02 16:20:19 +02:00
PX4BuildBot
2828162f72 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-02 09:56:18 +00:00
Nick
76eca4b7a4
feat(actuators): Control Flaps from AUX channel (#26913)
* feat(rc): flaps via AUX channel

* docs(actuators): add flaps and spoilers from RC

Co-authored-by: Silvan Fuhrer <silvan@auterion.com>

* docs(actuators): Update docs/en/payloads/generic_actuator_control.md

Co-authored-by: Hamish Willee <hamishwillee@gmail.com>

* docs(actuators): move flaps setup docs

---------

Co-authored-by: Silvan Fuhrer <silvan@auterion.com>
Co-authored-by: Hamish Willee <hamishwillee@gmail.com>
2026-04-02 11:48:44 +02:00
PX4BuildBot
0b621009d5 docs: auto-sync metadata [skip ci]
Co-Authored-By: PX4 BuildBot <bot@px4.io>
2026-04-02 09:27:30 +00:00