Coverage Report

Created: 2025-07-01 07:09

/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.19k
{
20
1.19k
    g_return_val_if_fail(st != NULL, 0x0);
21
1.19k
    return fu_memread_uint16(st->data + 0, G_LITTLE_ENDIAN);
22
1.19k
}
23
/**
24
 * fu_struct_dfu_ftr_get_pid: (skip):
25
 **/
26
guint16
27
fu_struct_dfu_ftr_get_pid(const FuStructDfuFtr *st)
28
1.19k
{
29
1.19k
    g_return_val_if_fail(st != NULL, 0x0);
30
1.19k
    return fu_memread_uint16(st->data + 2, G_LITTLE_ENDIAN);
31
1.19k
}
32
/**
33
 * fu_struct_dfu_ftr_get_vid: (skip):
34
 **/
35
guint16
36
fu_struct_dfu_ftr_get_vid(const FuStructDfuFtr *st)
37
1.19k
{
38
1.19k
    g_return_val_if_fail(st != NULL, 0x0);
39
1.19k
    return fu_memread_uint16(st->data + 4, G_LITTLE_ENDIAN);
40
1.19k
}
41
/**
42
 * fu_struct_dfu_ftr_get_ver: (skip):
43
 **/
44
guint16
45
fu_struct_dfu_ftr_get_ver(const FuStructDfuFtr *st)
46
1.19k
{
47
1.19k
    g_return_val_if_fail(st != NULL, 0x0);
48
1.19k
    return fu_memread_uint16(st->data + 6, G_LITTLE_ENDIAN);
49
1.19k
}
50
/**
51
 * fu_struct_dfu_ftr_get_len: (skip):
52
 **/
53
guint8
54
fu_struct_dfu_ftr_get_len(const FuStructDfuFtr *st)
55
1.19k
{
56
1.19k
    g_return_val_if_fail(st != NULL, 0x0);
57
1.19k
    return st->data[11];
58
1.19k
}
59
/**
60
 * fu_struct_dfu_ftr_get_crc: (skip):
61
 **/
62
guint32
63
fu_struct_dfu_ftr_get_crc(const FuStructDfuFtr *st)
64
1.20k
{
65
1.20k
    g_return_val_if_fail(st != NULL, 0x0);
66
1.20k
    return fu_memread_uint32(st->data + 12, G_LITTLE_ENDIAN);
67
1.20k
}
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
103
{
76
103
    g_return_if_fail(st != NULL);
77
103
    fu_memwrite_uint16(st->data + 0, value, G_LITTLE_ENDIAN);
78
103
}
79
/**
80
 * fu_struct_dfu_ftr_set_pid: (skip):
81
 **/
82
void
83
fu_struct_dfu_ftr_set_pid(FuStructDfuFtr *st, guint16 value)
84
103
{
85
103
    g_return_if_fail(st != NULL);
86
103
    fu_memwrite_uint16(st->data + 2, value, G_LITTLE_ENDIAN);
87
103
}
88
/**
89
 * fu_struct_dfu_ftr_set_vid: (skip):
90
 **/
91
void
92
fu_struct_dfu_ftr_set_vid(FuStructDfuFtr *st, guint16 value)
93
103
{
94
103
    g_return_if_fail(st != NULL);
95
103
    fu_memwrite_uint16(st->data + 4, value, G_LITTLE_ENDIAN);
96
103
}
97
/**
98
 * fu_struct_dfu_ftr_set_ver: (skip):
99
 **/
100
void
101
fu_struct_dfu_ftr_set_ver(FuStructDfuFtr *st, guint16 value)
102
103
{
103
103
    g_return_if_fail(st != NULL);
104
103
    fu_memwrite_uint16(st->data + 6, value, G_LITTLE_ENDIAN);
105
103
}
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
103
{
112
103
    gsize len;
113
103
    g_return_val_if_fail(st != NULL, FALSE);
114
103
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
115
103
    if (value == NULL) {
116
0
        memset(st->data + 8, 0x0, 3);
117
0
        return TRUE;
118
0
    }
119
103
    len = strlen(value);
120
103
    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
103
    return fu_memcpy_safe(st->data, st->len, 8, (const guint8 *)value, len, 0x0, len, error);
129
103
}
130
/**
131
 * fu_struct_dfu_ftr_set_len: (skip):
132
 **/
