Coverage Report

Created: 2026-01-09 07:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-dfu-firmware-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-dfu-firmware-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_dfu_ftr_ref: (skip):
22
 **/
23
FuStructDfuFtr *
24
fu_struct_dfu_ftr_ref(FuStructDfuFtr *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_dfu_ftr_unref: (skip):
32
 **/
33
void
34
fu_struct_dfu_ftr_unref(FuStructDfuFtr *st)
35
1.32k
{
36
1.32k
    g_return_if_fail(st != NULL);
37
1.32k
    if (st->refcount == 0) {
38
0
        g_critical("FuStructDfuFtr refcount already zero");
39
0
        return;
40
0
    }
41
1.32k
    if (--st->refcount > 0)
42
0
        return;
43
1.32k
    if (st->buf != NULL)
44
1.27k
        g_byte_array_unref(st->buf);
45
1.32k
    g_free(st);
46
1.32k
}
47
/**
48
 * fu_struct_dfu_ftr_new_internal: (skip):
49
 **/
50
static FuStructDfuFtr *
51
fu_struct_dfu_ftr_new_internal(void)
52
1.32k
{
53
1.32k
    FuStructDfuFtr *st = g_new0(FuStructDfuFtr, 1);
54
1.32k
    st->refcount = 1;
55
1.32k
    return st;
56
1.32k
}
57
58
/* getters */
59
/**
60
 * fu_struct_dfu_ftr_get_release: (skip):
61
 **/
62
guint16
63
fu_struct_dfu_ftr_get_release(const FuStructDfuFtr *st)
64
1.06k
{
65
1.06k
    g_return_val_if_fail(st != NULL, 0x0);
66
1.06k
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
67
1.06k
}
68
/**
69
 * fu_struct_dfu_ftr_get_pid: (skip):
70
 **/
71
guint16
72
fu_struct_dfu_ftr_get_pid(const FuStructDfuFtr *st)
73
1.06k
{
74
1.06k
    g_return_val_if_fail(st != NULL, 0x0);
75
1.06k
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
76
1.06k
}
77
/**
78
 * fu_struct_dfu_ftr_get_vid: (skip):
79
 **/
80
guint16
81
fu_struct_dfu_ftr_get_vid(const FuStructDfuFtr *st)
82
1.06k
{
83
1.06k
    g_return_val_if_fail(st != NULL, 0x0);
84
1.06k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
85
1.06k
}
86
/**
87
 * fu_struct_dfu_ftr_get_ver: (skip):
88
 **/
89
guint16
90
fu_struct_dfu_ftr_get_ver(const FuStructDfuFtr *st)
91
1.06k
{
92
1.06k
    g_return_val_if_fail(st != NULL, 0x0);
93
1.06k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
94
1.06k
}
95
/**
96
 * fu_struct_dfu_ftr_get_sig: (skip):
97
 **/
98
static gchar *
99
fu_struct_dfu_ftr_get_sig(const FuStructDfuFtr *st)
100
108
{
101
108
    g_return_val_if_fail(st != NULL, NULL);
102
108
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 3, NULL);
103
108
}
104
/**
105
 * fu_struct_dfu_ftr_get_len: (skip):
106
 **/
107
guint8
108
fu_struct_dfu_ftr_get_len(const FuStructDfuFtr *st)
109
1.06k
{
110
1.06k
    g_return_val_if_fail(st != NULL, 0x0);
111
1.06k
    return st->buf->data[11];
112
1.06k
}
113
/**
114
 * fu_struct_dfu_ftr_get_crc: (skip):
115
 **/
116
guint32
117
fu_struct_dfu_ftr_get_crc(const FuStructDfuFtr *st)
118
1.06k
{
119
1.06k
    g_return_val_if_fail(st != NULL, 0x0);
120
1.06k
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
121
1.06k
}
122
123
/* setters */
124
/**
125
 * fu_struct_dfu_ftr_set_release: (skip):
126
 **/
127
void
128
fu_struct_dfu_ftr_set_release(FuStructDfuFtr *st, guint16 value)
129
99
{
130
99
    g_return_if_fail(st != NULL);
131
99
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
132
99
}
133
/**
134
 * fu_struct_dfu_ftr_set_pid: (skip):
135
 **/
136
void
137
fu_struct_dfu_ftr_set_pid(FuStructDfuFtr *st, guint16 value)
138
99
{
139
99
    g_return_if_fail(st != NULL);
140
99
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
141
99
}
142
/**
143
 * fu_struct_dfu_ftr_set_vid: (skip):
144
 **/
145
void
146
fu_struct_dfu_ftr_set_vid(FuStructDfuFtr *st, guint16 value)
147
99
{
148
99
    g_return_if_fail(st != NULL);
149
99
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
150
99
}
151
/**
152
 * fu_struct_dfu_ftr_set_ver: (skip):
153
 **/
154
void
155
fu_struct_dfu_ftr_set_ver(FuStructDfuFtr *st, guint16 value)
156
99
{
157
99
    g_return_if_fail(st != NULL);
158
99
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
159
99
}
160
/**
161
 * fu_struct_dfu_ftr_set_sig: (skip):
162
 **/
