Coverage Report

Created: 2025-12-14 06:56

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