Coverage Report

Created: 2025-11-11 06:44

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.30k
{
31
1.30k
    g_return_if_fail(st != NULL);
32
1.30k
    if (st->refcount == 0) {
33
0
        g_critical("FuStructDfuFtr refcount already zero");
34
0
        return;
35
0
    }
36
1.30k
    if (--st->refcount > 0)
37
0
        return;
38
1.30k
    if (st->buf != NULL)
39
1.25k
        g_byte_array_unref(st->buf);
40
1.30k
    g_free(st);
41
1.30k
}
42
static FuStructDfuFtr *
43
fu_struct_dfu_ftr_new_internal(void)
44
1.30k
{
45
1.30k
    FuStructDfuFtr *st = g_new0(FuStructDfuFtr, 1);
46
1.30k
    st->refcount = 1;
47
1.30k
    return st;
48
1.30k
}
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
1.05k
{
57
1.05k
    g_return_val_if_fail(st != NULL, 0x0);
58
1.05k
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
59
1.05k
}
60
/**
61
 * fu_struct_dfu_ftr_get_pid: (skip):
62
 **/
63
guint16
64
fu_struct_dfu_ftr_get_pid(const FuStructDfuFtr *st)
65
1.05k
{
66
1.05k
    g_return_val_if_fail(st != NULL, 0x0);
67
1.05k
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
68
1.05k
}
69
/**
70
 * fu_struct_dfu_ftr_get_vid: (skip):
71
 **/
72
guint16
73
fu_struct_dfu_ftr_get_vid(const FuStructDfuFtr *st)
74
1.05k
{
75
1.05k
    g_return_val_if_fail(st != NULL, 0x0);
76
1.05k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
77
1.05k
}
78
/**
79
 * fu_struct_dfu_ftr_get_ver: (skip):
80
 **/
81
guint16
82
fu_struct_dfu_ftr_get_ver(const FuStructDfuFtr *st)
83
1.05k
{
84
1.05k
    g_return_val_if_fail(st != NULL, 0x0);
85
1.05k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
86
1.05k
}
87
/**
88
 * fu_struct_dfu_ftr_get_sig: (skip):
89
 **/
90
static gchar *
91
fu_struct_dfu_ftr_get_sig(const FuStructDfuFtr *st)
92
101
{
93
101
    g_return_val_if_fail(st != NULL, NULL);
94
101
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 3, NULL);
95
101
}
96
/**
97
 * fu_struct_dfu_ftr_get_len: (skip):
98
 **/
99
guint8
100
fu_struct_dfu_ftr_get_len(const FuStructDfuFtr *st)
101
1.05k
{
102
1.05k
    g_return_val_if_fail(st != NULL, 0x0);
103
1.05k
    return st->buf->data[11];
104
1.05k
}
105
/**
106
 * fu_struct_dfu_ftr_get_crc: (skip):
107
 **/
108
guint32
109
fu_struct_dfu_ftr_get_crc(const FuStructDfuFtr *st)
110
1.05k
{
111
1.05k
    g_return_val_if_fail(st != NULL, 0x0);
112
1.05k
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
113
1.05k
}
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
99
{
122
99
    g_return_if_fail(st != NULL);
123
99
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
124
99
}
125
/**
126
 * fu_struct_dfu_ftr_set_pid: (skip):
127
 **/
128
void
129
fu_struct_dfu_ftr_set_pid(FuStructDfuFtr *st, guint16 value)
130
99
{
131
99
    g_return_if_fail(st != NULL);
132
99
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
133
99
}
134
/**
135
 * fu_struct_dfu_ftr_set_vid: (skip):
136
 **/
137
void
138
fu_struct_dfu_ftr_set_vid(FuStructDfuFtr *st, guint16 value)
139
99
{
140
99
    g_return_if_fail(st != NULL);
141
99
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
142
99
}
143
/**
144
 * fu_struct_dfu_ftr_set_ver: (skip):
145
 **/
146
void
147
fu_struct_dfu_ftr_set_ver(FuStructDfuFtr *st, guint16 value)
148
99
{
149
99
    g_return_if_fail(st != NULL);
150
99
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
151
99
}
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
99
{
158
99
    gsize len;
159
99
    g_return_val_if_fail(st != NULL, FALSE);
160
99
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
161
99
    if (value == NULL) {
162
0
        memset(st->buf->data + 8, 0x0, 3);
163
0
        return TRUE;
164
0
    }
165
99
    len = strlen(value);
166
99
    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
99
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
175
99
}
176
/**
177
 * fu_struct_dfu_ftr_set_len: (skip):
178
 **/