163
static gboolean
164
fu_struct_dfu_ftr_set_sig(FuStructDfuFtr *st, const gchar *value, GError **error)
165
99
{
166
99
    gsize len;
167
99
    g_return_val_if_fail(st != NULL, FALSE);
168
99
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
169
99
    if (value == NULL) {
170
0
        memset(st->buf->data + 8, 0x0, 3);
171
0
        return TRUE;
172
0
    }
173
99
    len = strlen(value);
174
99
    if (len > 3) {
175
0
        g_set_error(error,
176
0
                    FWUPD_ERROR,
177
0
                    FWUPD_ERROR_INVALID_DATA,
178
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuFtr.sig (0x%x bytes)",
179
0
                    value, (guint) len, (guint) 3);
180
0
        return FALSE;
181
0
    }
182
99
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
183
99
}
184
/**
185
 * fu_struct_dfu_ftr_set_len: (skip):
186
 **/
187
void
188
fu_struct_dfu_ftr_set_len(FuStructDfuFtr *st, guint8 value)
189
99
{
190
99
    g_return_if_fail(st != NULL);
191
99
    st->buf->data[11] = value;
192
99
}
193
/**
194
 * fu_struct_dfu_ftr_set_crc: (skip):
195
 **/
196
void
197
fu_struct_dfu_ftr_set_crc(FuStructDfuFtr *st, guint32 value)
198
0
{
199
0
    g_return_if_fail(st != NULL);
200
0
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
201
0
}
202
/**
203
 * fu_struct_dfu_ftr_new: (skip):
204
 **/
205
FuStructDfuFtr *
206
fu_struct_dfu_ftr_new(void)
207
99
{
208
99
    FuStructDfuFtr *st = fu_struct_dfu_ftr_new_internal();
209
99
    st->buf = g_byte_array_sized_new(16);
210
99
    fu_byte_array_set_size(st->buf, 16, 0x0);
211
99
    fu_struct_dfu_ftr_set_sig(st, "UFD", NULL);
212
99
    fu_struct_dfu_ftr_set_len(st, 16);
213
99
    return st;
214
99
}
215
/**
216
 * fu_struct_dfu_ftr_to_string: (skip):
217
 **/
218
static gchar *
219
fu_struct_dfu_ftr_to_string(const FuStructDfuFtr *st)
220
0
{
221
0
    g_autoptr(GString) str = g_string_new("FuStructDfuFtr:\n");
222
0
    g_return_val_if_fail(st != NULL, NULL);
223
0
    g_string_append_printf(str, "  release: 0x%x\n",
224
0
                           (guint) fu_struct_dfu_ftr_get_release(st));
225
0
    g_string_append_printf(str, "  pid: 0x%x\n",
226
0
                           (guint) fu_struct_dfu_ftr_get_pid(st));
227
0
    g_string_append_printf(str, "  vid: 0x%x\n",
228
0
                           (guint) fu_struct_dfu_ftr_get_vid(st));
229
0
    g_string_append_printf(str, "  ver: 0x%x\n",
230
0
                           (guint) fu_struct_dfu_ftr_get_ver(st));
231
0
    {
232
0
        g_autofree gchar *tmp = fu_struct_dfu_ftr_get_sig(st);
233
0
        if (tmp != NULL)
234
0
            g_string_append_printf(str, "  sig: %s\n", tmp);
235
0
    }
236
0
    g_string_append_printf(str, "  len: 0x%x\n",
237
0
                           (guint) fu_struct_dfu_ftr_get_len(st));
238
0
    g_string_append_printf(str, "  crc: 0x%x\n",
239
0
                           (guint) fu_struct_dfu_ftr_get_crc(st));
240
0
    if (str->len > 0)
241
0
        g_string_set_size(str, str->len - 1);
242
0
    return g_string_free(g_steal_pointer(&str), FALSE);
243
0
}
244
static gboolean
245
fu_struct_dfu_ftr_validate_internal(FuStructDfuFtr *st, GError **error)
246
1.17k
{
247
1.17k
    g_return_val_if_fail(st != NULL, FALSE);
248
1.17k
    if (strncmp((const gchar *) (st->buf->data + 8), "UFD", 3) != 0) {
249
108
        g_autofree gchar *str = fu_struct_dfu_ftr_get_sig(st);
250
108
        g_set_error(error,
251
108
                    FWUPD_ERROR,
252
108
                    FWUPD_ERROR_INVALID_DATA,
253
108
                    "constant FuStructDfuFtr.sig was not valid, "
254
108
                    "expected 'UFD' and got '%s'",
255
108
                    str);
256
108
        return FALSE;
257
108
    }
258
1.06k
    return TRUE;
259
1.17k
}
260
/**
261
 * fu_struct_dfu_ftr_validate_stream: (skip):
262
 **/
263
gboolean
264
fu_struct_dfu_ftr_validate_stream(GInputStream *stream, gsize offset, GError **error)
265
0
{
266
0
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
267
0
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
268
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
269
0
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
270
0
    if (st->buf == NULL) {
271
0
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
272
0
        return FALSE;
273
0
    }
274
0
    if (st->buf->len != 16) {
275
0
        g_set_error(error,
276
0
                    FWUPD_ERROR,
277
0
                    FWUPD_ERROR_INVALID_DATA,
278
0
                    "FuStructDfuFtr requested 0x%x and got 0x%x",
279
0
                    (guint) 16,
280
0
                    (guint) st->buf->len);
281
0
        return FALSE;
282
0
    }
283
0
    return fu_struct_dfu_ftr_validate_internal(st, error);
284
0
}
285
static gboolean
286
fu_struct_dfu_ftr_parse_internal(FuStructDfuFtr *st, GError **error)
287
1.17k
{
288
1.17k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
289
0
        g_autofree gchar *str = fu_struct_dfu_ftr_to_string(st);
290
0
        g_debug("%s", str);
291
0
    }
