Coverage Report

Created: 2025-06-22 06:29

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