Coverage Report

Created: 2025-11-11 06:44

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