292
1.17k
    if (!fu_struct_dfu_ftr_validate_internal(st, error))
293
108
        return FALSE;
294
1.06k
    return TRUE;
295
1.17k
}
296
/**
297
 * fu_struct_dfu_ftr_parse_stream: (skip):
298
 **/
299
FuStructDfuFtr *
300
fu_struct_dfu_ftr_parse_stream(GInputStream *stream, gsize offset, GError **error)
301
1.22k
{
302
1.22k
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
303
1.22k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
304
1.22k
    if (st->buf == NULL) {
305
48
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
306
48
        return NULL;
307
48
    }
308
1.17k
    if (st->buf->len != 16) {
309
0
        g_set_error(error,
310
0
                    FWUPD_ERROR,
311
0
                    FWUPD_ERROR_INVALID_DATA,
312
0
                    "FuStructDfuFtr requested 0x%x and got 0x%x",
313
0
                    (guint) 16,
314
0
                    (guint) st->buf->len);
315
0
        return NULL;
316
0
    }
317
1.17k
    if (!fu_struct_dfu_ftr_parse_internal(st, error))
318
108
        return NULL;
319
1.06k
    return g_steal_pointer(&st);
320
1.17k
}
321
/**
322
 * fu_struct_dfuse_hdr_ref: (skip):
323
 **/
324
FuStructDfuseHdr *
325
fu_struct_dfuse_hdr_ref(FuStructDfuseHdr *st)
326
0
{
327
0
    g_return_val_if_fail(st != NULL, NULL);
328
0
    st->refcount++;
329
0
    return st;
330
0
}
331
/**
332
 * fu_struct_dfuse_hdr_unref: (skip):
333
 **/
334
void
335
fu_struct_dfuse_hdr_unref(FuStructDfuseHdr *st)
336
280k
{
337
280k
    g_return_if_fail(st != NULL);
338
280k
    if (st->refcount == 0) {
339
0
        g_critical("FuStructDfuseHdr refcount already zero");
340
0
        return;
341
0
    }
342
280k
    if (--st->refcount > 0)
343
0
        return;
344
280k
    if (st->buf != NULL)
345
280k
        g_byte_array_unref(st->buf);
346
280k
    g_free(st);
347
280k
}
348
/**
349
 * fu_struct_dfuse_hdr_new_internal: (skip):
350
 **/
351
static FuStructDfuseHdr *
352
fu_struct_dfuse_hdr_new_internal(void)
353
280k
{
354
280k
    FuStructDfuseHdr *st = g_new0(FuStructDfuseHdr, 1);
355
280k
    st->refcount = 1;
356
280k
    return st;
357
280k
}
358
359
/* getters */
360
/**
361
 * fu_struct_dfuse_hdr_get_sig: (skip):
362
 **/
363
static gchar *
364
fu_struct_dfuse_hdr_get_sig(const FuStructDfuseHdr *st)
365
276k
{
366
276k
    g_return_val_if_fail(st != NULL, NULL);
367
276k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
368
276k
}
369
/**
370
 * fu_struct_dfuse_hdr_get_ver: (skip):
371
 **/
372
static guint8
373
fu_struct_dfuse_hdr_get_ver(const FuStructDfuseHdr *st)
374
2.03k
{
375
2.03k
    g_return_val_if_fail(st != NULL, 0x0);
376
2.03k
    return st->buf->data[5];
377
2.03k
}
378
/**
379
 * fu_struct_dfuse_hdr_get_image_size: (skip):
380
 **/
381
guint32
382
fu_struct_dfuse_hdr_get_image_size(const FuStructDfuseHdr *st)
383
690
{
384
690
    g_return_val_if_fail(st != NULL, 0x0);
385
690
    return fu_memread_uint32(st->buf->data + 6, G_LITTLE_ENDIAN);
386
690
}
387
/**
388
 * fu_struct_dfuse_hdr_get_targets: (skip):
389
 **/
390
guint8
391
fu_struct_dfuse_hdr_get_targets(const FuStructDfuseHdr *st)
392
390
{
393
390
    g_return_val_if_fail(st != NULL, 0x0);
394
390
    return st->buf->data[10];
395
390
}
396
397
/* setters */
398
/**
399
 * fu_struct_dfuse_hdr_set_sig: (skip):
400
 **/
401
static gboolean
402
fu_struct_dfuse_hdr_set_sig(FuStructDfuseHdr *st, const gchar *value, GError **error)
403
99
{
404
99
    gsize len;
405
99
    g_return_val_if_fail(st != NULL, FALSE);
406
99
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
407
99
    if (value == NULL) {
408
0
        memset(st->buf->data + 0, 0x0, 5);
409
0
        return TRUE;
410
0
    }
411
99
    len = strlen(value);
412
99
    if (len > 5) {
413
0
        g_set_error(error,
414
0
                    FWUPD_ERROR,
415
0
                    FWUPD_ERROR_INVALID_DATA,
416
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuseHdr.sig (0x%x bytes)",
417
0
                    value, (guint) len, (guint) 5);
418
0
        return FALSE;
419
0
    }
420
99
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
421
99
}
422
/**
423
 * fu_struct_dfuse_hdr_set_ver: (skip):
424
 **/
