Coverage Report

Created: 2025-11-24 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-uf2-struct.c
Line
Count
Source
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include <glib.h>
5
6
#include "fu-uf2-struct.h"
7
#include "fu-byte-array.h"
8
#include "fu-mem-private.h"
9
#include "fu-string.h"
10
11
#ifdef G_LOG_DOMAIN
12
  #undef G_LOG_DOMAIN
13
#endif
14
0
#define G_LOG_DOMAIN "FuStruct"
15
16
static const gchar *
17
fu_uf2_firmware_block_flags_to_string(FuUf2FirmwareBlockFlags val)
18
0
{
19
0
    if (val == FU_UF2_FIRMWARE_BLOCK_FLAG_NONE)
20
0
        return "none";
21
0
    if (val == FU_UF2_FIRMWARE_BLOCK_FLAG_NOFLASH)
22
0
        return "noflash";
23
0
    if (val == FU_UF2_FIRMWARE_BLOCK_FLAG_IS_CONTAINER)
24
0
        return "is-container";
25
0
    if (val == FU_UF2_FIRMWARE_BLOCK_FLAG_HAS_FAMILY)
26
0
        return "has-family";
27
0
    if (val == FU_UF2_FIRMWARE_BLOCK_FLAG_HAS_MD5)
28
0
        return "has-md5";
29
0
    if (val == FU_UF2_FIRMWARE_BLOCK_FLAG_HAS_EXTENSION_TAG)
30
0
        return "has-extension-tag";
31
0
    return NULL;
32
0
}
33
34
const gchar *
35
fu_uf2_firmware_tag_to_string(FuUf2FirmwareTag val)
36
7
{
37
7
    if (val == FU_UF2_FIRMWARE_TAG_VERSION)
38
0
        return "version";
39
7
    if (val == FU_UF2_FIRMWARE_TAG_DESCRIPTION)
40
0
        return "description";
41
7
    if (val == FU_UF2_FIRMWARE_TAG_PAGE_SZ)
42
0
        return "page-sz";
43
7
    if (val == FU_UF2_FIRMWARE_TAG_SHA2)
44
0
        return "sha2";
45
7
    if (val == FU_UF2_FIRMWARE_TAG_DEVICE_ID)
46
0
        return "device-id";
47
7
    return NULL;
48
7
}
49
/**
50
 * fu_struct_uf2_extension_ref: (skip):
51
 **/
52
FuStructUf2Extension *
53
fu_struct_uf2_extension_ref(FuStructUf2Extension *st)
54
0
{
55
0
    g_return_val_if_fail(st != NULL, NULL);
56
0
    st->refcount++;
57
0
    return st;
58
0
}
59
/**
60
 * fu_struct_uf2_extension_unref: (skip):
61
 **/
62
void
63
fu_struct_uf2_extension_unref(FuStructUf2Extension *st)
64
11.2k
{
65
11.2k
    g_return_if_fail(st != NULL);
66
11.2k
    if (st->refcount == 0) {
67
0
        g_critical("FuStructUf2Extension refcount already zero");
68
0
        return;
69
0
    }
70
11.2k
    if (--st->refcount > 0)
71
0
        return;
72
11.2k
    if (st->buf != NULL)
73
11.1k
        g_byte_array_unref(st->buf);
74
11.2k
    g_free(st);
75
11.2k
}
76
/**
77
 * fu_struct_uf2_extension_new_internal: (skip):
78
 **/
79
static FuStructUf2Extension *
80
fu_struct_uf2_extension_new_internal(void)
81
11.2k
{
82
11.2k
    FuStructUf2Extension *st = g_new0(FuStructUf2Extension, 1);
83
11.2k
    st->refcount = 1;
84
11.2k
    return st;
85
11.2k
}
86
87
/* getters */
88
/**
89
 * fu_struct_uf2_extension_get_size: (skip):
90
 **/
