Coverage Report

Created: 2025-07-01 07:09

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