425
static void
426
fu_struct_dfuse_hdr_set_ver(FuStructDfuseHdr *st, guint8 value)
427
99
{
428
99
    g_return_if_fail(st != NULL);
429
99
    st->buf->data[5] = value;
430
99
}
431
/**
432
 * fu_struct_dfuse_hdr_set_image_size: (skip):
433
 **/
434
void
435
fu_struct_dfuse_hdr_set_image_size(FuStructDfuseHdr *st, guint32 value)
436
99
{
437
99
    g_return_if_fail(st != NULL);
438
99
    fu_memwrite_uint32(st->buf->data + 6, value, G_LITTLE_ENDIAN);
439
99
}
440
/**
441
 * fu_struct_dfuse_hdr_set_targets: (skip):
442
 **/
443
void
444
fu_struct_dfuse_hdr_set_targets(FuStructDfuseHdr *st, guint8 value)
445
99
{
446
99
    g_return_if_fail(st != NULL);
447
99
    st->buf->data[10] = value;
448
99
}
449
/**
450
 * fu_struct_dfuse_hdr_new: (skip):
451
 **/
452
FuStructDfuseHdr *
453
fu_struct_dfuse_hdr_new(void)
454
99
{
455
99
    FuStructDfuseHdr *st = fu_struct_dfuse_hdr_new_internal();
456
99
    st->buf = g_byte_array_sized_new(11);
457
99
    fu_byte_array_set_size(st->buf, 11, 0x0);
458
99
    fu_struct_dfuse_hdr_set_sig(st, "DfuSe", NULL);
459
99
    fu_struct_dfuse_hdr_set_ver(st, 0x01);
460
99
    return st;
461
99
}
462
/**
463
 * fu_struct_dfuse_hdr_to_string: (skip):
464
 **/
465
static gchar *
466
fu_struct_dfuse_hdr_to_string(const FuStructDfuseHdr *st)
467
0
{
468
0
    g_autoptr(GString) str = g_string_new("FuStructDfuseHdr:\n");
469
0
    g_return_val_if_fail(st != NULL, NULL);
470
0
    {
471
0
        g_autofree gchar *tmp = fu_struct_dfuse_hdr_get_sig(st);
472
0
        if (tmp != NULL)
473
0
            g_string_append_printf(str, "  sig: %s\n", tmp);
474
0
    }
475
0
    g_string_append_printf(str, "  ver: 0x%x\n",
476
0
                           (guint) fu_struct_dfuse_hdr_get_ver(st));
477
0
    g_string_append_printf(str, "  image_size: 0x%x\n",
478
0
                           (guint) fu_struct_dfuse_hdr_get_image_size(st));
479
0
    g_string_append_printf(str, "  targets: 0x%x\n",
480
0
                           (guint) fu_struct_dfuse_hdr_get_targets(st));
481
0
    if (str->len > 0)
482
0
        g_string_set_size(str, str->len - 1);
483
0
    return g_string_free(g_steal_pointer(&str), FALSE);
484
0
}
485
/**
486
 * fu_struct_dfuse_hdr_to_bytes: (skip):
487
 **/
488
GBytes *
489
fu_struct_dfuse_hdr_to_bytes(const FuStructDfuseHdr *st)
490
99
{
491
99
    g_return_val_if_fail(st != NULL, NULL);
492
99
    return g_bytes_new(st->buf->data, st->buf->len);
493
99
}
494
static gboolean
495
fu_struct_dfuse_hdr_validate_internal(FuStructDfuseHdr *st, GError **error)
496
278k
{
497
278k
    g_return_val_if_fail(st != NULL, FALSE);
498
278k
    if (strncmp((const gchar *) (st->buf->data + 0), "DfuSe", 5) != 0) {
499
276k
        g_autofree gchar *str = fu_struct_dfuse_hdr_get_sig(st);
500
276k
        g_set_error(error,
501
276k
                    FWUPD_ERROR,
502
276k
                    FWUPD_ERROR_INVALID_DATA,
503
276k
                    "constant FuStructDfuseHdr.sig was not valid, "
504
276k
                    "expected 'DfuSe' and got '%s'",
505
276k
                    str);
506
276k
        return FALSE;
507
276k
    }
508
2.03k
    if (fu_struct_dfuse_hdr_get_ver(st) != 0x01) {
509
272
        g_set_error_literal(error,
510
272
                            FWUPD_ERROR,
511
272
                            FWUPD_ERROR_INVALID_DATA,
512
272
                            "constant FuStructDfuseHdr.ver was not valid");
513
272
        return FALSE;
514
272
    }
515
1.76k
    return TRUE;
516
2.03k
}
517
/**
518
 * fu_struct_dfuse_hdr_validate_stream: (skip):
519
 **/
520
gboolean
521
fu_struct_dfuse_hdr_validate_stream(GInputStream *stream, gsize offset, GError **error)
522
279k
{
523
279k
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
524
279k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
525
279k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
526
279k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
527
279k
    if (st->buf == NULL) {
528
0
        g_prefix_error(error, "FuStructDfuseHdr failed read of 0x%x: ", (guint) 11);
529
0
        return FALSE;
530
0
    }
531
279k
    if (st->buf->len != 11) {
532
1.90k
        g_set_error(error,
533
1.90k
                    FWUPD_ERROR,
534
1.90k
                    FWUPD_ERROR_INVALID_DATA,
535
1.90k
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
536
1.90k
                    (guint) 11,
537
1.90k
                    (guint) st->buf->len);
538
1.90k
        return FALSE;
539
1.90k
    }
540
277k
    return fu_struct_dfuse_hdr_validate_internal(st, error);
541
279k
}
542
static gboolean
543
fu_struct_dfuse_hdr_parse_internal(FuStructDfuseHdr *st, GError **error)
544
540
{
545
540
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
546
0
        g_autofree gchar *str = fu_struct_dfuse_hdr_to_string(st);
547
0
        g_debug("%s", str);
548
0
    }