91
guint8
92
fu_struct_uf2_extension_get_size(const FuStructUf2Extension *st)
93
9.86k
{
94
9.86k
    g_return_val_if_fail(st != NULL, 0x0);
95
9.86k
    return st->buf->data[0];
96
9.86k
}
97
/**
98
 * fu_struct_uf2_extension_get_tag: (skip):
99
 **/
100
FuUf2FirmwareTag
101
fu_struct_uf2_extension_get_tag(const FuStructUf2Extension *st)
102
9.74k
{
103
9.74k
    g_return_val_if_fail(st != NULL, 0x0);
104
9.74k
    return fu_memread_uint24(st->buf->data + 1, G_LITTLE_ENDIAN);
105
9.74k
}
106
107
/* setters */
108
/**
109
 * fu_struct_uf2_extension_set_size: (skip):
110
 **/
111
void
112
fu_struct_uf2_extension_set_size(FuStructUf2Extension *st, guint8 value)
113
858
{
114
858
    g_return_if_fail(st != NULL);
115
858
    st->buf->data[0] = value;
116
858
}
117
/**
118
 * fu_struct_uf2_extension_set_tag: (skip):
119
 **/
120
void
121
fu_struct_uf2_extension_set_tag(FuStructUf2Extension *st, FuUf2FirmwareTag value)
122
858
{
123
858
    g_return_if_fail(st != NULL);
124
858
    fu_memwrite_uint24(st->buf->data + 1, value, G_LITTLE_ENDIAN);
125
858
}
126
/**
127
 * fu_struct_uf2_extension_new: (skip):
128
 **/
129
FuStructUf2Extension *
130
fu_struct_uf2_extension_new(void)
131
1.32k
{
132
1.32k
    FuStructUf2Extension *st = fu_struct_uf2_extension_new_internal();
133
1.32k
    st->buf = g_byte_array_sized_new(4);
134
1.32k
    fu_byte_array_set_size(st->buf, 4, 0x0);
135
1.32k
    return st;
136
1.32k
}
137
/**
138
 * fu_struct_uf2_extension_to_string: (skip):
139
 **/
140
static gchar *
141
fu_struct_uf2_extension_to_string(const FuStructUf2Extension *st)
142
0
{
143
0
    g_autoptr(GString) str = g_string_new("FuStructUf2Extension:\n");
144
0
    g_return_val_if_fail(st != NULL, NULL);
145
0
    g_string_append_printf(str, "  size: 0x%x\n",
146
0
                           (guint) fu_struct_uf2_extension_get_size(st));
147
0
    {
148
0
        const gchar *tmp = fu_uf2_firmware_tag_to_string(fu_struct_uf2_extension_get_tag(st));
149
0
        if (tmp != NULL) {
150
0
            g_string_append_printf(str, "  tag: 0x%x [%s]\n", (guint) fu_struct_uf2_extension_get_tag(st), tmp);
151
0
        } else {
152
0
            g_string_append_printf(str, "  tag: 0x%x\n", (guint) fu_struct_uf2_extension_get_tag(st));
153
0
        }
154
0
    }
155
0
    if (str->len > 0)
156
0
        g_string_set_size(str, str->len - 1);
157
0
    return g_string_free(g_steal_pointer(&str), FALSE);
158
0
}
159
static gboolean
160
fu_struct_uf2_extension_validate_internal(FuStructUf2Extension *st, GError **error)
161
9.86k
{
162
9.86k
    g_return_val_if_fail(st != NULL, FALSE);
163
9.86k
    return TRUE;
164
9.86k
}
165
static gboolean
166
fu_struct_uf2_extension_parse_internal(FuStructUf2Extension *st, GError **error)
167
9.86k
{
168
9.86k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
169
0
        g_autofree gchar *str = fu_struct_uf2_extension_to_string(st);
170
0
        g_debug("%s", str);
171
0
    }
172
9.86k
    if (!fu_struct_uf2_extension_validate_internal(st, error))
173
0
        return FALSE;
174
9.86k
    return TRUE;
175
9.86k
}
176
177
/**
178
 * fu_struct_uf2_extension_parse: (skip):
179
 **/