179
void
180
fu_struct_dfu_ftr_set_len(FuStructDfuFtr *st, guint8 value)
181
99
{
182
99
    g_return_if_fail(st != NULL);
183
99
    st->buf->data[11] = value;
184
99
}
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
99
{
200
99
    FuStructDfuFtr *st = fu_struct_dfu_ftr_new_internal();
201
99
    st->buf = g_byte_array_sized_new(16);
202
99
    fu_byte_array_set_size(st->buf, 16, 0x0);
203
99
    fu_struct_dfu_ftr_set_sig(st, "UFD", NULL);
204
99
    fu_struct_dfu_ftr_set_len(st, 16);
205
99
    return st;
206
99
}
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.15k
{
234
1.15k
    g_return_val_if_fail(st != NULL, FALSE);
235
1.15k
    if (strncmp((const gchar *) (st->buf->data + 8), "UFD", 3) != 0) {
236
101
        g_autofree gchar *str = fu_struct_dfu_ftr_get_sig(st);
237
101
        g_set_error(error,
238
101
                    FWUPD_ERROR,
239
101
                    FWUPD_ERROR_INVALID_DATA,
240
101
                    "constant FuStructDfuFtr.sig was not valid, "
241
101
                    "expected 'UFD' and got '%s'",
242
101
                    str);
243
101
        return FALSE;
244
101
    }
245
1.05k
    return TRUE;
246
1.15k
}
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.15k
{
275
1.15k
    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.15k
    if (!fu_struct_dfu_ftr_validate_internal(st, error))
280
101
        return FALSE;
281
1.05k
    return TRUE;
282
1.15k
}
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.20k
{
289
1.20k
    g_autoptr(FuStructDfuFtr) st = fu_struct_dfu_ftr_new_internal();
290
1.20k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
291
1.20k
    if (st->buf == NULL) {
292
50
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
293
50
        return NULL;
294
50
    }
295
1.15k
    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.15k
    if (!fu_struct_dfu_ftr_parse_internal(st, error))
305
101
        return NULL;
306
1.05k
    return g_steal_pointer(&st);
307
1.15k
}
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
505k
{
324
505k
    g_return_if_fail(st != NULL);
325
505k
    if (st->refcount == 0) {
326
0
        g_critical("FuStructDfuseHdr refcount already zero");
327
0
        return;
328
0
    }
329
505k
    if (--st->refcount > 0)
330
0
        return;
331
505k
    if (st->buf != NULL)
332
505k
        g_byte_array_unref(st->buf);
333
505k
    g_free(st);
334
505k
}
335
static FuStructDfuseHdr *
336
fu_struct_dfuse_hdr_new_internal(void)
337
505k
{
338
505k
    FuStructDfuseHdr *st = g_new0(FuStructDfuseHdr, 1);
339
505k
    st->refcount = 1;
340
505k
    return st;
341
505k
}
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
500k
{
350
500k
    g_return_val_if_fail(st != NULL, NULL);
351
500k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
352
500k
}
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.42k
{
359
2.42k
    g_return_val_if_fail(st != NULL, 0x0);
360
2.42k
    return st->buf->data[5];
361
2.42k
}
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
690
{
368
690
    g_return_val_if_fail(st != NULL, 0x0);
369
690
    return fu_memread_uint32(st->buf->data + 6, G_LITTLE_ENDIAN);
370
690
}
371
/**
372
 * fu_struct_dfuse_hdr_get_targets: (skip):
373
 **/
374
guint8
375
fu_struct_dfuse_hdr_get_targets(const FuStructDfuseHdr *st)
376
382
{
377
382
    g_return_val_if_fail(st != NULL, 0x0);
378
382
    return st->buf->data[10];
379
382
}
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
99
{
388
99
    gsize len;
389
99
    g_return_val_if_fail(st != NULL, FALSE);
390
99
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
391
99
    if (value == NULL) {
392
0
        memset(st->buf->data + 0, 0x0, 5);
393
0
        return TRUE;
394
0
    }
395
99
    len = strlen(value);
396
99
    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
99
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
405
99
}
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
99
{
412
99
    g_return_if_fail(st != NULL);
413
99
    st->buf->data[5] = value;
414
99
}
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
99
{
421
99
    g_return_if_fail(st != NULL);
422
99
    fu_memwrite_uint32(st->buf->data + 6, value, G_LITTLE_ENDIAN);
423
99
}
424
/**
425
 * fu_struct_dfuse_hdr_set_targets: (skip):
426
 **/
