Coverage Report

Created: 2026-01-25 06:22

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
628
{
36
628
    g_return_if_fail(st != NULL);
37
628
    if (st->refcount == 0) {
38
0
        g_critical("FuStructDfuFtr refcount already zero");
39
0
        return;
40
0
    }
41
628
    if (--st->refcount > 0)
42
0
        return;
43
628
    if (st->buf != NULL)
44
622
        g_byte_array_unref(st->buf);
45
628
    g_free(st);
46
628
}
47
/**
48
 * fu_struct_dfu_ftr_new_internal: (skip):
49
 **/
50
static FuStructDfuFtr *
51
fu_struct_dfu_ftr_new_internal(void)
52
628
{
53
628
    FuStructDfuFtr *st = g_new0(FuStructDfuFtr, 1);
54
628
    st->refcount = 1;
55
628
    return st;
56
628
}
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
467
{
65
467
    g_return_val_if_fail(st != NULL, 0x0);
66
467
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
67
467
}
68
/**
69
 * fu_struct_dfu_ftr_get_pid: (skip):
70
 **/
71
guint16
72
fu_struct_dfu_ftr_get_pid(const FuStructDfuFtr *st)
73
467
{
74
467
    g_return_val_if_fail(st != NULL, 0x0);
75
467
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
76
467
}
77
/**
78
 * fu_struct_dfu_ftr_get_vid: (skip):
79
 **/
80
guint16
81
fu_struct_dfu_ftr_get_vid(const FuStructDfuFtr *st)
82
467
{
83
467
    g_return_val_if_fail(st != NULL, 0x0);
84
467
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
85
467
}
86
/**
87
 * fu_struct_dfu_ftr_get_ver: (skip):
88
 **/
89
guint16
90
fu_struct_dfu_ftr_get_ver(const FuStructDfuFtr *st)
91
467
{
92
467
    g_return_val_if_fail(st != NULL, 0x0);
93
467
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
94
467
}
95
/**
96
 * fu_struct_dfu_ftr_get_sig: (skip):
97
 **/
98
static gchar *
99
fu_struct_dfu_ftr_get_sig(const FuStructDfuFtr *st)
100
29
{
101
29
    g_return_val_if_fail(st != NULL, NULL);
102
29
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 3, NULL);
103
29
}
104
/**
105
 * fu_struct_dfu_ftr_get_len: (skip):
106
 **/
107
guint8
108
fu_struct_dfu_ftr_get_len(const FuStructDfuFtr *st)
109
467
{
110
467
    g_return_val_if_fail(st != NULL, 0x0);
111
467
    return st->buf->data[11];
112
467
}
113
/**
114
 * fu_struct_dfu_ftr_get_crc: (skip):
115
 **/
116
guint32
117
fu_struct_dfu_ftr_get_crc(const FuStructDfuFtr *st)
118
0
{
119
0
    g_return_val_if_fail(st != NULL, 0x0);
120
0
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
121
0
}
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
126
{
130
126
    g_return_if_fail(st != NULL);
131
126
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
132
126
}
133
/**
134
 * fu_struct_dfu_ftr_set_pid: (skip):
135
 **/
136
void
137
fu_struct_dfu_ftr_set_pid(FuStructDfuFtr *st, guint16 value)
138
126
{
139
126
    g_return_if_fail(st != NULL);
140
126
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
141
126
}
142
/**
143
 * fu_struct_dfu_ftr_set_vid: (skip):
144
 **/
145
void
146
fu_struct_dfu_ftr_set_vid(FuStructDfuFtr *st, guint16 value)
147
126
{
148
126
    g_return_if_fail(st != NULL);
149
126
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
150
126
}
151
/**
152
 * fu_struct_dfu_ftr_set_ver: (skip):
153
 **/
154
void
155
fu_struct_dfu_ftr_set_ver(FuStructDfuFtr *st, guint16 value)
156
126
{
157
126
    g_return_if_fail(st != NULL);
158
126
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
159
126
}
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
126
{
166
126
    gsize len;
167
126
    g_return_val_if_fail(st != NULL, FALSE);
168
126
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
169
126
    if (value == NULL) {
170
0
        memset(st->buf->data + 8, 0x0, 3);
171
0
        return TRUE;
172
0
    }
173
126
    len = strlen(value);
174
126
    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
126
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
183
126
}
184
/**
185
 * fu_struct_dfu_ftr_set_len: (skip):
186
 **/
