Coverage Report

Created: 2025-11-11 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-fmap-struct.c
Line
Count
Source
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include <glib.h>
5
6
#include "fu-fmap-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
 * fu_struct_fmap_ref: (skip):
17
 **/
18
FuStructFmap *
19
fu_struct_fmap_ref(FuStructFmap *st)
20
0
{
21
0
    g_return_val_if_fail(st != NULL, NULL);
22
0
    st->refcount++;
23
0
    return st;
24
0
}
25
/**
26
 * fu_struct_fmap_unref: (skip):
27
 **/
28
void
29
fu_struct_fmap_unref(FuStructFmap *st)
30
10.6k
{
31
10.6k
    g_return_if_fail(st != NULL);
32
10.6k
    if (st->refcount == 0) {
33
0
        g_critical("FuStructFmap refcount already zero");
34
0
        return;
35
0
    }
36
10.6k
    if (--st->refcount > 0)
37
0
        return;
38
10.6k
    if (st->buf != NULL)
39
10.6k
        g_byte_array_unref(st->buf);
40
10.6k
    g_free(st);
41
10.6k
}
42
static FuStructFmap *
43
fu_struct_fmap_new_internal(void)
44
10.6k
{
45
10.6k
    FuStructFmap *st = g_new0(FuStructFmap, 1);
46
10.6k
    st->refcount = 1;
47
10.6k
    return st;
48
10.6k
}
49
50
/* getters */
51
/**
52
 * fu_struct_fmap_get_signature: (skip):
53
 **/
54
static gchar *
55
fu_struct_fmap_get_signature(const FuStructFmap *st)
56
0
{
57
0
    g_return_val_if_fail(st != NULL, NULL);
58
0
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 8, NULL);
59
0
}
60
/**
61
 * fu_struct_fmap_get_ver_major: (skip):
62
 **/
63
guint8
64
fu_struct_fmap_get_ver_major(const FuStructFmap *st)
65
9.62k
{
66
9.62k
    g_return_val_if_fail(st != NULL, 0x0);
67
9.62k
    return st->buf->data[8];
68
9.62k
}
69
/**
70
 * fu_struct_fmap_get_ver_minor: (skip):
71
 **/
72
guint8
73
fu_struct_fmap_get_ver_minor(const FuStructFmap *st)
74
9.62k
{
75
9.62k
    g_return_val_if_fail(st != NULL, 0x0);
76
9.62k
    return st->buf->data[9];
77
9.62k
}
78
/**
79
 * fu_struct_fmap_get_base: (skip):
80
 **/
81
guint64
82
fu_struct_fmap_get_base(const FuStructFmap *st)
83
9.62k
{
84
9.62k
    g_return_val_if_fail(st != NULL, 0x0);
85
9.62k
    return fu_memread_uint64(st->buf->data + 10, G_LITTLE_ENDIAN);
86
9.62k
}
87
/**
88
 * fu_struct_fmap_get_size: (skip):
89
 **/
90
guint32
91
fu_struct_fmap_get_size(const FuStructFmap *st)
92
9.68k
{
93
9.68k
    g_return_val_if_fail(st != NULL, 0x0);
94
9.68k
    return fu_memread_uint32(st->buf->data + 18, G_LITTLE_ENDIAN);
95
9.68k
}
96
/**
97
 * fu_struct_fmap_get_name: (skip):
98
 **/
99
gchar *
100
fu_struct_fmap_get_name(const FuStructFmap *st)
101
0
{
102
0
    g_return_val_if_fail(st != NULL, NULL);
103
0
    return fu_memstrsafe(st->buf->data, st->buf->len, 22, 32, NULL);
104
0
}
105
/**
106
 * fu_struct_fmap_get_nareas: (skip):
107
 **/
108
guint16
109
fu_struct_fmap_get_nareas(const FuStructFmap *st)
110
9.55k
{
111
9.55k
    g_return_val_if_fail(st != NULL, 0x0);
112
9.55k
    return fu_memread_uint16(st->buf->data + 54, G_LITTLE_ENDIAN);
113
9.55k
}
114
115
/* setters */
116
/**
117
 * fu_struct_fmap_set_signature: (skip):
118
 **/