549
540
    if (!fu_struct_dfuse_hdr_validate_internal(st, error))
550
0
        return FALSE;
551
540
    return TRUE;
552
540
}
553
/**
554
 * fu_struct_dfuse_hdr_parse_stream: (skip):
555
 **/
556
FuStructDfuseHdr *
557
fu_struct_dfuse_hdr_parse_stream(GInputStream *stream, gsize offset, GError **error)
558
540
{
559
540
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
560
540
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
561
540
    if (st->buf == NULL) {
562
0
        g_prefix_error(error, "FuStructDfuseHdr failed read of 0x%x: ", (guint) 11);
563
0
        return NULL;
564
0
    }
565
540
    if (st->buf->len != 11) {
566
0
        g_set_error(error,
567
0
                    FWUPD_ERROR,
568
0
                    FWUPD_ERROR_INVALID_DATA,
569
0
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
570
0
                    (guint) 11,
571
0
                    (guint) st->buf->len);
572
0
        return NULL;
573
0
    }
574
540
    if (!fu_struct_dfuse_hdr_parse_internal(st, error))
575
0
        return NULL;
576
540
    return g_steal_pointer(&st);
577
540
}
578
/**
579
 * fu_struct_dfuse_image_ref: (skip):
580
 **/
581
FuStructDfuseImage *
582
fu_struct_dfuse_image_ref(FuStructDfuseImage *st)
583
0
{
584
0
    g_return_val_if_fail(st != NULL, NULL);
585
0
    st->refcount++;
586
0
    return st;
587
0
}
588
/**
589
 * fu_struct_dfuse_image_unref: (skip):
590
 **/
591
void
592
fu_struct_dfuse_image_unref(FuStructDfuseImage *st)
593
476
{
594
476
    g_return_if_fail(st != NULL);
595
476
    if (st->refcount == 0) {
596
0
        g_critical("FuStructDfuseImage refcount already zero");
597
0
        return;
598
0
    }
599
476
    if (--st->refcount > 0)
600
0
        return;
601
476
    if (st->buf != NULL)
602
463
        g_byte_array_unref(st->buf);
603
476
    g_free(st);
604
476
}
605
/**
606
 * fu_struct_dfuse_image_new_internal: (skip):
607
 **/
608
static FuStructDfuseImage *
609
fu_struct_dfuse_image_new_internal(void)
610
476
{
611
476
    FuStructDfuseImage *st = g_new0(FuStructDfuseImage, 1);
612
476
    st->refcount = 1;
613
476
    return st;
614
476
}
615
616
/* getters */
617
/**
618
 * fu_struct_dfuse_image_get_sig: (skip):
619
 **/
620
static gchar *
621
fu_struct_dfuse_image_get_sig(const FuStructDfuseImage *st)
622
54
{
623
54
    g_return_val_if_fail(st != NULL, NULL);
624
54
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 6, NULL);
625
54
}
626
/**
627
 * fu_struct_dfuse_image_get_alt_setting: (skip):
628
 **/
629
guint8
630
fu_struct_dfuse_image_get_alt_setting(const FuStructDfuseImage *st)
631
275
{
632
275
    g_return_val_if_fail(st != NULL, 0x0);
633
275
    return st->buf->data[6];
634
275
}
635
/**
636
 * fu_struct_dfuse_image_get_target_named: (skip):
637
 **/
638
guint32
639
fu_struct_dfuse_image_get_target_named(const FuStructDfuseImage *st)
640
275
{
641
275
    g_return_val_if_fail(st != NULL, 0x0);
642
275
    return fu_memread_uint32(st->buf->data + 7, G_LITTLE_ENDIAN);
643
275
}
644
/**
645
 * fu_struct_dfuse_image_get_target_name: (skip):
646
 **/
647
gchar *
648
fu_struct_dfuse_image_get_target_name(const FuStructDfuseImage *st)
649
70
{
650
70
    g_return_val_if_fail(st != NULL, NULL);
651
70
    return fu_memstrsafe(st->buf->data, st->buf->len, 11, 255, NULL);
652
70
}
653
/**
654
 * fu_struct_dfuse_image_get_target_size: (skip):
655
 **/
656
guint32
657
fu_struct_dfuse_image_get_target_size(const FuStructDfuseImage *st)
658
0
{
659
0
    g_return_val_if_fail(st != NULL, 0x0);
660
0
    return fu_memread_uint32(st->buf->data + 266, G_LITTLE_ENDIAN);
661
0
}
662
/**
663
 * fu_struct_dfuse_image_get_chunks: (skip):
664
 **/
665
guint32
666
fu_struct_dfuse_image_get_chunks(const FuStructDfuseImage *st)
667
275
{
668
275
    g_return_val_if_fail(st != NULL, 0x0);
669
275
    return fu_memread_uint32(st->buf->data + 270, G_LITTLE_ENDIAN);
670
275
}
671
672
/* setters */
673
/**
674
 * fu_struct_dfuse_image_set_sig: (skip):
675
 **/