187
void
188
fu_struct_dfu_ftr_set_len(FuStructDfuFtr *st, guint8 value)
189
126
{
190
126
    g_return_if_fail(st != NULL);
191
126
    st->buf->data[11] = value;
192
126
}
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
126
{
208
126
    FuStructDfuFtr *st = fu_struct_dfu_ftr_new_internal();
209
126
    st->buf = g_byte_array_sized_new(16);
210
126
    fu_byte_array_set_size(st->buf, 16, 0x0);
211
126
    fu_struct_dfu_ftr_set_sig(st, "UFD", NULL);
212
126
    fu_struct_dfu_ftr_set_len(st, 16);
213
126
    return st;
214
126
}
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
496
{
247
496
    g_return_val_if_fail(st != NULL, FALSE);
248
496
    if (strncmp((const gchar *) (st->buf->data + 8), "UFD", 3) != 0) {
249
29
        g_autofree gchar *str = fu_struct_dfu_ftr_get_sig(st);
250
29
        g_set_error(error,
251
29
                    FWUPD_ERROR,
252
29
                    FWUPD_ERROR_INVALID_DATA,
253
29
                    "constant FuStructDfuFtr.sig was not valid, "
254
29
                    "expected 'UFD' and got '%s'",
255
29
                    str);
256
29
        return FALSE;
257
29
    }
258
467
    return TRUE;
259
496
}
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
496
{
288
496
    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
496
    if (!fu_struct_dfu_ftr_validate_internal(st, error))
293
29
        return FALSE;
294
467
    return TRUE;
295
496
}
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
502
{
302
502
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
303
502
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
304
502
    if (st->buf == NULL) {
305
6
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
306
6
        return NULL;
307
6
    }
308
496
    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
496
    if (!fu_struct_dfu_ftr_parse_internal(st, error))
318
29
        return NULL;
319
467
    return g_steal_pointer(&st);
320
496
}
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
1.16k
{
337
1.16k
    g_return_if_fail(st != NULL);
338
1.16k
    if (st->refcount == 0) {
339
0
        g_critical("FuStructDfuseHdr refcount already zero");
340
0
        return;
341
0
    }
342
1.16k
    if (--st->refcount > 0)
343
0
        return;
344
1.16k
    if (st->buf != NULL)
345
1.16k
        g_byte_array_unref(st->buf);
346
1.16k
    g_free(st);
347
1.16k
}
348
/**
349
 * fu_struct_dfuse_hdr_new_internal: (skip):
350
 **/
351
static FuStructDfuseHdr *
352
fu_struct_dfuse_hdr_new_internal(void)
353
1.16k
{
354
1.16k
    FuStructDfuseHdr *st = g_new0(FuStructDfuseHdr, 1);
355
1.16k
    st->refcount = 1;
356
1.16k
    return st;
357
1.16k
}
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
58
{
366
58
    g_return_val_if_fail(st != NULL, NULL);
367
58
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
368
58
}
369
/**
370
 * fu_struct_dfuse_hdr_get_ver: (skip):
371
 **/
372
static guint8
373
fu_struct_dfuse_hdr_get_ver(const FuStructDfuseHdr *st)
374
972
{
375
972
    g_return_val_if_fail(st != NULL, 0x0);
376
972
    return st->buf->data[5];
377
972
}
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
542
{
384
542
    g_return_val_if_fail(st != NULL, 0x0);
385
542
    return fu_memread_uint32(st->buf->data + 6, G_LITTLE_ENDIAN);
386
542
}
387
/**
388
 * fu_struct_dfuse_hdr_get_targets: (skip):
389
 **/
390
guint8
391
fu_struct_dfuse_hdr_get_targets(const FuStructDfuseHdr *st)
392
386
{
393
386
    g_return_val_if_fail(st != NULL, 0x0);
394
386
    return st->buf->data[10];
395
386
}
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
126
{
404
126
    gsize len;
405
126
    g_return_val_if_fail(st != NULL, FALSE);
406
126
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
407
126
    if (value == NULL) {
408
0
        memset(st->buf->data + 0, 0x0, 5);
409
0
        return TRUE;
410
0
    }
411
126
    len = strlen(value);
412
126
    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
126
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
421
126
}
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
126
{
428
126
    g_return_if_fail(st != NULL);
429
126
    st->buf->data[5] = value;
430
126
}
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
126
{
437
126
    g_return_if_fail(st != NULL);
438
126
    fu_memwrite_uint32(st->buf->data + 6, value, G_LITTLE_ENDIAN);
439
126
}
440
/**
441
 * fu_struct_dfuse_hdr_set_targets: (skip):
442
 **/