119
static gboolean
120
fu_struct_fmap_set_signature(FuStructFmap *st, const gchar *value, GError **error)
121
958
{
122
958
    gsize len;
123
958
    g_return_val_if_fail(st != NULL, FALSE);
124
958
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
125
958
    if (value == NULL) {
126
0
        memset(st->buf->data + 0, 0x0, 8);
127
0
        return TRUE;
128
0
    }
129
958
    len = strlen(value);
130
958
    if (len > 8) {
131
0
        g_set_error(error,
132
0
                    FWUPD_ERROR,
133
0
                    FWUPD_ERROR_INVALID_DATA,
134
0
                    "string '%s' (0x%x bytes) does not fit in FuStructFmap.signature (0x%x bytes)",
135
0
                    value, (guint) len, (guint) 8);
136
0
        return FALSE;
137
0
    }
138
958
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
139
958
}
140
/**
141
 * fu_struct_fmap_set_ver_major: (skip):
142
 **/
143
void
144
fu_struct_fmap_set_ver_major(FuStructFmap *st, guint8 value)
145
1.14k
{
146
1.14k
    g_return_if_fail(st != NULL);
147
1.14k
    st->buf->data[8] = value;
148
1.14k
}
149
/**
150
 * fu_struct_fmap_set_ver_minor: (skip):
151
 **/
152
void
153
fu_struct_fmap_set_ver_minor(FuStructFmap *st, guint8 value)
154
1.14k
{
155
1.14k
    g_return_if_fail(st != NULL);
156
1.14k
    st->buf->data[9] = value;
157
1.14k
}
158
/**
159
 * fu_struct_fmap_set_base: (skip):
160
 **/
161
void
162
fu_struct_fmap_set_base(FuStructFmap *st, guint64 value)
163
188
{
164
188
    g_return_if_fail(st != NULL);
165
188
    fu_memwrite_uint64(st->buf->data + 10, value, G_LITTLE_ENDIAN);
166
188
}
167
/**
168
 * fu_struct_fmap_set_size: (skip):
169
 **/
170
void
171
fu_struct_fmap_set_size(FuStructFmap *st, guint32 value)
172
188
{
173
188
    g_return_if_fail(st != NULL);
174
188
    fu_memwrite_uint32(st->buf->data + 18, value, G_LITTLE_ENDIAN);
175
188
}
176
/**
177
 * fu_struct_fmap_set_name: (skip):
178
 **/
179
gboolean
180
fu_struct_fmap_set_name(FuStructFmap *st, const gchar *value, GError **error)
181
0
{
182
0
    gsize len;
183
0
    g_return_val_if_fail(st != NULL, FALSE);
184
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
185
0
    if (value == NULL) {
186
0
        memset(st->buf->data + 22, 0x0, 32);
187
0
        return TRUE;
188
0
    }
189
0
    len = strlen(value);
190
0
    if (len > 32) {
191
0
        g_set_error(error,
192
0
                    FWUPD_ERROR,
193
0
                    FWUPD_ERROR_INVALID_DATA,
194
0
                    "string '%s' (0x%x bytes) does not fit in FuStructFmap.name (0x%x bytes)",
195
0
                    value, (guint) len, (guint) 32);
196
0
        return FALSE;
197
0
    }
198
0
    return fu_memcpy_safe(st->buf->data, st->buf->len, 22, (const guint8 *)value, len, 0x0, len, error);
199
0
}
200
/**
201
 * fu_struct_fmap_set_nareas: (skip):
202
 **/
203
void
204
fu_struct_fmap_set_nareas(FuStructFmap *st, guint16 value)
205
188
{
206
188
    g_return_if_fail(st != NULL);
207
188
    fu_memwrite_uint16(st->buf->data + 54, value, G_LITTLE_ENDIAN);
208
188
}
209
/**
210
 * fu_struct_fmap_new: (skip):
211
 **/
212
FuStructFmap *
213
fu_struct_fmap_new(void)
214
958
{
215
958
    FuStructFmap *st = fu_struct_fmap_new_internal();
216
958
    st->buf = g_byte_array_sized_new(56);
217
958
    fu_byte_array_set_size(st->buf, 56, 0x0);
218
958
    fu_struct_fmap_set_signature(st, "__FMAP__", NULL);
219
958
    fu_struct_fmap_set_ver_major(st, 0x1);
220
958
    fu_struct_fmap_set_ver_minor(st, 0x1);
221
958
    return st;
222
958
}
223
/**
224
 * fu_struct_fmap_to_string: (skip):
225
 **/