427
void
428
fu_struct_dfuse_hdr_set_targets(FuStructDfuseHdr *st, guint8 value)
429
99
{
430
99
    g_return_if_fail(st != NULL);
431
99
    st->buf->data[10] = value;
432
99
}
433
/**
434
 * fu_struct_dfuse_hdr_new: (skip):
435
 **/
436
FuStructDfuseHdr *
437
fu_struct_dfuse_hdr_new(void)
438
99
{
439
99
    FuStructDfuseHdr *st = fu_struct_dfuse_hdr_new_internal();
440
99
    st->buf = g_byte_array_sized_new(11);
441
99
    fu_byte_array_set_size(st->buf, 11, 0x0);
442
99
    fu_struct_dfuse_hdr_set_sig(st, "DfuSe", NULL);
443
99
    fu_struct_dfuse_hdr_set_ver(st, 0x01);
444
99
    return st;
445
99
}
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
99
{
468
99
    g_return_val_if_fail(st != NULL, NULL);
469
99
    return g_bytes_new(st->buf->data, st->buf->len);
470
99
}
471
static gboolean
472
fu_struct_dfuse_hdr_validate_internal(FuStructDfuseHdr *st, GError **error)
473
503k
{
474
503k
    g_return_val_if_fail(st != NULL, FALSE);
475
503k
    if (strncmp((const gchar *) (st->buf->data + 0), "DfuSe", 5) != 0) {
476
500k
        g_autofree gchar *str = fu_struct_dfuse_hdr_get_sig(st);
477
500k
        g_set_error(error,
478
500k
                    FWUPD_ERROR,
479
500k
                    FWUPD_ERROR_INVALID_DATA,
480
500k
                    "constant FuStructDfuseHdr.sig was not valid, "
481
500k
                    "expected 'DfuSe' and got '%s'",
482
500k
                    str);
483
500k
        return FALSE;
484
500k
    }
485
2.42k
    if (fu_struct_dfuse_hdr_get_ver(st) != 0x01) {
486
685
        g_set_error_literal(error,
487
685
                            FWUPD_ERROR,
488
685
                            FWUPD_ERROR_INVALID_DATA,
489
685
                            "constant FuStructDfuseHdr.ver was not valid");
490
685
        return FALSE;
491
685
    }
492
1.74k
    return TRUE;
493
2.42k
}
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
504k
{
500
504k
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
501
504k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
502
504k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
503
504k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
504
504k
    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
504k
    if (st->buf->len != 11) {
509
1.84k
        g_set_error(error,
510
1.84k
                    FWUPD_ERROR,
511
1.84k
                    FWUPD_ERROR_INVALID_DATA,
512
1.84k
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
513
1.84k
                    (guint) 11,
514
1.84k
                    (guint) st->buf->len);
515
1.84k
        return FALSE;
516
1.84k
    }
517
502k
    return fu_struct_dfuse_hdr_validate_internal(st, error);
518
504k
}
519
static gboolean
520
fu_struct_dfuse_hdr_parse_internal(FuStructDfuseHdr *st, GError **error)
521
536
{
522
536
    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
536
    if (!fu_struct_dfuse_hdr_validate_internal(st, error))
527
0
        return FALSE;
528
536
    return TRUE;
529
536
}
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
536
{
536
536
    g_autoptr(FuStructDfuseHdr) st = fu_struct_dfuse_hdr_new_internal();
537
536
    st->buf = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
538
536
    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
536
    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
536
    if (!fu_struct_dfuse_hdr_parse_internal(st, error))
552
0
        return NULL;
553
536
    return g_steal_pointer(&st);
554
536
}
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
459
{
571
459
    g_return_if_fail(st != NULL);
572
459
    if (st->refcount == 0) {
573
0
        g_critical("FuStructDfuseImage refcount already zero");
574
0
        return;
575
0
    }
576
459
    if (--st->refcount > 0)
577
0
        return;
578
459
    if (st->buf != NULL)
579
445
        g_byte_array_unref(st->buf);
580
459
    g_free(st);
581
459
}
582
static FuStructDfuseImage *
583
fu_struct_dfuse_image_new_internal(void)
584
459
{
585
459
    FuStructDfuseImage *st = g_new0(FuStructDfuseImage, 1);
586
459
    st->refcount = 1;
587
459
    return st;
588
459
}
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
271
{
606
271
    g_return_val_if_fail(st != NULL, 0x0);
607
271
    return st->buf->data[6];
608
271
}
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
271
{
615
271
    g_return_val_if_fail(st != NULL, 0x0);
616
271
    return fu_memread_uint32(st->buf->data + 7, G_LITTLE_ENDIAN);
617
271
}
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
76
{
624
76
    g_return_val_if_fail(st != NULL, NULL);
625
76
    return fu_memstrsafe(st->buf->data, st->buf->len, 11, 255, NULL);
626
76
}
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
271
{
642
271
    g_return_val_if_fail(st != NULL, 0x0);
643
271
    return fu_memread_uint32(st->buf->data + 270, G_LITTLE_ENDIAN);
644
271
}
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
74
{
653
74
    gsize len;
654
74
    g_return_val_if_fail(st != NULL, FALSE);
655
74
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
656
74
    if (value == NULL) {
657
0
        memset(st->buf->data + 0, 0x0, 6);
658
0
        return TRUE;
659
0
    }
660
74
    len = strlen(value);
661
74
    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
74
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
670
74
}
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
74
{
677
74
    g_return_if_fail(st != NULL);
678
74
    st->buf->data[6] = value;
679
74
}
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
30
{
686
30
    g_return_if_fail(st != NULL);
687
30
    fu_memwrite_uint32(st->buf->data + 7, value, G_LITTLE_ENDIAN);
688
30
}
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
30
{
695
30
    gsize len;
696
30
    g_return_val_if_fail(st != NULL, FALSE);
697
30
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
698
30
    if (value == NULL) {
699
0
        memset(st->buf->data + 11, 0x0, 255);
700
0
        return TRUE;
701
0
    }
702
30
    len = strlen(value);
703
30
    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
30
    return fu_memcpy_safe(st->buf->data, st->buf->len, 11, (const guint8 *)value, len, 0x0, len, error);
712
30
}
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
74
{
719
74
    g_return_if_fail(st != NULL);
720
74
    fu_memwrite_uint32(st->buf->data + 266, value, G_LITTLE_ENDIAN);
721
74
}
722
/**
723
 * fu_struct_dfuse_image_set_chunks: (skip):
724
 **/