443
void
444
fu_struct_dfuse_hdr_set_targets(FuStructDfuseHdr *st, guint8 value)
445
126
{
446
126
    g_return_if_fail(st != NULL);
447
126
    st->buf->data[10] = value;
448
126
}
449
/**
450
 * fu_struct_dfuse_hdr_new: (skip):
451
 **/
452
FuStructDfuseHdr *
453
fu_struct_dfuse_hdr_new(void)
454
126
{
455
126
    FuStructDfuseHdr *st = fu_struct_dfuse_hdr_new_internal();
456
126
    st->buf = g_byte_array_sized_new(11);
457
126
    fu_byte_array_set_size(st->buf, 11, 0x0);
458
126
    fu_struct_dfuse_hdr_set_sig(st, "DfuSe", NULL);
459
126
    fu_struct_dfuse_hdr_set_ver(st, 0x01);
460
126
    return st;
461
126
}
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
126
{
491
126
    g_return_val_if_fail(st != NULL, NULL);
492
126
    return g_bytes_new(st->buf->data, st->buf->len);
493
126
}
494
static gboolean
495
fu_struct_dfuse_hdr_validate_internal(FuStructDfuseHdr *st, GError **error)
496
1.03k
{
497
1.03k
    g_return_val_if_fail(st != NULL, FALSE);
498
1.03k
    if (strncmp((const gchar *) (st->buf->data + 0), "DfuSe", 5) != 0) {
499
58
        g_autofree gchar *str = fu_struct_dfuse_hdr_get_sig(st);
500
58
        g_set_error(error,
501
58
                    FWUPD_ERROR,
502
58
                    FWUPD_ERROR_INVALID_DATA,
503
58
                    "constant FuStructDfuseHdr.sig was not valid, "
504
58
                    "expected 'DfuSe' and got '%s'",
505
58
                    str);
506
58
        return FALSE;
507
58
    }
508
972
    if (fu_struct_dfuse_hdr_get_ver(st) != 0x01) {
509
6
        g_set_error_literal(error,
510
6
                            FWUPD_ERROR,
511
6
                            FWUPD_ERROR_INVALID_DATA,
512
6
                            "constant FuStructDfuseHdr.ver was not valid");
513
6
        return FALSE;
514
6
    }
515
966
    return TRUE;
516
972
}
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
578
{
523
578
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
524
578
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
525
578
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
526
578
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
527
578
    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
578
    if (st->buf->len != 11) {
532
12
        g_set_error(error,
533
12
                    FWUPD_ERROR,
534
12
                    FWUPD_ERROR_INVALID_DATA,
535
12
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
536
12
                    (guint) 11,
537
12
                    (guint) st->buf->len);
538
12
        return FALSE;
539
12
    }
540
566
    return fu_struct_dfuse_hdr_validate_internal(st, error);
541
578
}
542
static gboolean
543
fu_struct_dfuse_hdr_parse_internal(FuStructDfuseHdr *st, GError **error)
544
464
{
545
464
    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
464
    if (!fu_struct_dfuse_hdr_validate_internal(st, error))
550
0
        return FALSE;
551
464
    return TRUE;
552
464
}
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
464
{
559
464
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
560
464
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
561
464
    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
464
    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
464
    if (!fu_struct_dfuse_hdr_parse_internal(st, error))
575
0
        return NULL;
576
464
    return g_steal_pointer(&st);
577
464
}
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
527
{
594
527
    g_return_if_fail(st != NULL);
595
527
    if (st->refcount == 0) {
596
0
        g_critical("FuStructDfuseImage refcount already zero");
597
0
        return;
598
0
    }
599
527
    if (--st->refcount > 0)
600
0
        return;
601
527
    if (st->buf != NULL)
602
512
        g_byte_array_unref(st->buf);
603
527
    g_free(st);
604
527
}
605
/**
606
 * fu_struct_dfuse_image_new_internal: (skip):
607
 **/