226
static gchar *
227
fu_struct_fmap_to_string(const FuStructFmap *st)
228
0
{
229
0
    g_autoptr(GString) str = g_string_new("FuStructFmap:\n");
230
0
    g_return_val_if_fail(st != NULL, NULL);
231
0
    g_string_append_printf(str, "  ver_major: 0x%x\n",
232
0
                           (guint) fu_struct_fmap_get_ver_major(st));
233
0
    g_string_append_printf(str, "  ver_minor: 0x%x\n",
234
0
                           (guint) fu_struct_fmap_get_ver_minor(st));
235
0
    g_string_append_printf(str, "  base: 0x%x\n",
236
0
                           (guint) fu_struct_fmap_get_base(st));
237
0
    g_string_append_printf(str, "  size: 0x%x\n",
238
0
                           (guint) fu_struct_fmap_get_size(st));
239
0
    {
240
0
        g_autofree gchar *tmp = fu_struct_fmap_get_name(st);
241
0
        if (tmp != NULL)
242
0
            g_string_append_printf(str, "  name: %s\n", tmp);
243
0
    }
244
0
    g_string_append_printf(str, "  nareas: 0x%x\n",
245
0
                           (guint) fu_struct_fmap_get_nareas(st));
246
0
    if (str->len > 0)
247
0
        g_string_set_size(str, str->len - 1);
248
0
    return g_string_free(g_steal_pointer(&str), FALSE);
249
0
}
250
static gboolean
251
fu_struct_fmap_validate_internal(FuStructFmap *st, GError **error)
252
9.62k
{
253
9.62k
    g_return_val_if_fail(st != NULL, FALSE);
254
9.62k
    if (strncmp((const gchar *) (st->buf->data + 0), "__FMAP__", 8) != 0) {
255
0
        g_autofree gchar *str = fu_struct_fmap_get_signature(st);
256
0
        g_set_error(error,
257
0
                    FWUPD_ERROR,
258
0
                    FWUPD_ERROR_INVALID_DATA,
259
0
                    "constant FuStructFmap.signature was not valid, "
260
0
                    "expected '__FMAP__' and got '%s'",
261
0
                    str);
262
0
        return FALSE;
263
0
    }
264
9.62k
    return TRUE;
265
9.62k
}
266
/**
267
 * fu_struct_fmap_validate_stream: (skip):
268
 **/
269
gboolean
270
fu_struct_fmap_validate_stream(GInputStream *stream, gsize offset, GError **error)
271
0
{
272
0
    g_autoptr(FuStructFmap) st = fu_struct_fmap_new_internal();
273
0
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
274
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
275
0
    st->buf = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
276
0
    if (st->buf == NULL) {
277
0
        g_prefix_error(error, "FuStructFmap failed read of 0x%x: ", (guint) 56);
278
0
        return FALSE;
279
0
    }
280
0
    if (st->buf->len != 56) {
281
0
        g_set_error(error,
282
0
                    FWUPD_ERROR,
283
0
                    FWUPD_ERROR_INVALID_DATA,
284
0
                    "FuStructFmap requested 0x%x and got 0x%x",
285
0
                    (guint) 56,
286
0
                    (guint) st->buf->len);
287
0
        return FALSE;
288
0
    }
289
0
    return fu_struct_fmap_validate_internal(st, error);
290
0
}
291
static gboolean
292
fu_struct_fmap_parse_internal(FuStructFmap *st, GError **error)
293
9.62k
{
294
9.62k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
295
0
        g_autofree gchar *str = fu_struct_fmap_to_string(st);
296
0
        g_debug("%s", str);
297
0
    }
298
9.62k
    if (!fu_struct_fmap_validate_internal(st, error))
299
0
        return FALSE;
300
9.62k
    return TRUE;
301
9.62k
}
302
/**
303
 * fu_struct_fmap_parse_stream: (skip):
304
 **/
305
FuStructFmap *
306
fu_struct_fmap_parse_stream(GInputStream *stream, gsize offset, GError **error)
307
9.66k
{
308
9.66k
    g_autoptr(FuStructFmap) st = fu_struct_fmap_new_internal();
309
9.66k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
310
9.66k
    if (st->buf == NULL) {
311
0
        g_prefix_error(error, "FuStructFmap failed read of 0x%x: ", (guint) 56);
312
0
        return NULL;
313
0
    }
314
9.66k
    if (st->buf->len != 56) {
315
41
        g_set_error(error,
316
41
                    FWUPD_ERROR,
317
41
                    FWUPD_ERROR_INVALID_DATA,
318
41
                    "FuStructFmap requested 0x%x and got 0x%x",
319
41
                    (guint) 56,
320
41
                    (guint) st->buf->len);
321
41
        return NULL;
322
41
    }
323
9.62k
    if (!fu_struct_fmap_parse_internal(st, error))
324
0
        return NULL;
325
9.62k
    return g_steal_pointer(&st);
326
9.62k
}
327
/**
328
 * fu_struct_fmap_area_ref: (skip):
329
 **/