133
void
134
fu_struct_dfu_ftr_set_len(FuStructDfuFtr *st, guint8 value)
135
103
{
136
103
    g_return_if_fail(st != NULL);
137
103
    st->data[11] = value;
138
103
}
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
103
{
154
103
    FuStructDfuFtr *st = g_byte_array_sized_new(16);
155
103
    fu_byte_array_set_size(st, 16, 0x0);
156
103
    fu_struct_dfu_ftr_set_sig(st, "UFD", NULL);
157
103
    fu_struct_dfu_ftr_set_len(st, 16);
158
103
    return st;
159
103
}
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.30k
{
187
1.30k
    g_return_val_if_fail(st != NULL, FALSE);
188
1.30k
    if (strncmp((const gchar *) (st->data + 8), "UFD", 3) != 0) {
189
111
        g_set_error_literal(error,
190
111
                            FWUPD_ERROR,
191
111
                            FWUPD_ERROR_INVALID_DATA,
192
111
                            "constant FuStructDfuFtr.sig was not valid");
193
111
        return FALSE;
194
111
    }
195
1.19k
    return TRUE;
196
1.30k
}
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.30k
{
225
1.30k
    if (!fu_struct_dfu_ftr_validate_internal(st, error))
226
111
        return FALSE;
227
1.19k
    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.19k
    return TRUE;
232
1.30k
}
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.36k
{
239
1.36k
    g_autoptr(GByteArray) st = NULL;
240
1.36k
    st = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
241
1.36k
    if (st == NULL) {
242
60
        g_prefix_error(error, "FuStructDfuFtr failed read of 0x%x: ", (guint) 16);
243
60
        return NULL;
244
60
    }
245
1.30k
    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.30k
    if (!fu_struct_dfu_ftr_parse_internal(st, error))
255
111
        return NULL;
256
1.19k
    return g_steal_pointer(&st);
257
1.30k
}
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.38k
{
265
2.38k
    g_return_val_if_fail(st != NULL, 0x0);
266
2.38k
    return st->data[5];
267
2.38k
}
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
772
{
274
772
    g_return_val_if_fail(st != NULL, 0x0);
275
772
    return fu_memread_uint32(st->data + 6, G_LITTLE_ENDIAN);
276
772
}
277
/**
278
 * fu_struct_dfuse_hdr_get_targets: (skip):
279
 **/
280
guint8
281
fu_struct_dfuse_hdr_get_targets(const FuStructDfuseHdr *st)
282
430
{
283
430
    g_return_val_if_fail(st != NULL, 0x0);
284
430
    return st->data[10];
285
430
}
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
103
{
294
103
    gsize len;
295
103
    g_return_val_if_fail(st != NULL, FALSE);
296
103
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
297
103
    if (value == NULL) {
298
0
        memset(st->data + 0, 0x0, 5);
299
0
        return TRUE;
300
0
    }
301
103
    len = strlen(value);
302
103
    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
103
    return fu_memcpy_safe(st->data, st->len, 0, (const guint8 *)value, len, 0x0, len, error);
311
103
}
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
103
{
318
103
    g_return_if_fail(st != NULL);
319
103
    st->data[5] = value;
320
103
}
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
103
{
327
103
    g_return_if_fail(st != NULL);
328
103
    fu_memwrite_uint32(st->data + 6, value, G_LITTLE_ENDIAN);
329
103
}
330
/**
331
 * fu_struct_dfuse_hdr_set_targets: (skip):
332
 **/
333
void
334
fu_struct_dfuse_hdr_set_targets(FuStructDfuseHdr *st, guint8 value)
335
103
{
336
103
    g_return_if_fail(st != NULL);
337
103
    st->data[10] = value;
338
103
}
339
/**
340
 * fu_struct_dfuse_hdr_new: (skip):
341
 **/