725
void
726
fu_struct_dfuse_image_set_chunks(FuStructDfuseImage *st, guint32 value)
727
74
{
728
74
    g_return_if_fail(st != NULL);
729
74
    fu_memwrite_uint32(st->buf->data + 270, value, G_LITTLE_ENDIAN);
730
74
}
731
/**
732
 * fu_struct_dfuse_image_new: (skip):
733
 **/
734
FuStructDfuseImage *
735
fu_struct_dfuse_image_new(void)
736
74
{
737
74
    FuStructDfuseImage *st = fu_struct_dfuse_image_new_internal();
738
74
    st->buf = g_byte_array_sized_new(274);
739
74
    fu_byte_array_set_size(st->buf, 274, 0x0);
740
74
    fu_struct_dfuse_image_set_sig(st, "Target", NULL);
741
74
    return st;
742
74
}
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
74
{
774
74
    g_return_val_if_fail(st != NULL, NULL);
775
74
    return g_bytes_new(st->buf->data, st->buf->len);
776
74
}
777
static gboolean
778
fu_struct_dfuse_image_validate_internal(FuStructDfuseImage *st, GError **error)
779
324
{
780
324
    g_return_val_if_fail(st != NULL, FALSE);
781
324
    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
271
    return TRUE;
792
324
}
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
324
{
814
324
    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
324
    if (!fu_struct_dfuse_image_validate_internal(st, error))
819
53
        return FALSE;
820
271
    return TRUE;
821
324
}
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
385
{
828
385
    g_autoptr(FuStructDfuseImage) st = fu_struct_dfuse_image_new_internal();
829
385
    st->buf = fu_input_stream_read_byte_array(stream, offset, 274, NULL, error);
830
385
    if (st->buf == NULL) {
831
14
        g_prefix_error(error, "FuStructDfuseImage failed read of 0x%x: ", (guint) 274);
832
14
        return NULL;
833
14
    }
834
371
    if (st->buf->len != 274) {
835
47
        g_set_error(error,
836
47
                    FWUPD_ERROR,
837
47
                    FWUPD_ERROR_INVALID_DATA,
838
47
                    "FuStructDfuseImage requested 0x%x and got 0x%x",
839
47
                    (guint) 274,
840
47
                    (guint) st->buf->len);
841
47
        return NULL;
842
47
    }
843
324
    if (!fu_struct_dfuse_image_parse_internal(st, error))
844
53
        return NULL;
845
271
    return g_steal_pointer(&st);
846
324
}
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.30k
{
863
2.30k
    g_return_if_fail(st != NULL);
864
2.30k
    if (st->refcount == 0) {
865
0
        g_critical("FuStructDfuseElement refcount already zero");
866
0
        return;
867
0
    }
868
2.30k
    if (--st->refcount > 0)
869
0
        return;
870
2.30k
    if (st->buf != NULL)
871
2.18k
        g_byte_array_unref(st->buf);
872
2.30k
    g_free(st);
873
2.30k
}
874
static FuStructDfuseElement *
875
fu_struct_dfuse_element_new_internal(void)
876
2.30k
{
877
2.30k
    FuStructDfuseElement *st = g_new0(FuStructDfuseElement, 1);
878
2.30k
    st->refcount = 1;
879
2.30k
    return st;
880
2.30k
}
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.46k
{
889
1.46k
    g_return_val_if_fail(st != NULL, 0x0);
890
1.46k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
891
1.46k
}
892
/**
893
 * fu_struct_dfuse_element_get_size: (skip):
894
 **/