180
FuStructUf2Extension *
181
fu_struct_uf2_extension_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
182
9.88k
{
183
9.88k
    g_autoptr(FuStructUf2Extension) st = fu_struct_uf2_extension_new_internal();
184
9.88k
    g_return_val_if_fail(buf != NULL, NULL);
185
9.88k
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
186
9.88k
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
187
21
        g_prefix_error_literal(error, "invalid struct FuStructUf2Extension: ");
188
21
        return NULL;
189
21
    }
190
9.86k
    st->buf = g_byte_array_new();
191
9.86k
    g_byte_array_append(st->buf, buf + offset, 4);
192
9.86k
    if (!fu_struct_uf2_extension_parse_internal(st, error))
193
0
        return NULL;
194
9.86k
    return g_steal_pointer(&st);
195
9.86k
}
196
/**
197
 * fu_struct_uf2_ref: (skip):
198
 **/
199
FuStructUf2 *
200
fu_struct_uf2_ref(FuStructUf2 *st)
201
0
{
202
0
    g_return_val_if_fail(st != NULL, NULL);
203
0
    st->refcount++;
204
0
    return st;
205
0
}
206
/**
207
 * fu_struct_uf2_unref: (skip):
208
 **/
209
void
210
fu_struct_uf2_unref(FuStructUf2 *st)
211
2.05k
{
212
2.05k
    g_return_if_fail(st != NULL);
213
2.05k
    if (st->refcount == 0) {
214
0
        g_critical("FuStructUf2 refcount already zero");
215
0
        return;
216
0
    }
217
2.05k
    if (--st->refcount > 0)
218
0
        return;
219
2.05k
    if (st->buf != NULL)
220
1.17k
        g_byte_array_unref(st->buf);
221
2.05k
    g_free(st);
222
2.05k
}
223
/**
224
 * fu_struct_uf2_new_internal: (skip):
225
 **/
226
static FuStructUf2 *
227
fu_struct_uf2_new_internal(void)
228
2.05k
{
229
2.05k
    FuStructUf2 *st = g_new0(FuStructUf2, 1);
230
2.05k
    st->refcount = 1;
231
2.05k
    return st;
232
2.05k
}
233
234
/* getters */
235
/**
236
 * fu_struct_uf2_get_magic0: (skip):
237
 **/
238
static guint32
239
fu_struct_uf2_get_magic0(const FuStructUf2 *st)
240
1.23k
{
241
1.23k
    g_return_val_if_fail(st != NULL, 0x0);
242
1.23k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
243
1.23k
}
244
/**
245
 * fu_struct_uf2_get_magic1: (skip):
246
 **/
247
static guint32
248
fu_struct_uf2_get_magic1(const FuStructUf2 *st)
249
1.16k
{
250
1.16k
    g_return_val_if_fail(st != NULL, 0x0);
251
1.16k
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
252
1.16k
}
253
/**
254
 * fu_struct_uf2_get_flags: (skip):
255
 **/
256
FuUf2FirmwareBlockFlags
257
fu_struct_uf2_get_flags(const FuStructUf2 *st)
258
986
{
259
986
    g_return_val_if_fail(st != NULL, 0x0);
260
986
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
261
986
}
262
/**
263
 * fu_struct_uf2_get_target_addr: (skip):
264
 **/
265
guint32
266
fu_struct_uf2_get_target_addr(const FuStructUf2 *st)
267
359
{
268
359
    g_return_val_if_fail(st != NULL, 0x0);
269
359
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
270
359
}
271
/**
272
 * fu_struct_uf2_get_payload_size: (skip):
273
 **/
274
guint32
275
fu_struct_uf2_get_payload_size(const FuStructUf2 *st)
276
985
{
277
985
    g_return_val_if_fail(st != NULL, 0x0);
278
985
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
279
985
}
280
/**
281
 * fu_struct_uf2_get_block_no: (skip):
282
 **/