342
FuStructDfuseHdr *
343
fu_struct_dfuse_hdr_new(void)
344
103
{
345
103
    FuStructDfuseHdr *st = g_byte_array_sized_new(11);
346
103
    fu_byte_array_set_size(st, 11, 0x0);
347
103
    fu_struct_dfuse_hdr_set_sig(st, "DfuSe", NULL);
348
103
    fu_struct_dfuse_hdr_set_ver(st, 0x01);
349
103
    return st;
350
103
}
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
11.9M
{
370
11.9M
    g_return_val_if_fail(st != NULL, FALSE);
371
11.9M
    if (strncmp((const gchar *) (st->data + 0), "DfuSe", 5) != 0) {
372
11.8M
        g_set_error_literal(error,
373
11.8M
                            FWUPD_ERROR,
374
11.8M
                            FWUPD_ERROR_INVALID_DATA,
375
11.8M
                            "constant FuStructDfuseHdr.sig was not valid");
376
11.8M
        return FALSE;
377
11.8M
    }
378
2.38k
    if (fu_struct_dfuse_hdr_get_ver(st) != 0x01) {
379
423
        g_set_error_literal(error,
380
423
                            FWUPD_ERROR,
381
423
                            FWUPD_ERROR_INVALID_DATA,
382
423
                            "constant FuStructDfuseHdr.ver was not valid");
383
423
        return FALSE;
384
423
    }
385
1.96k
    return TRUE;
386
2.38k
}
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
11.9M
{
393
11.9M
    g_autoptr(GByteArray) st = NULL;
394
11.9M
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
395
11.9M
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
396
11.9M
    st = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
397
11.9M
    if (st == NULL) {
398
0
        g_prefix_error(error, "FuStructDfuseHdr failed read of 0x%x: ", (guint) 11);
399
0
        return FALSE;
400
0
    }
401
11.9M
    if (st->len != 11) {
402
1.66k
        g_set_error(error,
403
1.66k
                    FWUPD_ERROR,
404
1.66k
                    FWUPD_ERROR_INVALID_DATA,
405
1.66k
                    "FuStructDfuseHdr requested 0x%x and got 0x%x",
406
1.66k
                    (guint) 11,
407
1.66k
                    (guint) st->len);
408
1.66k
        return FALSE;
409
1.66k
    }
410
11.9M
    return fu_struct_dfuse_hdr_validate_internal(st, error);
411
11.9M
}
412
static gboolean
413
fu_struct_dfuse_hdr_parse_internal(FuStructDfuseHdr *st, GError **error)
414
601
{
415
601
    if (!fu_struct_dfuse_hdr_validate_internal(st, error))
416
0
        return FALSE;
417
601
    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
601
    return TRUE;
422
601
}
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
601
{
429
601
    g_autoptr(GByteArray) st = NULL;
430
601
    st = fu_input_stream_read_byte_array(stream, offset, 11, NULL, error);
431
601
    if (st == NULL) {
432
0
        g_prefix_error(error, "FuStructDfuseHdr failed read of 0x%x: ", (guint) 11);
433
0
        return NULL;
434
0
    }
435
601
    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
601
    if (!fu_struct_dfuse_hdr_parse_internal(st, error))
445
0
        return NULL;
446
601
    return g_steal_pointer(&st);
447
601
}
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
330
{
455
330
    g_return_val_if_fail(st != NULL, 0x0);
456
330
    return st->data[6];
457
330
}
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
330
{
464
330
    g_return_val_if_fail(st != NULL, 0x0);
465
330
    return fu_memread_uint32(st->data + 7, G_LITTLE_ENDIAN);
466
330
}
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
136
{
473
136
    g_return_val_if_fail(st != NULL, NULL);
474
136
    return fu_memstrsafe(st->data, st->len, 11, 255, NULL);
475
136
}
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
330
{
491
330
    g_return_val_if_fail(st != NULL, 0x0);
492
330
    return fu_memread_uint32(st->data + 270, G_LITTLE_ENDIAN);
493
330
}
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
84
{
502
84
    gsize len;
503
84
    g_return_val_if_fail(st != NULL, FALSE);
504
84
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
505
84
    if (value == NULL) {
506
0
        memset(st->data + 0, 0x0, 6);
507
0
        return TRUE;
508
0
    }
509
84
    len = strlen(value);
510
84
    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
84
    return fu_memcpy_safe(st->data, st->len, 0, (const guint8 *)value, len, 0x0, len, error);
519
84
}
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
84
{
526
84
    g_return_if_fail(st != NULL);
527
84
    st->data[6] = value;
528
84
}
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
40
{
535
40
    g_return_if_fail(st != NULL);
536
40
    fu_memwrite_uint32(st->data + 7, value, G_LITTLE_ENDIAN);
537
40
}
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
40
{
544
40
    gsize len;
545
40
    g_return_val_if_fail(st != NULL, FALSE);
546
40
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
547
40
    if (value == NULL) {
548
0
        memset(st->data + 11, 0x0, 255);
549
0
        return TRUE;
550
0
    }
551
40
    len = strlen(value);
552
40
    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
40
    return fu_memcpy_safe(st->data, st->len, 11, (const guint8 *)value, len, 0x0, len, error);
561
40
}
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
84
{
568
84
    g_return_if_fail(st != NULL);
569
84
    fu_memwrite_uint32(st->data + 266, value, G_LITTLE_ENDIAN);
570
84
}
571
/**
572
 * fu_struct_dfuse_image_set_chunks: (skip):
573
 **/