895
guint32
896
fu_struct_dfuse_element_get_size(const FuStructDfuseElement *st)
897
1.49k
{
898
1.49k
    g_return_val_if_fail(st != NULL, 0x0);
899
1.49k
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
900
1.49k
}
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
675
{
909
675
    g_return_if_fail(st != NULL);
910
675
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
911
675
}
912
/**
913
 * fu_struct_dfuse_element_set_size: (skip):
914
 **/
915
void
916
fu_struct_dfuse_element_set_size(FuStructDfuseElement *st, guint32 value)
917
675
{
918
675
    g_return_if_fail(st != NULL);
919
675
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
920
675
}
921
/**
922
 * fu_struct_dfuse_element_new: (skip):
923
 **/
924
FuStructDfuseElement *
925
fu_struct_dfuse_element_new(void)
926
675
{
927
675
    FuStructDfuseElement *st = fu_struct_dfuse_element_new_internal();
928
675
    st->buf = g_byte_array_sized_new(8);
929
675
    fu_byte_array_set_size(st->buf, 8, 0x0);
930
675
    return st;
931
675
}
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
675
{
954
675
    g_return_val_if_fail(st != NULL, NULL);
955
675
    return g_bytes_new(st->buf->data, st->buf->len);
956
675
}
957
static gboolean
958
fu_struct_dfuse_element_validate_internal(FuStructDfuseElement *st, GError **error)
959
1.49k
{
960
1.49k
    g_return_val_if_fail(st != NULL, FALSE);
961
1.49k
    return TRUE;
962
1.49k
}
963
static gboolean
964
fu_struct_dfuse_element_parse_internal(FuStructDfuseElement *st, GError **error)
965
1.49k
{
966
1.49k
    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.49k
    if (!fu_struct_dfuse_element_validate_internal(st, error))
971
0
        return FALSE;
972
1.49k
    return TRUE;
973
1.49k
}
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.62k
{
980
1.62k
    g_autoptr(FuStructDfuseElement) st = fu_struct_dfuse_element_new_internal();
981
1.62k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
982
1.62k
    if (st->buf == NULL) {
983
122
        g_prefix_error(error, "FuStructDfuseElement failed read of 0x%x: ", (guint) 8);
984
122
        return NULL;
985
122
    }
986
1.50k
    if (st->buf->len != 8) {
987
7
        g_set_error(error,
988
7
                    FWUPD_ERROR,
989
7
                    FWUPD_ERROR_INVALID_DATA,
990
7
                    "FuStructDfuseElement requested 0x%x and got 0x%x",
991
7
                    (guint) 8,
992
7
                    (guint) st->buf->len);
993
7
        return NULL;
994
7
    }
995
1.49k
    if (!fu_struct_dfuse_element_parse_internal(st, error))
996
0
        return NULL;
997
1.49k
    return g_steal_pointer(&st);
998
1.49k
}