From 4794cdb12004fc2cb17369297c0b087f546ef3f9 Mon Sep 17 00:00:00 2001 From: TheMalkavien Date: Fri, 27 Sep 2024 00:44:11 +0200 Subject: [PATCH 01/12] Fix (some ?) memory alignment issues on the crypto part - resulting in crashes or strange behavior (#4867) * Replace multiple potentially non aligned pointer dereference (#4855) First step to fix some Crypto crashes or strange behaviors * Makes the two Crypto byte buffers aligned (#4855) Fix #4855, and probably multiple Crypto problems depending on hardware --------- Co-authored-by: Ben Meadors Co-authored-by: GUVWAF <78759985+GUVWAF@users.noreply.github.com> --- src/mesh/CryptoEngine.cpp | 18 +++++++++--------- src/mesh/Router.cpp | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp index f705bae03..f9d7b4ad2 100644 --- a/src/mesh/CryptoEngine.cpp +++ b/src/mesh/CryptoEngine.cpp @@ -70,8 +70,8 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, uint64_ long extraNonceTmp = random(); auth = bytesOut + numBytes; extraNonce = (uint32_t *)(auth + 8); - *extraNonce = extraNonceTmp; - LOG_INFO("Random nonce value: %d\n", *extraNonce); + memcpy(extraNonce, &extraNonceTmp, 4); // do not use dereference on potential non aligned pointers : *extraNonce = extraNonceTmp; + LOG_INFO("Random nonce value: %d\n", extraNonceTmp); meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(toNode); if (node->num < 1 || node->user.public_key.size == 0) { LOG_DEBUG("Node %d or their public_key not found\n", toNode); @@ -80,14 +80,14 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, uint64_ if (!crypto->setDHKey(toNode)) { return false; } - initNonce(fromNode, packetNum, *extraNonce); + initNonce(fromNode, packetNum, extraNonceTmp); // Calculate the shared secret with the destination node and encrypt printBytes("Attempting encrypt using nonce: ", nonce, 13); printBytes("Attempting encrypt using shared_key starting with: ", shared_key, 8); aes_ccm_ae(shared_key, 32, nonce, 8, bytes, numBytes, nullptr, 0, bytesOut, auth); // this can write up to 15 bytes longer than numbytes past bytesOut - *extraNonce = extraNonceTmp; + memcpy(extraNonce, &extraNonceTmp, 4); // do not use dereference on potential non aligned pointers : *extraNonce = extraNonceTmp; return true; } @@ -100,12 +100,12 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, uint64_ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, uint64_t packetNum, size_t numBytes, uint8_t *bytes, uint8_t *bytesOut) { uint8_t *auth; // set to last 8 bytes of text? - uint32_t *extraNonce; + uint32_t extraNonce; // pointer was not really used auth = bytes + numBytes - 12; - extraNonce = (uint32_t *)(auth + 8); - LOG_INFO("Random nonce value: %d\n", *extraNonce); + memcpy(&extraNonce, auth +8, 4); // do not use dereference on potential non aligned pointers : (uint32_t *)(auth + 8); + LOG_INFO("Random nonce value: %d\n", extraNonce); meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(fromNode); - + if (node == nullptr || node->num < 1 || node->user.public_key.size == 0) { LOG_DEBUG("Node or its public key not found in database\n"); return false; @@ -115,7 +115,7 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, uint64_t packetNum, size if (!crypto->setDHKey(fromNode)) { return false; } - initNonce(fromNode, packetNum, *extraNonce); + initNonce(fromNode, packetNum, extraNonce); printBytes("Attempting decrypt using nonce: ", nonce, 13); printBytes("Attempting decrypt using shared_key starting with: ", shared_key, 8); return aes_ccm_ad(shared_key, 32, nonce, 8, bytes, numBytes - 12, nullptr, 0, auth, bytesOut); diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index a993ee7c0..f06f54165 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -36,8 +36,8 @@ static MemoryDynamic staticPool; Allocator &packetPool = staticPool; -static uint8_t bytes[MAX_LORA_PAYLOAD_LEN + 1]; -static uint8_t ScratchEncrypted[MAX_LORA_PAYLOAD_LEN + 1]; +static uint8_t bytes[MAX_LORA_PAYLOAD_LEN + 1] __attribute__ ((__aligned__)); +static uint8_t ScratchEncrypted[MAX_LORA_PAYLOAD_LEN + 1] __attribute__ ((__aligned__)); /** * Constructor From 5f6d9c3e27b1bc3d85b0b729ee924399dc4b7486 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 26 Sep 2024 19:33:08 -0500 Subject: [PATCH 02/12] Add pkc test (#4878) * Add a second delay() to get the unit tests running on Rak4631 * Add test_PKC_Decrypt * Remove cruft from test case --- src/mesh/CryptoEngine.cpp | 2 ++ test/test_crypto/test_main.cpp | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp index f9d7b4ad2..7b5c8f2bd 100644 --- a/src/mesh/CryptoEngine.cpp +++ b/src/mesh/CryptoEngine.cpp @@ -102,6 +102,7 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, uint64_t packetNum, size uint8_t *auth; // set to last 8 bytes of text? uint32_t extraNonce; // pointer was not really used auth = bytes + numBytes - 12; +#ifndef PIO_UNIT_TESTING memcpy(&extraNonce, auth +8, 4); // do not use dereference on potential non aligned pointers : (uint32_t *)(auth + 8); LOG_INFO("Random nonce value: %d\n", extraNonce); meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(fromNode); @@ -115,6 +116,7 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, uint64_t packetNum, size if (!crypto->setDHKey(fromNode)) { return false; } +#endif initNonce(fromNode, packetNum, extraNonce); printBytes("Attempting decrypt using nonce: ", nonce, 13); printBytes("Attempting decrypt using shared_key starting with: ", shared_key, 8); diff --git a/test/test_crypto/test_main.cpp b/test/test_crypto/test_main.cpp index 0c820178a..cbe366048 100644 --- a/test/test_crypto/test_main.cpp +++ b/test/test_crypto/test_main.cpp @@ -98,7 +98,44 @@ void test_DH25519(void) HexToBytes(private_key, "18630f93598637c35da623a74559cf944374a559114c7937811041fc8605564a"); crypto->setDHPrivateKey(private_key); TEST_ASSERT(!crypto->setDHPublicKey(public_key)); // Weak public key results in 0 shared key + + HexToBytes(public_key, "f7e13a1a067d2f4e1061bf9936fde5be6b0c2494a8f809cbac7f290ef719e91c"); + HexToBytes(private_key, "10300724f3bea134eb1575245ef26ff9b8ccd59849cd98ce1a59002fe1d5986c"); + HexToBytes(expected_shared, "24becd5dfed9e9289ba2e15b82b0d54f8e9aacb72f5e4248c58d8d74b451ce76"); + crypto->setDHPrivateKey(private_key); + TEST_ASSERT(crypto->setDHPublicKey(public_key)); + crypto->hash(crypto->shared_key, 32); + TEST_ASSERT_EQUAL_MEMORY(expected_shared, crypto->shared_key, 32); } + +void test_PKC_Decrypt(void) +{ + uint8_t private_key[32]; + uint8_t public_key[32]; + uint8_t expected_shared[32]; + uint8_t expected_decrypted[32]; + uint8_t radioBytes[128] __attribute__((__aligned__)); + uint8_t decrypted[128] __attribute__((__aligned__)); + uint8_t expected_nonce[16]; + + uint32_t fromNode; + HexToBytes(public_key, "db18fc50eea47f00251cb784819a3cf5fc361882597f589f0d7ff820e8064457"); + HexToBytes(private_key, "a00330633e63522f8a4d81ec6d9d1e6617f6c8ffd3a4c698229537d44e522277"); + HexToBytes(expected_shared, "777b1545c9d6f9a2"); + HexToBytes(expected_decrypted, "08011204746573744800"); + HexToBytes(radioBytes, "8c646d7a2909000062d6b2136b00000040df24abfcc30a17a3d9046726099e796a1c036a792b"); + HexToBytes(expected_nonce, "62d6b213036a792b2909000000"); + fromNode = 0x0929; + crypto->setDHPrivateKey(private_key); + TEST_ASSERT(crypto->setDHPublicKey(public_key)); + crypto->hash(crypto->shared_key, 32); + crypto->decryptCurve25519(fromNode, 0x13b2d662, 22, radioBytes + 16, decrypted); + TEST_ASSERT_EQUAL_MEMORY(expected_shared, crypto->shared_key, 8); + TEST_ASSERT_EQUAL_MEMORY(expected_nonce, crypto->nonce, 13); + + TEST_ASSERT_EQUAL_MEMORY(expected_decrypted, decrypted, 10); +} + void test_AES_CTR(void) { uint8_t expected[32]; @@ -137,6 +174,7 @@ void setup() RUN_TEST(test_ECB_AES256); RUN_TEST(test_DH25519); RUN_TEST(test_AES_CTR); + RUN_TEST(test_PKC_Decrypt); } void loop() From 30356dcd970cef2c33e8cbf74ddcf7ba71a6c66c Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Thu, 26 Sep 2024 19:46:17 -0500 Subject: [PATCH 03/12] Retroactive trunkinate --- src/mesh/CryptoEngine.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp index 7b5c8f2bd..535e11e9b 100644 --- a/src/mesh/CryptoEngine.cpp +++ b/src/mesh/CryptoEngine.cpp @@ -70,7 +70,8 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, uint64_ long extraNonceTmp = random(); auth = bytesOut + numBytes; extraNonce = (uint32_t *)(auth + 8); - memcpy(extraNonce, &extraNonceTmp, 4); // do not use dereference on potential non aligned pointers : *extraNonce = extraNonceTmp; + memcpy(extraNonce, &extraNonceTmp, + 4); // do not use dereference on potential non aligned pointers : *extraNonce = extraNonceTmp; LOG_INFO("Random nonce value: %d\n", extraNonceTmp); meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(toNode); if (node->num < 1 || node->user.public_key.size == 0) { @@ -87,7 +88,8 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, uint64_ printBytes("Attempting encrypt using shared_key starting with: ", shared_key, 8); aes_ccm_ae(shared_key, 32, nonce, 8, bytes, numBytes, nullptr, 0, bytesOut, auth); // this can write up to 15 bytes longer than numbytes past bytesOut - memcpy(extraNonce, &extraNonceTmp, 4); // do not use dereference on potential non aligned pointers : *extraNonce = extraNonceTmp; + memcpy(extraNonce, &extraNonceTmp, + 4); // do not use dereference on potential non aligned pointers : *extraNonce = extraNonceTmp; return true; } @@ -99,14 +101,14 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, uint64_ */ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, uint64_t packetNum, size_t numBytes, uint8_t *bytes, uint8_t *bytesOut) { - uint8_t *auth; // set to last 8 bytes of text? + uint8_t *auth; // set to last 8 bytes of text? uint32_t extraNonce; // pointer was not really used auth = bytes + numBytes - 12; #ifndef PIO_UNIT_TESTING - memcpy(&extraNonce, auth +8, 4); // do not use dereference on potential non aligned pointers : (uint32_t *)(auth + 8); + memcpy(&extraNonce, auth + 8, 4); // do not use dereference on potential non aligned pointers : (uint32_t *)(auth + 8); LOG_INFO("Random nonce value: %d\n", extraNonce); meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(fromNode); - + if (node == nullptr || node->num < 1 || node->user.public_key.size == 0) { LOG_DEBUG("Node or its public key not found in database\n"); return false; From 743fc2e812ff1c7ec40dcbdb1bc1656565febd87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 09:07:14 +0200 Subject: [PATCH 04/12] Update radiolib, fixes CRC bug on SX127x and improves LR11xx support --- platformio.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index b3898ba93..799645306 100644 --- a/platformio.ini +++ b/platformio.ini @@ -88,7 +88,9 @@ monitor_speed = 115200 monitor_filters = direct lib_deps = - jgromes/RadioLib@~7.0.0 + ;jgromes/RadioLib@~7.0.0 + ;7.0.1pre needed for LR1121 support and SX127x CRC Bugfix + https://github.com/jgromes/RadioLib.git#42ae7c92ed584317d7206cfc463ba6260295dbbc https://github.com/meshtastic/esp8266-oled-ssd1306.git#e16cee124fe26490cb14880c679321ad8ac89c95 ; ESP8266_SSD1306 https://github.com/mathertel/OneButton@~2.6.1 ; OneButton library for non-blocking button debounce https://github.com/meshtastic/arduino-fsm.git#7db3702bf0cfe97b783d6c72595e3f38e0b19159 From 40932ea06c55d2441ff239fce37de04bc0e6f55d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 10:21:34 +0200 Subject: [PATCH 05/12] update ci builder to include a 'quick' command line option that only outputs 3 random devices or check targets --- bin/generate_ci_matrix.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/generate_ci_matrix.py b/bin/generate_ci_matrix.py index 46398dd59..ea2480c58 100755 --- a/bin/generate_ci_matrix.py +++ b/bin/generate_ci_matrix.py @@ -6,6 +6,7 @@ import configparser import json import os import sys +import random rootdir = "variants/" @@ -39,5 +40,7 @@ for subdir, dirs, files in os.walk(rootdir): "check" in options ): outlist.append(section) - -print(json.dumps(outlist)) +if ("quick" in options): + print(json.dumps(random.sample(outlist, 3))) +else: + print(json.dumps(outlist)) From 39febad63057fd21c8b2a87ed6bcb8872449a646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 10:25:37 +0200 Subject: [PATCH 06/12] only sample a few builds for CI runs --- .github/workflows/main_matrix.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index ca9f1d37f..bb42f2246 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -20,7 +20,33 @@ on: workflow_dispatch: jobs: + setup-quick: + if: ${{ github.event_name != 'workflow_dispatch' }} + strategy: + fail-fast: false + matrix: + arch: [esp32, esp32s3, esp32c3, nrf52840, rp2040, stm32, check] + runs-on: ubuntu-latest + steps: + - id: checkout + uses: actions/checkout@v4 + name: Checkout base + - id: jsonStep + run: | + TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}} quick) + echo "$TARGETS" + echo "${{matrix.arch}}=$(jq -cn --argjson environments "$TARGETS" '{board: $environments}')" >> $GITHUB_OUTPUT + outputs: + esp32: ${{ steps.jsonStep.outputs.esp32 }} + esp32s3: ${{ steps.jsonStep.outputs.esp32s3 }} + esp32c3: ${{ steps.jsonStep.outputs.esp32c3 }} + nrf52840: ${{ steps.jsonStep.outputs.nrf52840 }} + rp2040: ${{ steps.jsonStep.outputs.rp2040 }} + stm32: ${{ steps.jsonStep.outputs.stm32 }} + check: ${{ steps.jsonStep.outputs.check }} + setup: + if: ${{ github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: From c35d780236fe235721910e74923367a7568e5397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 10:27:57 +0200 Subject: [PATCH 07/12] only randominze for at least 3 elements --- bin/generate_ci_matrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/generate_ci_matrix.py b/bin/generate_ci_matrix.py index ea2480c58..4d8759ecc 100755 --- a/bin/generate_ci_matrix.py +++ b/bin/generate_ci_matrix.py @@ -40,7 +40,7 @@ for subdir, dirs, files in os.walk(rootdir): "check" in options ): outlist.append(section) -if ("quick" in options): +if ("quick" in options) & (len(outlist) > 3): print(json.dumps(random.sample(outlist, 3))) else: print(json.dumps(outlist)) From bdb998c7637ab153cc704b407b86b1e5d3f8a786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 10:33:16 +0200 Subject: [PATCH 08/12] pick either setup or setup-quick as valid --- .github/workflows/main_matrix.yml | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index bb42f2246..730241f50 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -71,13 +71,15 @@ jobs: check: ${{ steps.jsonStep.outputs.check }} check: - needs: setup + needs: [ setup, setup-quick ] strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.check) }} runs-on: ubuntu-latest - if: ${{ github.event_name != 'workflow_dispatch' }} + if: | + always() + && ${{ github.event_name != 'workflow_dispatch' }} steps: - uses: actions/checkout@v4 - name: Build base @@ -87,7 +89,8 @@ jobs: run: bin/check-all.sh ${{ matrix.board }} build-esp32: - needs: setup + needs: [ setup, setup-quick ] + if: always() strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32) }} @@ -96,7 +99,8 @@ jobs: board: ${{ matrix.board }} build-esp32-s3: - needs: setup + needs: [ setup, setup-quick ] + if: always() strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32s3) }} @@ -105,7 +109,8 @@ jobs: board: ${{ matrix.board }} build-esp32-c3: - needs: setup + needs: [ setup, setup-quick ] + if: always() strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32c3) }} @@ -114,7 +119,8 @@ jobs: board: ${{ matrix.board }} build-nrf52: - needs: setup + needs: [ setup, setup-quick ] + if: always() strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.nrf52840) }} @@ -123,7 +129,8 @@ jobs: board: ${{ matrix.board }} build-rpi2040: - needs: setup + needs: [ setup, setup-quick ] + if: always() strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.rp2040) }} @@ -132,7 +139,8 @@ jobs: board: ${{ matrix.board }} build-stm32: - needs: setup + needs: [ setup, setup-quick ] + if: always() strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.stm32) }} From e02a7d1c68c9efaa7c2d5ed521d7ac2df6680bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 10:36:00 +0200 Subject: [PATCH 09/12] test if quick is working at all --- .github/workflows/main_matrix.yml | 53 ++++++------------------------- 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index 730241f50..ffe777f7e 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -20,8 +20,8 @@ on: workflow_dispatch: jobs: - setup-quick: - if: ${{ github.event_name != 'workflow_dispatch' }} + setup: + if: ${{ github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: @@ -45,41 +45,14 @@ jobs: stm32: ${{ steps.jsonStep.outputs.stm32 }} check: ${{ steps.jsonStep.outputs.check }} - setup: - if: ${{ github.event_name == 'workflow_dispatch' }} - strategy: - fail-fast: false - matrix: - arch: [esp32, esp32s3, esp32c3, nrf52840, rp2040, stm32, check] - runs-on: ubuntu-latest - steps: - - id: checkout - uses: actions/checkout@v4 - name: Checkout base - - id: jsonStep - run: | - TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}}) - echo "$TARGETS" - echo "${{matrix.arch}}=$(jq -cn --argjson environments "$TARGETS" '{board: $environments}')" >> $GITHUB_OUTPUT - outputs: - esp32: ${{ steps.jsonStep.outputs.esp32 }} - esp32s3: ${{ steps.jsonStep.outputs.esp32s3 }} - esp32c3: ${{ steps.jsonStep.outputs.esp32c3 }} - nrf52840: ${{ steps.jsonStep.outputs.nrf52840 }} - rp2040: ${{ steps.jsonStep.outputs.rp2040 }} - stm32: ${{ steps.jsonStep.outputs.stm32 }} - check: ${{ steps.jsonStep.outputs.check }} - check: - needs: [ setup, setup-quick ] + needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.check) }} runs-on: ubuntu-latest - if: | - always() - && ${{ github.event_name != 'workflow_dispatch' }} + if: ${{ github.event_name != 'workflow_dispatch' }} steps: - uses: actions/checkout@v4 - name: Build base @@ -89,8 +62,7 @@ jobs: run: bin/check-all.sh ${{ matrix.board }} build-esp32: - needs: [ setup, setup-quick ] - if: always() + needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32) }} @@ -99,8 +71,7 @@ jobs: board: ${{ matrix.board }} build-esp32-s3: - needs: [ setup, setup-quick ] - if: always() + needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32s3) }} @@ -109,8 +80,7 @@ jobs: board: ${{ matrix.board }} build-esp32-c3: - needs: [ setup, setup-quick ] - if: always() + needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.esp32c3) }} @@ -119,8 +89,7 @@ jobs: board: ${{ matrix.board }} build-nrf52: - needs: [ setup, setup-quick ] - if: always() + needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.nrf52840) }} @@ -129,8 +98,7 @@ jobs: board: ${{ matrix.board }} build-rpi2040: - needs: [ setup, setup-quick ] - if: always() + needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.rp2040) }} @@ -139,8 +107,7 @@ jobs: board: ${{ matrix.board }} build-stm32: - needs: [ setup, setup-quick ] - if: always() + needs: setup strategy: fail-fast: false matrix: ${{ fromJson(needs.setup.outputs.stm32) }} From 747046d3351d8ae0a74862e6c294c37e9348405f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 10:37:15 +0200 Subject: [PATCH 10/12] nope --- .github/workflows/main_matrix.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index ffe777f7e..87ba8cf85 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -21,7 +21,6 @@ on: jobs: setup: - if: ${{ github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false matrix: From ae14ca78703eee9ec4a5c342ff16f21139106041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 27 Sep 2024 10:42:27 +0200 Subject: [PATCH 11/12] the name is somewhat misleading --- .github/workflows/build_stm32.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_stm32.yml b/.github/workflows/build_stm32.yml index 6858812e1..e78178db3 100644 --- a/.github/workflows/build_stm32.yml +++ b/.github/workflows/build_stm32.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Build Raspberry Pi 2040 + - name: Build STM32WL id: build uses: ./.github/actions/build-variant with: From ef223b1195453f89edef1edbc3ff933e835037d2 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Fri, 27 Sep 2024 14:55:55 -0500 Subject: [PATCH 12/12] use delete[] to avoid leaking memory (#4883) --- src/meshUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meshUtils.cpp b/src/meshUtils.cpp index 2789a143c..e98a6f1ce 100644 --- a/src/meshUtils.cpp +++ b/src/meshUtils.cpp @@ -68,7 +68,7 @@ void printBytes(const char *label, const uint8_t *p, size_t numbytes) snprintf(messageBuffer + labelSize + i * 3, 4, " %02x", p[i]); strcpy(messageBuffer + labelSize + numbytes * 3, "\n"); LOG_DEBUG(messageBuffer); - delete messageBuffer; + delete[] messageBuffer; } }