283
guint32
284
fu_struct_uf2_get_block_no(const FuStructUf2 *st)
285
1.00k
{
286
1.00k
    g_return_val_if_fail(st != NULL, 0x0);
287
1.00k
    return fu_memread_uint32(st->buf->data + 20, G_LITTLE_ENDIAN);
288
1.00k
}
289
/**
290
 * fu_struct_uf2_get_num_blocks: (skip):
291
 **/
292
guint32
293
fu_struct_uf2_get_num_blocks(const FuStructUf2 *st)
294
899
{
295
899
    g_return_val_if_fail(st != NULL, 0x0);
296
899
    return fu_memread_uint32(st->buf->data + 24, G_LITTLE_ENDIAN);
297
899
}
298
/**
299
 * fu_struct_uf2_get_family_id: (skip):
300
 **/
301
guint32
302
fu_struct_uf2_get_family_id(const FuStructUf2 *st)
303
711
{
304
711
    g_return_val_if_fail(st != NULL, 0x0);
305
711
    return fu_memread_uint32(st->buf->data + 28, G_LITTLE_ENDIAN);
306
711
}
307
/**
308
 * fu_struct_uf2_get_data: (skip):
309
 **/
310
const guint8 *
311
fu_struct_uf2_get_data(const FuStructUf2 *st, gsize *bufsz)
312
896
{
313
896
    g_return_val_if_fail(st != NULL, NULL);
314
896
    if (bufsz != NULL)
315
0
        *bufsz = 476;
316
896
    return st->buf->data + 32;
317
896
}
318
/**
319
 * fu_struct_uf2_get_magic_end: (skip):
320
 **/
321
static guint32
322
fu_struct_uf2_get_magic_end(const FuStructUf2 *st)
323
1.14k
{
324
1.14k
    g_return_val_if_fail(st != NULL, 0x0);
325
1.14k
    return fu_memread_uint32(st->buf->data + 508, G_LITTLE_ENDIAN);
326
1.14k
}
327
328
/* setters */
329
/**
330
 * fu_struct_uf2_set_magic0: (skip):
331
 **/
332
static void
333
fu_struct_uf2_set_magic0(FuStructUf2 *st, guint32 value)
334
836
{
335
836
    g_return_if_fail(st != NULL);
336
836
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
337
836
}
338
/**
339
 * fu_struct_uf2_set_magic1: (skip):
340
 **/
341
static void
342
fu_struct_uf2_set_magic1(FuStructUf2 *st, guint32 value)
343
836
{
344
836
    g_return_if_fail(st != NULL);
345
836
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
346
836
}
347
/**
348
 * fu_struct_uf2_set_flags: (skip):
349
 **/
350
void
351
fu_struct_uf2_set_flags(FuStructUf2 *st, FuUf2FirmwareBlockFlags value)
352
836
{
353
836
    g_return_if_fail(st != NULL);
354
836
    fu_memwrite_uint32(st->buf->data + 8, value, G_LITTLE_ENDIAN);
355
836
}
356
/**
357
 * fu_struct_uf2_set_target_addr: (skip):
358
 **/
359
void
360
fu_struct_uf2_set_target_addr(FuStructUf2 *st, guint32 value)
361
836
{
362
836
    g_return_if_fail(st != NULL);
363
836
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
364
836
}
365
/**
366
 * fu_struct_uf2_set_payload_size: (skip):
367
 **/
368
void
369
fu_struct_uf2_set_payload_size(FuStructUf2 *st, guint32 value)
370
836
{
371
836
    g_return_if_fail(st != NULL);
372
836
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
373
836
}
374
/**
375
 * fu_struct_uf2_set_block_no: (skip):
376
 **/
377
void
378
fu_struct_uf2_set_block_no(FuStructUf2 *st, guint32 value)
379
836
{
380
836
    g_return_if_fail(st != NULL);
381
836
    fu_memwrite_uint32(st->buf->data + 20, value, G_LITTLE_ENDIAN);
382
836
}
383
/**
384
 * fu_struct_uf2_set_num_blocks: (skip):
385
 **/