676
static gboolean
677
fu_struct_dfuse_image_set_sig(FuStructDfuseImage *st, const gchar *value, GError **error)
678
80
{
679
80
    gsize len;
680
80
    g_return_val_if_fail(st != NULL, FALSE);
681
80
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
682
80
    if (value == NULL) {
683
0
        memset(st->buf->data + 0, 0x0, 6);
684
0
        return TRUE;
685
0
    }
686
80
    len = strlen(value);
687
80
    if (len > 6) {
688
0
        g_set_error(error,
689
0
                    FWUPD_ERROR,
690
0
                    FWUPD_ERROR_INVALID_DATA,
691
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuseImage.sig (0x%x bytes)",
692
0
                    value, (guint) len, (guint) 6);
693
0
        return FALSE;
694
0
    }
695
80
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
696
80
}
697
/**
698
 * fu_struct_dfuse_image_set_alt_setting: (skip):
699
 **/
700
void
701
fu_struct_dfuse_image_set_alt_setting(FuStructDfuseImage *st, guint8 value)
702
80
{
703
80
    g_return_if_fail(st != NULL);
704
80
    st->buf->data[6] = value;
705
80
}
706
/**
707
 * fu_struct_dfuse_image_set_target_named: (skip):
708
 **/
709
void
710
fu_struct_dfuse_image_set_target_named(FuStructDfuseImage *st, guint32 value)
711
33
{
712
33
    g_return_if_fail(st != NULL);
713
33
    fu_memwrite_uint32(st->buf->data + 7, value, G_LITTLE_ENDIAN);
714
33
}
715
/**
716
 * fu_struct_dfuse_image_set_target_name: (skip):
717
 **/
718
gboolean
719
fu_struct_dfuse_image_set_target_name(FuStructDfuseImage *st, const gchar *value, GError **error)
720
33
{
721
33
    gsize len;
722
33
    g_return_val_if_fail(st != NULL, FALSE);
723
33
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
724
33
    if (value == NULL) {
725
0
        memset(st->buf->data + 11, 0x0, 255);
726
0
        return TRUE;
727
0
    }
728
33
    len = strlen(value);
729
33
    if (len > 255) {
730
0
        g_set_error(error,
731
0
                    FWUPD_ERROR,
732
0
                    FWUPD_ERROR_INVALID_DATA,
733
0
                    "string '%s' (0x%x bytes) does not fit in FuStructDfuseImage.target_name (0x%x bytes)",
734
0
                    value, (guint) len, (guint) 255);
735
0
        return FALSE;
736
0
    }
737
33
    return fu_memcpy_safe(st->buf->data, st->buf->len, 11, (const guint8 *)value, len, 0x0, len, error);
738
33
}
739
/**
740
 * fu_struct_dfuse_image_set_target_size: (skip):
741
 **/
742
void
743
fu_struct_dfuse_image_set_target_size(FuStructDfuseImage *st, guint32 value)
744
80
{
745
80
    g_return_if_fail(st != NULL);
746
80
    fu_memwrite_uint32(st->buf->data + 266, value, G_LITTLE_ENDIAN);
747
80
}
748
/**
749
 * fu_struct_dfuse_image_set_chunks: (skip):
750
 **/
751
void
752
fu_struct_dfuse_image_set_chunks(FuStructDfuseImage *st, guint32 value)
753
80
{
754
80
    g_return_if_fail(st != NULL);
755
80
    fu_memwrite_uint32(st->buf->data + 270, value, G_LITTLE_ENDIAN);
756
80
}
757
/**
758
 * fu_struct_dfuse_image_new: (skip):
759
 **/
760
FuStructDfuseImage *
761
fu_struct_dfuse_image_new(void)
762
80
{
763
80
    FuStructDfuseImage *st = fu_struct_dfuse_image_new_internal();
764
80
    st->buf = g_byte_array_sized_new(274);
765
80
    fu_byte_array_set_size(st->buf, 274, 0x0);
766
80
    fu_struct_dfuse_image_set_sig(st, "Target", NULL);
767
80
    return st;
768
80
}
769
/**
770
 * fu_struct_dfuse_image_to_string: (skip):
771
 **/
772
static gchar *
773
fu_struct_dfuse_image_to_string(const FuStructDfuseImage *st)
774
0
{
775
0
    g_autoptr(GString) str = g_string_new("FuStructDfuseImage:\n");
776
0
    g_return_val_if_fail(st != NULL, NULL);
777
0
    {
778
0
        g_autofree gchar *tmp = fu_struct_dfuse_image_get_sig(st);
779
0
        if (tmp != NULL)
780
0
            g_string_append_printf(str, "  sig: %s\n", tmp);
781
0
    }
782
0
    g_string_append_printf(str, "  alt_setting: 0x%x\n",
783
0
                           (guint) fu_struct_dfuse_image_get_alt_setting(st));
784
0
    g_string_append_printf(str, "  target_named: 0x%x\n",
785
0
                           (guint) fu_struct_dfuse_image_get_target_named(st));
786
0
    {
787
0
        g_autofree gchar *tmp = fu_struct_dfuse_image_get_target_name(st);
788
0
        if (tmp != NULL)
789
0
            g_string_append_printf(str, "  target_name: %s\n", tmp);
790
0
    }
791
0
    g_string_append_printf(str, "  target_size: 0x%x\n",
792
0
                           (guint) fu_struct_dfuse_image_get_target_size(st));
793
0
    g_string_append_printf(str, "  chunks: 0x%x\n",
794
0
                           (guint) fu_struct_dfuse_image_get_chunks(st));
795
0
    if (str->len > 0)
796
0
        g_string_set_size(str, str->len - 1);
797
0
    return g_string_free(g_steal_pointer(&str), FALSE);
798
0
}
799
/**
800
 * fu_struct_dfuse_image_to_bytes: (skip):
801
 **/
