Coverage Report

Created: 2026-09-14 07:00

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