608
static FuStructDfuseImage *
609
fu_struct_dfuse_image_new_internal(void)
610
527
{
611
527
    FuStructDfuseImage *st = g_new0(FuStructDfuseImage, 1);
612
527
    st->refcount = 1;
613
527
    return st;
614
527
}
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
50
{
623
50
    g_return_val_if_fail(st != NULL, NULL);
624
50
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 6, NULL);
625
50
}
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
325
{
632
325
    g_return_val_if_fail(st != NULL, 0x0);
633
325
    return st->buf->data[6];
634
325
}
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
325
{
641
325
    g_return_val_if_fail(st != NULL, 0x0);
642
325
    return fu_memread_uint32(st->buf->data + 7, G_LITTLE_ENDIAN);
643
325
}
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
112
{
650
112
    g_return_val_if_fail(st != NULL, NULL);
651
112
    return fu_memstrsafe(st->buf->data, st->buf->len, 11, 255, NULL);
652
112
}
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
325
{
668
325
    g_return_val_if_fail(st != NULL, 0x0);
669
325
    return fu_memread_uint32(st->buf->data + 270, G_LITTLE_ENDIAN);
670
325
}
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
113
{
679
113
    gsize len;
680
113
    g_return_val_if_fail(st != NULL, FALSE);
681
113
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
682
113
    if (value == NULL) {
683
0
        memset(st->buf->data + 0, 0x0, 6);
684
0
        return TRUE;
685
0
    }
686
113
    len = strlen(value);
687
113
    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
113
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
696
113
}
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
113
{
703
113
    g_return_if_fail(st != NULL);
704
113
    st->buf->data[6] = value;
705
113
}
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
58
{
712
58
    g_return_if_fail(st != NULL);
713
58
    fu_memwrite_uint32(st->buf->data + 7, value, G_LITTLE_ENDIAN);
714
58
}
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
58
{
721
58
    gsize len;
722
58
    g_return_val_if_fail(st != NULL, FALSE);
723
58
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
724
58
    if (value == NULL) {
725
0
        memset(st->buf->data + 11, 0x0, 255);
726
0
        return TRUE;
727
0
    }
728
58
    len = strlen(value);
729
58
    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
58
    return fu_memcpy_safe(st->buf->data, st->buf->len, 11, (const guint8 *)value, len, 0x0, len, error);
738
58
}
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
113
{
745
113
    g_return_if_fail(st != NULL);
746
113
    fu_memwrite_uint32(st->buf->data + 266, value, G_LITTLE_ENDIAN);
747
113
}
748
/**
749
 * fu_struct_dfuse_image_set_chunks: (skip):
750
 **/
751
void
752
fu_struct_dfuse_image_set_chunks(FuStructDfuseImage *st, guint32 value)
753
113
{
754
113
    g_return_if_fail(st != NULL);
755
113
    fu_memwrite_uint32(st->buf->data + 270, value, G_LITTLE_ENDIAN);
756
113
}
757
/**
758
 * fu_struct_dfuse_image_new: (skip):
759
 **/
760
FuStructDfuseImage *
761
fu_struct_dfuse_image_new(void)
762
113
{
763
113
    FuStructDfuseImage *st = fu_struct_dfuse_image_new_internal();
764
113
    st->buf = g_byte_array_sized_new(274);
765
113
    fu_byte_array_set_size(st->buf, 274, 0x0);
766
113
    fu_struct_dfuse_image_set_sig(st, "Target", NULL);
767
113
    return st;
768
113
}
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
113
{
805
113
    g_return_val_if_fail(st != NULL, NULL);
806
113
    return g_bytes_new(st->buf->data, st->buf->len);
807
113
}
808
static gboolean
809
fu_struct_dfuse_image_validate_internal(FuStructDfuseImage *st, GError **error)
810
375
{
811
375
    g_return_val_if_fail(st != NULL, FALSE);
812
375
    if (strncmp((const gchar *) (st->buf->data + 0), "Target", 6) != 0) {
813
50
        g_autofree gchar *str = fu_struct_dfuse_image_get_sig(st);
814
50
        g_set_error(error,
815
50
                    FWUPD_ERROR,
816
50
                    FWUPD_ERROR_INVALID_DATA,
817
50
                    "constant FuStructDfuseImage.sig was not valid, "
818
50
                    "expected 'Target' and got '%s'",
819
50
                    str);
820
50
        return FALSE;
821
50
    }
822
325
    return TRUE;
823
375
}
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
375
{
845
375
    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
375
    if (!fu_struct_dfuse_image_validate_internal(st, error))
850
50
        return FALSE;
851
325
    return TRUE;
852
375
}
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
414
{
859
414
    g_autoptr(FuStructDfuseImage) st = fu_struct_dfuse_image_new_internal();
860
414
    st->buf = fu_input_stream_read_byte_array(stream, offset, 274, NULL, error);
861
414
    if (st->buf == NULL) {
862
15
        g_prefix_error(error, "FuStructDfuseImage failed read of 0x%x: ", (guint) 274);
863
15
        return NULL;
864
15
    }
865
399
    if (st->buf->len != 274) {
866
24
        g_set_error(error,
867
24
                    FWUPD_ERROR,
868
24
                    FWUPD_ERROR_INVALID_DATA,
869
24
                    "FuStructDfuseImage requested 0x%x and got 0x%x",
870
24
                    (guint) 274,
871
24
                    (guint) st->buf->len);
872
24
        return NULL;
873
24
    }
874
375
    if (!fu_struct_dfuse_image_parse_internal(st, error))
875
50
        return NULL;
876
325
    return g_steal_pointer(&st);
877
375
}
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
3.79k
{
894
3.79k
    g_return_if_fail(st != NULL);
895
3.79k
    if (st->refcount == 0) {
896
0
        g_critical("FuStructDfuseElement refcount already zero");
897
0
        return;
898
0
    }
899
3.79k
    if (--st->refcount > 0)
900
0
        return;
901
3.79k
    if (st->buf != NULL)
902
3.68k
        g_byte_array_unref(st->buf);
903
3.79k
    g_free(st);
904
3.79k
}
905
/**
906
 * fu_struct_dfuse_element_new_internal: (skip):
907
 **/