574
void
575
fu_struct_dfuse_image_set_chunks(FuStructDfuseImage *st, guint32 value)
576
84
{
577
84
    g_return_if_fail(st != NULL);
578
84
    fu_memwrite_uint32(st->data + 270, value, G_LITTLE_ENDIAN);
579
84
}
580
/**
581
 * fu_struct_dfuse_image_new: (skip):
582
 **/
583
FuStructDfuseImage *
584
fu_struct_dfuse_image_new(void)
585
84
{
586
84
    FuStructDfuseImage *st = g_byte_array_sized_new(274);
587
84
    fu_byte_array_set_size(st, 274, 0x0);
588
84
    fu_struct_dfuse_image_set_sig(st, "Target", NULL);
589
84
    return st;
590
84
}
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
384
{
619
384
    g_return_val_if_fail(st != NULL, FALSE);
620
384
    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
330
    return TRUE;
628
384
}
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
384
{
649
384
    if (!fu_struct_dfuse_image_validate_internal(st, error))
650
54
        return FALSE;
651
330
    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
330
    return TRUE;
656
384
}
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
450
{
663
450
    g_autoptr(GByteArray) st = NULL;
664
450
    st = fu_input_stream_read_byte_array(stream, offset, 274, NULL, error);
665
450
    if (st == NULL) {
666
22
        g_prefix_error(error, "FuStructDfuseImage failed read of 0x%x: ", (guint) 274);
667
22
        return NULL;
668
22
    }
669
428
    if (st->len != 274) {
670
44
        g_set_error(error,
671
44
                    FWUPD_ERROR,
672
44
                    FWUPD_ERROR_INVALID_DATA,
673
44
                    "FuStructDfuseImage requested 0x%x and got 0x%x",
674
44
                    (guint) 274,
675
44
                    (guint) st->len);
676
44
        return NULL;
677
44
    }
678
384
    if (!fu_struct_dfuse_image_parse_internal(st, error))
679
54
        return NULL;
680
330
    return g_steal_pointer(&st);
681
384
}
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.50k
{
689
1.50k
    g_return_val_if_fail(st != NULL, 0x0);
690
1.50k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
691
1.50k
}
692
/**
693
 * fu_struct_dfuse_element_get_size: (skip):
694
 **/
695
guint32
696
fu_struct_dfuse_element_get_size(const FuStructDfuseElement *st)
697
1.54k
{
698
1.54k
    g_return_val_if_fail(st != NULL, 0x0);
699
1.54k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
700
1.54k
}
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
535
{
709
535
    g_return_if_fail(st != NULL);
710
535
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
711
535
}
712
/**
713
 * fu_struct_dfuse_element_set_size: (skip):
714
 **/
715
void
716
fu_struct_dfuse_element_set_size(FuStructDfuseElement *st, guint32 value)
717
535
{
718
535
    g_return_if_fail(st != NULL);
719
535
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
720
535
}
721
/**
722
 * fu_struct_dfuse_element_new: (skip):
723
 **/
724
FuStructDfuseElement *
725
fu_struct_dfuse_element_new(void)
726
535
{
727
535
    FuStructDfuseElement *st = g_byte_array_sized_new(8);
728
535
    fu_byte_array_set_size(st, 8, 0x0);
729
535
    return st;
730
535
}
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.54k
{
750
1.54k
    g_return_val_if_fail(st != NULL, FALSE);
751
1.54k
    return TRUE;
752
1.54k
}
753
static gboolean
754
fu_struct_dfuse_element_parse_internal(FuStructDfuseElement *st, GError **error)
755
1.54k
{
756
1.54k
    if (!fu_struct_dfuse_element_validate_internal(st, error))
757
0
        return FALSE;
758
1.54k
    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.54k
    return TRUE;
763
1.54k
}
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.70k
{
770
1.70k
    g_autoptr(GByteArray) st = NULL;
771
1.70k
    st = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
772
1.70k
    if (st == NULL) {
773
156
        g_prefix_error(error, "FuStructDfuseElement failed read of 0x%x: ", (guint) 8);
774
156
        return NULL;
775
156
    }
776
1.55k
    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.54k
    if (!fu_struct_dfuse_element_parse_internal(st, error))
786
0
        return NULL;
787
1.54k
    return g_steal_pointer(&st);
788
1.54k
}