fix(settings): neue Felder erst ab dem alten sizeof - sonst war sACN nach dem Update aus
Ein Datensatz aus der Firmware vor diesem Zweig ist 208 Byte lang und traegt hinter wake_on_change (206) noch ein Fuellbyte. sacn_enabled lag auf genau diesem Byte (207), und read_rec() kopiert hdr.length Bytes ueber die Vorgaben - jede Lampe im Feld waere nach der OTA mit sacn_enabled == 0 hochgekommen und haette keinen Socket gebunden, genau das Gegenteil dessen, was Spezifikation und README versprechen. _legacy_pad schiebt das erste neue Feld auf 208; _padding schrumpft auf 1 Byte, damit sizeof ein Vielfaches von 4 bleibt (216). nl_settings_legacy_check pinnt den Offset zur Uebersetzungszeit fest, denn die bisherige Pruefung sah nur die Teilbarkeit durch 4 und liess diesen Fall durch. Der Test kuerzte auf offsetof(sacn_enabled) - eine Laenge, die es auf keiner Lampe je gab - und ging deshalb durch; er kuerzt jetzt auf die Literalzahl 208 und stellt das Fuellbyte nach.
This commit is contained in:
@@ -208,14 +208,21 @@ static void test_sacn_roundtrip(void)
|
||||
}
|
||||
|
||||
/* Ein Datensatz aus einer Firmware VOR sACN: die vier Felder muessen als echte Vorgaben
|
||||
* zurueckkommen, nicht als Null - sonst waere sACN auf jeder aktualisierten Lampe aus. */
|
||||
* zurueckkommen, nicht als Null - sonst waere sACN auf jeder aktualisierten Lampe aus.
|
||||
* Die Laenge ist bewusst die Literalzahl 208: das war sizeof(nl_settings_t) vor diesem
|
||||
* Zweig und damit die Laenge, die auf jeder ausgelieferten Lampe im Flash steht. Ein
|
||||
* offsetof() auf ein heutiges Feld wuerde mit der Struktur mitwandern und genau den Fall
|
||||
* verfehlen, um den es hier geht. Das letzte Byte (207) war im 208-Byte-Satz reines
|
||||
* Fuellbyte und daher 0 - es wird hier nachgestellt, denn genau dieses Byte legt sich
|
||||
* beim Lesen ueber das erste neue Feld. */
|
||||
static void test_record_without_sacn_gets_defaults(void)
|
||||
{
|
||||
nl_settings_t in = sample("alt"), out;
|
||||
uint32_t crc;
|
||||
nl_settings_save(&in);
|
||||
{
|
||||
uint16_t shorter = (uint16_t)offsetof(nl_settings_t, sacn_enabled);
|
||||
uint16_t shorter = 208u; /* sizeof(nl_settings_t) vor sACN */
|
||||
fake_flash_mem[NL_FL_SETTINGS_A + 12 + 207] = 0; /* Fuellbyte des alten Satzes */
|
||||
memcpy(&fake_flash_mem[NL_FL_SETTINGS_A + 6], &shorter, 2);
|
||||
crc = nl_crc32(0, &fake_flash_mem[NL_FL_SETTINGS_A], 12 + shorter);
|
||||
memcpy(&fake_flash_mem[NL_FL_SETTINGS_A + 12 + shorter], &crc, 4);
|
||||
|
||||
Reference in New Issue
Block a user