802
GBytes *
803
fu_struct_dfuse_image_to_bytes(const FuStructDfuseImage *st)
804
80
{
805
80
    g_return_val_if_fail(st != NULL, NULL);
806
80
    return g_bytes_new(st->buf->data, st->buf->len);
807
80
}
808
static gboolean
809
fu_struct_dfuse_image_validate_internal(FuStructDfuseImage *st, GError **error)
810
329
{
811
329
    g_return_val_if_fail(st != NULL, FALSE);
812
329
    if (strncmp((const gchar *) (st->buf->data + 0), "Target", 6) != 0) {
813
54
        g_autofree gchar *str = fu_struct_dfuse_image_get_sig(st);
814
54
        g_set_error(error,
815
54
                    FWUPD_ERROR,
816
54
                    FWUPD_ERROR_INVALID_DATA,
817
54
                    "constant FuStructDfuseImage.sig was not valid, "
818
54
                    "expected 'Target' and got '%s'",
819
54
                    str);
820
54
        return FALSE;
821
54
    }
822
275
    return TRUE;
823
329
}
824
/**
825
 * fu_struct_dfuse_image_validate: (skip):
826
 **/
827
gboolean
828
fu_struct_dfuse_image_validate(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
829
0
{
830
0
    GByteArray st_buf = {.data = (guint8 *) buf + offset, .len = bufsz - offset, };
831
0
    FuStructDfuseImage st_tmp = {.buf = &st_buf };
832
0
    g_return_val_if_fail(buf != NULL, FALSE);
833
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
834
0
    if (!fu_memchk_read(bufsz, offset, 274, error)) {
835
0
        g_prefix_error_literal(error, "invalid struct FuStructDfuseImage: ");
836
0
        return FALSE;
837
0
    }
838
0
    if (!fu_struct_dfuse_image_validate_internal(&st_tmp, error))
839
0
        return FALSE;
840
0
    return TRUE;
841
0
}
842
static gboolean
843
fu_struct_dfuse_image_parse_internal(FuStructDfuseImage *st, GError **error)
844
329
{
845
329
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
846
0
        g_autofree gchar *str = fu_struct_dfuse_image_to_string(st);
847
0
        g_debug("%s", str);
848
0
    }
849
329
    if (!fu_struct_dfuse_image_validate_internal(st, error))
850
54
        return FALSE;
851
275
    return TRUE;
852
329
}
853
/**
854
 * fu_struct_dfuse_image_parse_stream: (skip):
855
 **/
856
FuStructDfuseImage *
857
fu_struct_dfuse_image_parse_stream(GInputStream *stream, gsize offset, GError **error)
858
396
{
859
396
    g_autoptr(FuStructDfuseImage) st = fu_struct_dfuse_image_new_internal();
860
396
    st->buf = fu_input_stream_read_byte_array(stream, offset, 274, NULL, error);
861
396
    if (st->buf == NULL) {
862
13
        g_prefix_error(error, "FuStructDfuseImage failed read of 0x%x: ", (guint) 274);
863
13
        return NULL;
864
13
    }
865
383
    if (st->buf->len != 274) {
866
54
        g_set_error(error,
867
54
                    FWUPD_ERROR,
868
54
                    FWUPD_ERROR_INVALID_DATA,
869
54
                    "FuStructDfuseImage requested 0x%x and got 0x%x",
870
54
                    (guint) 274,
871
54
                    (guint) st->buf->len);
872
54
        return NULL;
873
54
    }
874
329
    if (!fu_struct_dfuse_image_parse_internal(st, error))
875
54
        return NULL;
876
275
    return g_steal_pointer(&st);
877
329
}
878
/**
879
 * fu_struct_dfuse_element_ref: (skip):
880
 **/
881
FuStructDfuseElement *
882
fu_struct_dfuse_element_ref(FuStructDfuseElement *st)
883
0
{
884
0
    g_return_val_if_fail(st != NULL, NULL);
885
0
    st->refcount++;
886
0
    return st;
887
0
}
888
/**
889
 * fu_struct_dfuse_element_unref: (skip):
890
 **/
891
void
892
fu_struct_dfuse_element_unref(FuStructDfuseElement *st)
893
2.17k
{
894
2.17k
    g_return_if_fail(st != NULL);
895
2.17k
    if (st->refcount == 0) {
896
0
        g_critical("FuStructDfuseElement refcount already zero");
897
0
        return;
898
0
    }
899
2.17k
    if (--st->refcount > 0)
900
0
        return;
901
2.17k
    if (st->buf != NULL)
902
2.05k
        g_byte_array_unref(st->buf);
903
2.17k
    g_free(st);
904
2.17k
}
905
/**
906
 * fu_struct_dfuse_element_new_internal: (skip):
907
 **/