386
void
387
fu_struct_uf2_set_num_blocks(FuStructUf2 *st, guint32 value)
388
836
{
389
836
    g_return_if_fail(st != NULL);
390
836
    fu_memwrite_uint32(st->buf->data + 24, value, G_LITTLE_ENDIAN);
391
836
}
392
/**
393
 * fu_struct_uf2_set_family_id: (skip):
394
 **/
395
void
396
fu_struct_uf2_set_family_id(FuStructUf2 *st, guint32 value)
397
836
{
398
836
    g_return_if_fail(st != NULL);
399
836
    fu_memwrite_uint32(st->buf->data + 28, value, G_LITTLE_ENDIAN);
400
836
}
401
/**
402
 * fu_struct_uf2_set_data: (skip):
403
 **/
404
gboolean
405
fu_struct_uf2_set_data(FuStructUf2 *st, const guint8 *buf, gsize bufsz, GError **error)
406
836
{
407
836
    g_return_val_if_fail(st != NULL, FALSE);
408
836
    g_return_val_if_fail(buf != NULL, FALSE);
409
836
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
410
836
    return fu_memcpy_safe(st->buf->data, st->buf->len, 32, buf, bufsz, 0x0, bufsz, error);
411
836
}
412
/**
413
 * fu_struct_uf2_set_magic_end: (skip):
414
 **/
415
static void
416
fu_struct_uf2_set_magic_end(FuStructUf2 *st, guint32 value)
417
836
{
418
836
    g_return_if_fail(st != NULL);
419
836
    fu_memwrite_uint32(st->buf->data + 508, value, G_LITTLE_ENDIAN);
420
836
}
421
/**
422
 * fu_struct_uf2_new: (skip):
423
 **/
424
FuStructUf2 *
425
fu_struct_uf2_new(void)
426
836
{
427
836
    FuStructUf2 *st = fu_struct_uf2_new_internal();
428
836
    st->buf = g_byte_array_sized_new(512);
429
836
    fu_byte_array_set_size(st->buf, 512, 0x0);
430
836
    fu_struct_uf2_set_magic0(st, 0x0A324655);
431
836
    fu_struct_uf2_set_magic1(st, 0x9E5D5157);
432
836
    fu_struct_uf2_set_magic_end(st, 0x0AB16F30);
433
836
    return st;
434
836
}
435
/**
436
 * fu_struct_uf2_to_string: (skip):
437
 **/
