Coverage Report

Created: 2025-11-09 07:06

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