330
FuStructFmapArea *
331
fu_struct_fmap_area_ref(FuStructFmapArea *st)
332
0
{
333
0
    g_return_val_if_fail(st != NULL, NULL);
334
0
    st->refcount++;
335
0
    return st;
336
0
}
337
/**
338
 * fu_struct_fmap_area_unref: (skip):
339
 **/
340
void
341
fu_struct_fmap_area_unref(FuStructFmapArea *st)
342
11.0M
{
343
11.0M
    g_return_if_fail(st != NULL);
344
11.0M
    if (st->refcount == 0) {
345
0
        g_critical("FuStructFmapArea refcount already zero");
346
0
        return;
347
0
    }
348
11.0M
    if (--st->refcount > 0)
349
0
        return;
350
11.0M
    if (st->buf != NULL)
351
11.0M
        g_byte_array_unref(st->buf);
352
11.0M
    g_free(st);
353
11.0M
}
354
static FuStructFmapArea *
355
fu_struct_fmap_area_new_internal(void)
356
11.0M
{
357
11.0M
    FuStructFmapArea *st = g_new0(FuStructFmapArea, 1);
358
11.0M
    st->refcount = 1;
359
11.0M
    return st;
360
11.0M
}
361
362
/* getters */
363
/**
364
 * fu_struct_fmap_area_get_offset: (skip):
365
 **/
366
guint32
367
fu_struct_fmap_area_get_offset(const FuStructFmapArea *st)
368
144k
{
369
144k
    g_return_val_if_fail(st != NULL, 0x0);
370
144k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
371
144k
}
372
/**
373
 * fu_struct_fmap_area_get_size: (skip):
374
 **/
375
guint32
376
fu_struct_fmap_area_get_size(const FuStructFmapArea *st)
377
11.0M
{
378
11.0M
    g_return_val_if_fail(st != NULL, 0x0);
379
11.0M
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
380
11.0M
}
381
/**
382
 * fu_struct_fmap_area_get_name: (skip):
383
 **/
384
gchar *
385
fu_struct_fmap_area_get_name(const FuStructFmapArea *st)
386
141k
{
387
141k
    g_return_val_if_fail(st != NULL, NULL);
388
141k
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 32, NULL);
389
141k
}
390
/**
391
 * fu_struct_fmap_area_get_flags: (skip):
392
 **/
393
guint16
394
fu_struct_fmap_area_get_flags(const FuStructFmapArea *st)
395
0
{
396
0
    g_return_val_if_fail(st != NULL, 0x0);
397
0
    return fu_memread_uint16(st->buf->data + 40, G_LITTLE_ENDIAN);
398
0
}
399
400
/* setters */
401
/**
402
 * fu_struct_fmap_area_set_offset: (skip):
403
 **/
404
void
405
fu_struct_fmap_area_set_offset(FuStructFmapArea *st, guint32 value)
406
215
{
407
215
    g_return_if_fail(st != NULL);
408
215
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
409
215
}
410
/**
411
 * fu_struct_fmap_area_set_size: (skip):
412
 **/
413
void
414
fu_struct_fmap_area_set_size(FuStructFmapArea *st, guint32 value)
415
215
{
416
215
    g_return_if_fail(st != NULL);
417
215
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
418
215
}
419
/**
420
 * fu_struct_fmap_area_set_name: (skip):
421
 **/
422
gboolean
423
fu_struct_fmap_area_set_name(FuStructFmapArea *st, const gchar *value, GError **error)
424
215
{
425
215
    gsize len;
426
215
    g_return_val_if_fail(st != NULL, FALSE);
427
215
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
428
215
    if (value == NULL) {
429
0
        memset(st->buf->data + 8, 0x0, 32);
430
0
        return TRUE;
431
0
    }
432
215
    len = strlen(value);
433
215
    if (len > 32) {
434
0
        g_set_error(error,
435
0
                    FWUPD_ERROR,
436
0
                    FWUPD_ERROR_INVALID_DATA,
437
0
                    "string '%s' (0x%x bytes) does not fit in FuStructFmapArea.name (0x%x bytes)",
438
0
                    value, (guint) len, (guint) 32);
439
0
        return FALSE;
440
0
    }
441
215
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
442
215
}
443
/**
444
 * fu_struct_fmap_area_set_flags: (skip):
445
 **/