438
static gchar *
439
fu_struct_uf2_to_string(const FuStructUf2 *st)
440
0
{
441
0
    g_autoptr(GString) str = g_string_new("FuStructUf2:\n");
442
0
    g_return_val_if_fail(st != NULL, NULL);
443
0
    {
444
0
        const gchar *tmp = fu_uf2_firmware_block_flags_to_string(fu_struct_uf2_get_flags(st));
445
0
        if (tmp != NULL) {
446
0
            g_string_append_printf(str, "  flags: 0x%x [%s]\n", (guint) fu_struct_uf2_get_flags(st), tmp);
447
0
        } else {
448
0
            g_string_append_printf(str, "  flags: 0x%x\n", (guint) fu_struct_uf2_get_flags(st));
449
0
        }
450
0
    }
451
0
    g_string_append_printf(str, "  target_addr: 0x%x\n",
452
0
                           (guint) fu_struct_uf2_get_target_addr(st));
453
0
    g_string_append_printf(str, "  payload_size: 0x%x\n",
454
0
                           (guint) fu_struct_uf2_get_payload_size(st));
455
0
    g_string_append_printf(str, "  block_no: 0x%x\n",
456
0
                           (guint) fu_struct_uf2_get_block_no(st));
457
0
    g_string_append_printf(str, "  num_blocks: 0x%x\n",
458
0
                           (guint) fu_struct_uf2_get_num_blocks(st));
459
0
    g_string_append_printf(str, "  family_id: 0x%x\n",
460
0
                           (guint) fu_struct_uf2_get_family_id(st));
461
0
    {
462
0
        gsize bufsz = 0;
463
0
        const guint8 *buf = fu_struct_uf2_get_data(st, &bufsz);
464
0
        g_autoptr(GString) tmp = g_string_new(NULL);
465
0
        for (gsize i = 0; i < bufsz; i++)
466
0
            g_string_append_printf(tmp, "%02X", buf[i]);
467
0
        g_string_append_printf(str, "  data: 0x%s\n", tmp->str);
468
0
    }
469
0
    if (str->len > 0)
470
0
        g_string_set_size(str, str->len - 1);
471
0
    return g_string_free(g_steal_pointer(&str), FALSE);
472
0
}
473
static gboolean
474
fu_struct_uf2_validate_internal(FuStructUf2 *st, GError **error)
475
1.17k
{
476
1.17k
    g_return_val_if_fail(st != NULL, FALSE);
477
1.17k
    if (fu_struct_uf2_get_magic0(st) != 0x0A324655) {
478
59
        g_set_error(error,
479
59
                    FWUPD_ERROR,
480
59
                    FWUPD_ERROR_INVALID_DATA,
481
59
                    "constant FuStructUf2.magic0 was not valid, "
482
59
                    "expected 0x%x and got 0x%x",
483
59
                    (guint) 0x0A324655,
484
59
                    (guint) fu_struct_uf2_get_magic0(st));
485
59
        return FALSE;
486
59
    }
487
1.11k
    if (fu_struct_uf2_get_magic1(st) != 0x9E5D5157) {
488
52
        g_set_error(error,
489
52
                    FWUPD_ERROR,
490
52
                    FWUPD_ERROR_INVALID_DATA,
491
52
                    "constant FuStructUf2.magic1 was not valid, "
492
52
                    "expected 0x%x and got 0x%x",
493
52
                    (guint) 0x9E5D5157,
494
52
                    (guint) fu_struct_uf2_get_magic1(st));
495
52
        return FALSE;
496
52
    }
497
1.06k
    if (fu_struct_uf2_get_magic_end(st) != 0x0AB16F30) {
498
78
        g_set_error(error,
499
78
                    FWUPD_ERROR,
500
78
                    FWUPD_ERROR_INVALID_DATA,
501
78
                    "constant FuStructUf2.magic_end was not valid, "
502
78
                    "expected 0x%x and got 0x%x",
503
78
                    (guint) 0x0AB16F30,
504
78
                    (guint) fu_struct_uf2_get_magic_end(st));
505
78
        return FALSE;
506
78
    }
507
986
    return TRUE;
508
1.06k
}
509
static gboolean
510
fu_struct_uf2_parse_internal(FuStructUf2 *st, GError **error)
511
1.17k
{
512
1.17k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
513
0
        g_autofree gchar *str = fu_struct_uf2_to_string(st);
514
0
        g_debug("%s", str);
515
0
    }
516
1.17k
    if (!fu_struct_uf2_validate_internal(st, error))
517
189
        return FALSE;
518
986
    return TRUE;
519
1.17k
}
520
521
/**
522
 * fu_struct_uf2_parse: (skip):
523
 **/
524
FuStructUf2 *
525
fu_struct_uf2_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
526
1.21k
{
527
1.21k
    g_autoptr(FuStructUf2) st = fu_struct_uf2_new_internal();
528
1.21k
    g_return_val_if_fail(buf != NULL, NULL);
529
1.21k
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
530
1.21k
    if (!fu_memchk_read(bufsz, offset, 512, error)) {
531
40
        g_prefix_error_literal(error, "invalid struct FuStructUf2: ");
532
40
        return NULL;
533
40
    }
534
1.17k
    st->buf = g_byte_array_new();
535
1.17k
    g_byte_array_append(st->buf, buf + offset, 512);
536
1.17k
    if (!fu_struct_uf2_parse_internal(st, error))
537
189
        return NULL;
538
986
    return g_steal_pointer(&st);
539
1.17k
}