908
static FuStructDfuseElement *
909
fu_struct_dfuse_element_new_internal(void)
910
2.17k
{
911
2.17k
    FuStructDfuseElement *st = g_new0(FuStructDfuseElement, 1);
912
2.17k
    st->refcount = 1;
913
2.17k
    return st;
914
2.17k
}
915
916
/* getters */
917
/**
918
 * fu_struct_dfuse_element_get_address: (skip):
919
 **/
920
guint32
921
fu_struct_dfuse_element_get_address(const FuStructDfuseElement *st)
922
1.39k
{
923
1.39k
    g_return_val_if_fail(st != NULL, 0x0);
924
1.39k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
925
1.39k
}
926
/**
927
 * fu_struct_dfuse_element_get_size: (skip):
928
 **/
929
guint32
930
fu_struct_dfuse_element_get_size(const FuStructDfuseElement *st)
931
1.43k
{
932
1.43k
    g_return_val_if_fail(st != NULL, 0x0);
933
1.43k
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
934
1.43k
}
935
936
/* setters */
937
/**
938
 * fu_struct_dfuse_element_set_address: (skip):
939
 **/
940
void
941
fu_struct_dfuse_element_set_address(FuStructDfuseElement *st, guint32 value)
942
610
{
943
610
    g_return_if_fail(st != NULL);
944
610
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
945
610
}
946
/**
947
 * fu_struct_dfuse_element_set_size: (skip):
948
 **/
949
void
950
fu_struct_dfuse_element_set_size(FuStructDfuseElement *st, guint32 value)
951
610
{
952
610
    g_return_if_fail(st != NULL);
953
610
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
954
610
}
955
/**
956
 * fu_struct_dfuse_element_new: (skip):
957
 **/
958
FuStructDfuseElement *
959
fu_struct_dfuse_element_new(void)
960
610
{
961
610
    FuStructDfuseElement *st = fu_struct_dfuse_element_new_internal();
962
610
    st->buf = g_byte_array_sized_new(8);
963
610
    fu_byte_array_set_size(st->buf, 8, 0x0);
964
610
    return st;
965
610
}
966
/**
967
 * fu_struct_dfuse_element_to_string: (skip):
968
 **/
969
static gchar *
970
fu_struct_dfuse_element_to_string(const FuStructDfuseElement *st)
971
0
{
972
0
    g_autoptr(GString) str = g_string_new("FuStructDfuseElement:\n");
973
0
    g_return_val_if_fail(st != NULL, NULL);
974
0
    g_string_append_printf(str, "  address: 0x%x\n",
975
0
                           (guint) fu_struct_dfuse_element_get_address(st));
976
0
    g_string_append_printf(str, "  size: 0x%x\n",
977
0
                           (guint) fu_struct_dfuse_element_get_size(st));
978
0
    if (str->len > 0)
979
0
        g_string_set_size(str, str->len - 1);
980
0
    return g_string_free(g_steal_pointer(&str), FALSE);
981
0
}
982
/**
983
 * fu_struct_dfuse_element_to_bytes: (skip):
984
 **/
985
GBytes *
986
fu_struct_dfuse_element_to_bytes(const FuStructDfuseElement *st)
987
610
{
988
610
    g_return_val_if_fail(st != NULL, NULL);
989
610
    return g_bytes_new(st->buf->data, st->buf->len);
990
610
}
991
static gboolean
992
fu_struct_dfuse_element_validate_internal(FuStructDfuseElement *st, GError **error)
993
1.43k
{
994
1.43k
    g_return_val_if_fail(st != NULL, FALSE);
995
1.43k
    return TRUE;
996
1.43k
}
997
static gboolean
998
fu_struct_dfuse_element_parse_internal(FuStructDfuseElement *st, GError **error)
999
1.43k
{
1000
1.43k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1001
0
        g_autofree gchar *str = fu_struct_dfuse_element_to_string(st);
1002
0
        g_debug("%s", str);
1003
0
    }
1004
1.43k
    if (!fu_struct_dfuse_element_validate_internal(st, error))
1005
0
        return FALSE;
1006
1.43k
    return TRUE;
1007
1.43k
}
1008
/**
1009
 * fu_struct_dfuse_element_parse_stream: (skip):
1010
 **/
1011
FuStructDfuseElement *
1012
fu_struct_dfuse_element_parse_stream(GInputStream *stream, gsize offset, GError **error)
1013
1.56k
{
1014
1.56k
    g_autoptr(FuStructDfuseElement) st = fu_struct_dfuse_element_new_internal();
1015
1.56k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
1016
1.56k
    if (st->buf == NULL) {
1017
115
        g_prefix_error(error, "FuStructDfuseElement failed read of 0x%x: ", (guint) 8);
1018
115
        return NULL;
1019
115
    }
1020
1.44k
    if (st->buf->len != 8) {
1021
8
        g_set_error(error,
1022
8
                    FWUPD_ERROR,
1023
8
                    FWUPD_ERROR_INVALID_DATA,
1024
8
                    "FuStructDfuseElement requested 0x%x and got 0x%x",
1025
8
                    (guint) 8,
1026
8
                    (guint) st->buf->len);
1027
8
        return NULL;
1028
8
    }
1029
1.43k
    if (!fu_struct_dfuse_element_parse_internal(st, error))
1030
0
        return NULL;
1031
1.43k
    return g_steal_pointer(&st);
1032
1.43k
}