Coverage Report

Created: 2025-07-11 06:31

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