Coverage Report

Created: 2025-11-24 06:59

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