Coverage Report

Created: 2025-11-24 06:59

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