446
void
447
fu_struct_fmap_area_set_flags(FuStructFmapArea *st, guint16 value)
448
0
{
449
0
    g_return_if_fail(st != NULL);
450
0
    fu_memwrite_uint16(st->buf->data + 40, value, G_LITTLE_ENDIAN);
451
0
}
452
/**
453
 * fu_struct_fmap_area_new: (skip):
454
 **/
455
FuStructFmapArea *
456
fu_struct_fmap_area_new(void)
457
215
{
458
215
    FuStructFmapArea *st = fu_struct_fmap_area_new_internal();
459
215
    st->buf = g_byte_array_sized_new(42);
460
215
    fu_byte_array_set_size(st->buf, 42, 0x0);
461
215
    return st;
462
215
}
463
/**
464
 * fu_struct_fmap_area_to_string: (skip):
465
 **/
466
static gchar *
467
fu_struct_fmap_area_to_string(const FuStructFmapArea *st)
468
0
{
469
0
    g_autoptr(GString) str = g_string_new("FuStructFmapArea:\n");
470
0
    g_return_val_if_fail(st != NULL, NULL);
471
0
    g_string_append_printf(str, "  offset: 0x%x\n",
472
0
                           (guint) fu_struct_fmap_area_get_offset(st));
473
0
    g_string_append_printf(str, "  size: 0x%x\n",
474
0
                           (guint) fu_struct_fmap_area_get_size(st));
475
0
    {
476
0
        g_autofree gchar *tmp = fu_struct_fmap_area_get_name(st);
477
0
        if (tmp != NULL)
478
0
            g_string_append_printf(str, "  name: %s\n", tmp);
479
0
    }
480
0
    g_string_append_printf(str, "  flags: 0x%x\n",
481
0
                           (guint) fu_struct_fmap_area_get_flags(st));
482
0
    if (str->len > 0)
483
0
        g_string_set_size(str, str->len - 1);
484
0
    return g_string_free(g_steal_pointer(&str), FALSE);
485
0
}
486
static gboolean
487
fu_struct_fmap_area_validate_internal(FuStructFmapArea *st, GError **error)
488
11.0M
{
489
11.0M
    g_return_val_if_fail(st != NULL, FALSE);
490
11.0M
    return TRUE;
491
11.0M
}
492
static gboolean
493
fu_struct_fmap_area_parse_internal(FuStructFmapArea *st, GError **error)
494
11.0M
{
495
11.0M
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
496
0
        g_autofree gchar *str = fu_struct_fmap_area_to_string(st);
497
0
        g_debug("%s", str);
498
0
    }
499
11.0M
    if (!fu_struct_fmap_area_validate_internal(st, error))
500
0
        return FALSE;
501
11.0M
    return TRUE;
502
11.0M
}
503
/**
504
 * fu_struct_fmap_area_parse_stream: (skip):
505
 **/
506
FuStructFmapArea *
507
fu_struct_fmap_area_parse_stream(GInputStream *stream, gsize offset, GError **error)
508
11.0M
{
509
11.0M
    g_autoptr(FuStructFmapArea) st = fu_struct_fmap_area_new_internal();
510
11.0M
    st->buf = fu_input_stream_read_byte_array(stream, offset, 42, NULL, error);
511
11.0M
    if (st->buf == NULL) {
512
1.17k
        g_prefix_error(error, "FuStructFmapArea failed read of 0x%x: ", (guint) 42);
513
1.17k
        return NULL;
514
1.17k
    }
515
11.0M
    if (st->buf->len != 42) {
516
3.88k
        g_set_error(error,
517
3.88k
                    FWUPD_ERROR,
518
3.88k
                    FWUPD_ERROR_INVALID_DATA,
519
3.88k
                    "FuStructFmapArea requested 0x%x and got 0x%x",
520
3.88k
                    (guint) 42,
521
3.88k
                    (guint) st->buf->len);
522
3.88k
        return NULL;
523
3.88k
    }
524
11.0M
    if (!fu_struct_fmap_area_parse_internal(st, error))
525
0
        return NULL;
526
11.0M
    return g_steal_pointer(&st);
527
11.0M
}