908
static FuStructDfuseElement *
909
fu_struct_dfuse_element_new_internal(void)
910
3.79k
{
911
3.79k
    FuStructDfuseElement *st = g_new0(FuStructDfuseElement, 1);
912
3.79k
    st->refcount = 1;
913
3.79k
    return st;
914
3.79k
}
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
2.75k
{
923
2.75k
    g_return_val_if_fail(st != NULL, 0x0);
924
2.75k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
925
2.75k
}
926
/**
927
 * fu_struct_dfuse_element_get_size: (skip):
928
 **/
929
guint32
930
fu_struct_dfuse_element_get_size(const FuStructDfuseElement *st)
931
2.80k
{
932
2.80k
    g_return_val_if_fail(st != NULL, 0x0);
933
2.80k
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
934
2.80k
}
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
876
{
943
876
    g_return_if_fail(st != NULL);
944
876
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
945
876
}
946
/**
947
 * fu_struct_dfuse_element_set_size: (skip):
948
 **/
949
void
950
fu_struct_dfuse_element_set_size(FuStructDfuseElement *st, guint32 value)
951
876
{
952
876
    g_return_if_fail(st != NULL);
953
876
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
954
876
}
955
/**
956
 * fu_struct_dfuse_element_new: (skip):
957
 **/
958
FuStructDfuseElement *
959
fu_struct_dfuse_element_new(void)
960
876
{
961
876
    FuStructDfuseElement *st = fu_struct_dfuse_element_new_internal();
962
876
    st->buf = g_byte_array_sized_new(8);
963
876
    fu_byte_array_set_size(st->buf, 8, 0x0);
964
876
    return st;
965
876
}
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
876
{
988
876
    g_return_val_if_fail(st != NULL, NULL);
989
876
    return g_bytes_new(st->buf->data, st->buf->len);
990
876
}
991
static gboolean
992
fu_struct_dfuse_element_validate_internal(FuStructDfuseElement *st, GError **error)
993
2.80k
{
994
2.80k
    g_return_val_if_fail(st != NULL, FALSE);
995
2.80k
    return TRUE;
996
2.80k
}
997
static gboolean
998
fu_struct_dfuse_element_parse_internal(FuStructDfuseElement *st, GError **error)
999
2.80k
{
1000
2.80k
    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
2.80k
    if (!fu_struct_dfuse_element_validate_internal(st, error))
1005
0
        return FALSE;
1006
2.80k
    return TRUE;
1007
2.80k
}
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
2.92k
{
1014
2.92k
    g_autoptr(FuStructDfuseElement) st = fu_struct_dfuse_element_new_internal();
1015
2.92k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
1016
2.92k
    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
2.80k
    if (st->buf->len != 8) {
1021
6
        g_set_error(error,
1022
6
                    FWUPD_ERROR,
1023
6
                    FWUPD_ERROR_INVALID_DATA,
1024
6
                    "FuStructDfuseElement requested 0x%x and got 0x%x",
1025
6
                    (guint) 8,
1026
6
                    (guint) st->buf->len);
1027
6
        return NULL;
1028
6
    }
1029
2.80k
    if (!fu_struct_dfuse_element_parse_internal(st, error))
1030
0
        return NULL;
1031
2.80k
    return g_steal_pointer(&st);
1032
2.80k
}