Coverage Report

Created: 2025-11-11 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-cab-struct.c
Line
Count
Source
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include <glib.h>
5
6
#include "fu-cab-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
const gchar *
17
fu_cab_compression_to_string(FuCabCompression val)
18
78
{
19
78
    if (val == FU_CAB_COMPRESSION_NONE)
20
0
        return "none";
21
78
    if (val == FU_CAB_COMPRESSION_MSZIP)
22
0
        return "mszip";
23
78
    if (val == FU_CAB_COMPRESSION_QUANTUM)
24
3
        return "quantum";
25
75
    if (val == FU_CAB_COMPRESSION_LZX)
26
3
        return "lzx";
27
72
    return NULL;
28
75
}
29
30
static const gchar *
31
fu_cab_file_attribute_to_string(FuCabFileAttribute val)
32
0
{
33
0
    if (val == FU_CAB_FILE_ATTRIBUTE_NONE)
34
0
        return "none";
35
0
    if (val == FU_CAB_FILE_ATTRIBUTE_READONLY)
36
0
        return "readonly";
37
0
    if (val == FU_CAB_FILE_ATTRIBUTE_HIDDEN)
38
0
        return "hidden";
39
0
    if (val == FU_CAB_FILE_ATTRIBUTE_SYSTEM)
40
0
        return "system";
41
0
    if (val == FU_CAB_FILE_ATTRIBUTE_ARCH)
42
0
        return "arch";
43
0
    if (val == FU_CAB_FILE_ATTRIBUTE_EXEC)
44
0
        return "exec";
45
0
    if (val == FU_CAB_FILE_ATTRIBUTE_NAME_UTF8)
46
0
        return "name-utf8";
47
0
    return NULL;
48
0
}
49
/**
50
 * fu_struct_cab_data_ref: (skip):
51
 **/
52
FuStructCabData *
53
fu_struct_cab_data_ref(FuStructCabData *st)
54
0
{
55
0
    g_return_val_if_fail(st != NULL, NULL);
56
0
    st->refcount++;
57
0
    return st;
58
0
}
59
/**
60
 * fu_struct_cab_data_unref: (skip):
61
 **/
62
void
63
fu_struct_cab_data_unref(FuStructCabData *st)
64
788k
{
65
788k
    g_return_if_fail(st != NULL);
66
788k
    if (st->refcount == 0) {
67
0
        g_critical("FuStructCabData refcount already zero");
68
0
        return;
69
0
    }
70
788k
    if (--st->refcount > 0)
71
0
        return;
72
788k
    if (st->buf != NULL)
73
787k
        g_byte_array_unref(st->buf);
74
788k
    g_free(st);
75
788k
}
76
static FuStructCabData *
77
fu_struct_cab_data_new_internal(void)
78
788k
{
79
788k
    FuStructCabData *st = g_new0(FuStructCabData, 1);
80
788k
    st->refcount = 1;
81
788k
    return st;
82
788k
}
83
84
/* getters */
85
/**
86
 * fu_struct_cab_data_get_checksum: (skip):
87
 **/
88
guint32
89
fu_struct_cab_data_get_checksum(const FuStructCabData *st)
90
229k
{
91
229k
    g_return_val_if_fail(st != NULL, 0x0);
92
229k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
93
229k
}
94
/**
95
 * fu_struct_cab_data_get_comp: (skip):
96
 **/
97
guint16
98
fu_struct_cab_data_get_comp(const FuStructCabData *st)
99
787k
{
100
787k
    g_return_val_if_fail(st != NULL, 0x0);
101
787k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
102
787k
}
103
/**
104
 * fu_struct_cab_data_get_uncomp: (skip):
105
 **/
106
guint16
107
fu_struct_cab_data_get_uncomp(const FuStructCabData *st)
108
787k
{
109
787k
    g_return_val_if_fail(st != NULL, 0x0);
110
787k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
111
787k
}
112
113
/* setters */
114
/**
115
 * fu_struct_cab_data_set_checksum: (skip):
116
 **/
117
void
118
fu_struct_cab_data_set_checksum(FuStructCabData *st, guint32 value)
119
0
{
120
0
    g_return_if_fail(st != NULL);
121
0
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
122
0
}
123
/**
124
 * fu_struct_cab_data_set_comp: (skip):
125
 **/
126
void
127
fu_struct_cab_data_set_comp(FuStructCabData *st, guint16 value)
128
0
{
129
0
    g_return_if_fail(st != NULL);
130
0
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
131
0
}
132
/**
133
 * fu_struct_cab_data_set_uncomp: (skip):
134
 **/
135
void
136
fu_struct_cab_data_set_uncomp(FuStructCabData *st, guint16 value)
137
0
{
138
0
    g_return_if_fail(st != NULL);
139
0
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
140
0
}
141
/**
142
 * fu_struct_cab_data_new: (skip):
143
 **/
144
FuStructCabData *
145
fu_struct_cab_data_new(void)
146
0
{
147
0
    FuStructCabData *st = fu_struct_cab_data_new_internal();
148
0
    st->buf = g_byte_array_sized_new(8);
149
0
    fu_byte_array_set_size(st->buf, 8, 0x0);
150
0
    return st;
151
0
}
152
/**
153
 * fu_struct_cab_data_to_string: (skip):
154
 **/
155
static gchar *
156
fu_struct_cab_data_to_string(const FuStructCabData *st)
157
0
{
158
0
    g_autoptr(GString) str = g_string_new("FuStructCabData:\n");
159
0
    g_return_val_if_fail(st != NULL, NULL);
160
0
    g_string_append_printf(str, "  checksum: 0x%x\n",
161
0
                           (guint) fu_struct_cab_data_get_checksum(st));
162
0
    g_string_append_printf(str, "  comp: 0x%x\n",
163
0
                           (guint) fu_struct_cab_data_get_comp(st));
164
0
    g_string_append_printf(str, "  uncomp: 0x%x\n",
165
0
                           (guint) fu_struct_cab_data_get_uncomp(st));
166
0
    if (str->len > 0)
167
0
        g_string_set_size(str, str->len - 1);
168
0
    return g_string_free(g_steal_pointer(&str), FALSE);
169
0
}
170
static gboolean
171
fu_struct_cab_data_validate_internal(FuStructCabData *st, GError **error)
172
787k
{
173
787k
    g_return_val_if_fail(st != NULL, FALSE);
174
787k
    return TRUE;
175
787k
}
176
static gboolean
177
fu_struct_cab_data_parse_internal(FuStructCabData *st, GError **error)
178
787k
{
179
787k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
180
0
        g_autofree gchar *str = fu_struct_cab_data_to_string(st);
181
0
        g_debug("%s", str);
182
0
    }
183
787k
    if (!fu_struct_cab_data_validate_internal(st, error))
184
0
        return FALSE;
185
787k
    return TRUE;
186
787k
}
187
/**
188
 * fu_struct_cab_data_parse_stream: (skip):
189
 **/
190
FuStructCabData *
191
fu_struct_cab_data_parse_stream(GInputStream *stream, gsize offset, GError **error)
192
788k
{
193
788k
    g_autoptr(FuStructCabData) st = fu_struct_cab_data_new_internal();
194
788k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
195
788k
    if (st->buf == NULL) {
196
112
        g_prefix_error(error, "FuStructCabData failed read of 0x%x: ", (guint) 8);
197
112
        return NULL;
198
112
    }
199
787k
    if (st->buf->len != 8) {
200
20
        g_set_error(error,
201
20
                    FWUPD_ERROR,
202
20
                    FWUPD_ERROR_INVALID_DATA,
203
20
                    "FuStructCabData requested 0x%x and got 0x%x",
204
20
                    (guint) 8,
205
20
                    (guint) st->buf->len);
206
20
        return NULL;
207
20
    }
208
787k
    if (!fu_struct_cab_data_parse_internal(st, error))
209
0
        return NULL;
210
787k
    return g_steal_pointer(&st);
211
787k
}
212
/**
213
 * fu_struct_cab_file_ref: (skip):
214
 **/
215
FuStructCabFile *
216
fu_struct_cab_file_ref(FuStructCabFile *st)
217
0
{
218
0
    g_return_val_if_fail(st != NULL, NULL);
219
0
    st->refcount++;
220
0
    return st;
221
0
}
222
/**
223
 * fu_struct_cab_file_unref: (skip):
224
 **/
225
void
226
fu_struct_cab_file_unref(FuStructCabFile *st)
227
14.7k
{
228
14.7k
    g_return_if_fail(st != NULL);
229
14.7k
    if (st->refcount == 0) {
230
0
        g_critical("FuStructCabFile refcount already zero");
231
0
        return;
232
0
    }
233
14.7k
    if (--st->refcount > 0)
234
0
        return;
235
14.7k
    if (st->buf != NULL)
236
14.4k
        g_byte_array_unref(st->buf);
237
14.7k
    g_free(st);
238
14.7k
}
239
static FuStructCabFile *
240
fu_struct_cab_file_new_internal(void)
241
14.7k
{
242
14.7k
    FuStructCabFile *st = g_new0(FuStructCabFile, 1);
243
14.7k
    st->refcount = 1;
244
14.7k
    return st;
245
14.7k
}
246
247
/* getters */
248
/**
249
 * fu_struct_cab_file_get_usize: (skip):
250
 **/
251
guint32
252
fu_struct_cab_file_get_usize(const FuStructCabFile *st)
253
28.5k
{
254
28.5k
    g_return_val_if_fail(st != NULL, 0x0);
255
28.5k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
256
28.5k
}
257
/**
258
 * fu_struct_cab_file_get_uoffset: (skip):
259
 **/
260
guint32
261
fu_struct_cab_file_get_uoffset(const FuStructCabFile *st)
262
28.5k
{
263
28.5k
    g_return_val_if_fail(st != NULL, 0x0);
264
28.5k
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
265
28.5k
}
266
/**
267
 * fu_struct_cab_file_get_index: (skip):
268
 **/
269
guint16
270
fu_struct_cab_file_get_index(const FuStructCabFile *st)
271
14.3k
{
272
14.3k
    g_return_val_if_fail(st != NULL, 0x0);
273
14.3k
    return fu_memread_uint16(st->buf->data + 8, G_LITTLE_ENDIAN);
274
14.3k
}
275
/**
276
 * fu_struct_cab_file_get_date: (skip):
277
 **/
278
guint16
279
fu_struct_cab_file_get_date(const FuStructCabFile *st)
280
14.0k
{
281
14.0k
    g_return_val_if_fail(st != NULL, 0x0);
282
14.0k
    return fu_memread_uint16(st->buf->data + 10, G_LITTLE_ENDIAN);
283
14.0k
}
284
/**
285
 * fu_struct_cab_file_get_time: (skip):
286
 **/
287
guint16
288
fu_struct_cab_file_get_time(const FuStructCabFile *st)
289
14.0k
{
290
14.0k
    g_return_val_if_fail(st != NULL, 0x0);
291
14.0k
    return fu_memread_uint16(st->buf->data + 12, G_LITTLE_ENDIAN);
292
14.0k
}
293
/**
294
 * fu_struct_cab_file_get_fattr: (skip):
295
 **/
296
FuCabFileAttribute
297
fu_struct_cab_file_get_fattr(const FuStructCabFile *st)
298
0
{
299
0
    g_return_val_if_fail(st != NULL, 0x0);
300
0
    return fu_memread_uint16(st->buf->data + 14, G_LITTLE_ENDIAN);
301
0
}
302
303
/* setters */
304
/**
305
 * fu_struct_cab_file_set_usize: (skip):
306
 **/
307
void
308
fu_struct_cab_file_set_usize(FuStructCabFile *st, guint32 value)
309
0
{
310
0
    g_return_if_fail(st != NULL);
311
0
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
312
0
}
313
/**
314
 * fu_struct_cab_file_set_uoffset: (skip):
315
 **/
316
void
317
fu_struct_cab_file_set_uoffset(FuStructCabFile *st, guint32 value)
318
0
{
319
0
    g_return_if_fail(st != NULL);
320
0
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
321
0
}
322
/**
323
 * fu_struct_cab_file_set_index: (skip):
324
 **/
325
void
326
fu_struct_cab_file_set_index(FuStructCabFile *st, guint16 value)
327
0
{
328
0
    g_return_if_fail(st != NULL);
329
0
    fu_memwrite_uint16(st->buf->data + 8, value, G_LITTLE_ENDIAN);
330
0
}
331
/**
332
 * fu_struct_cab_file_set_date: (skip):
333
 **/
334
void
335
fu_struct_cab_file_set_date(FuStructCabFile *st, guint16 value)
336
0
{
337
0
    g_return_if_fail(st != NULL);
338
0
    fu_memwrite_uint16(st->buf->data + 10, value, G_LITTLE_ENDIAN);
339
0
}
340
/**
341
 * fu_struct_cab_file_set_time: (skip):
342
 **/
343
void
344
fu_struct_cab_file_set_time(FuStructCabFile *st, guint16 value)
345
0
{
346
0
    g_return_if_fail(st != NULL);
347
0
    fu_memwrite_uint16(st->buf->data + 12, value, G_LITTLE_ENDIAN);
348
0
}
349
/**
350
 * fu_struct_cab_file_set_fattr: (skip):
351
 **/
352
void
353
fu_struct_cab_file_set_fattr(FuStructCabFile *st, FuCabFileAttribute value)
354
0
{
355
0
    g_return_if_fail(st != NULL);
356
0
    fu_memwrite_uint16(st->buf->data + 14, value, G_LITTLE_ENDIAN);
357
0
}
358
/**
359
 * fu_struct_cab_file_new: (skip):
360
 **/
361
FuStructCabFile *
362
fu_struct_cab_file_new(void)
363
0
{
364
0
    FuStructCabFile *st = fu_struct_cab_file_new_internal();
365
0
    st->buf = g_byte_array_sized_new(16);
366
0
    fu_byte_array_set_size(st->buf, 16, 0x0);
367
0
    return st;
368
0
}
369
/**
370
 * fu_struct_cab_file_to_string: (skip):
371
 **/
372
static gchar *
373
fu_struct_cab_file_to_string(const FuStructCabFile *st)
374
0
{
375
0
    g_autoptr(GString) str = g_string_new("FuStructCabFile:\n");
376
0
    g_return_val_if_fail(st != NULL, NULL);
377
0
    g_string_append_printf(str, "  usize: 0x%x\n",
378
0
                           (guint) fu_struct_cab_file_get_usize(st));
379
0
    g_string_append_printf(str, "  uoffset: 0x%x\n",
380
0
                           (guint) fu_struct_cab_file_get_uoffset(st));
381
0
    g_string_append_printf(str, "  index: 0x%x\n",
382
0
                           (guint) fu_struct_cab_file_get_index(st));
383
0
    g_string_append_printf(str, "  date: 0x%x\n",
384
0
                           (guint) fu_struct_cab_file_get_date(st));
385
0
    g_string_append_printf(str, "  time: 0x%x\n",
386
0
                           (guint) fu_struct_cab_file_get_time(st));
387
0
    {
388
0
        const gchar *tmp = fu_cab_file_attribute_to_string(fu_struct_cab_file_get_fattr(st));
389
0
        if (tmp != NULL) {
390
0
            g_string_append_printf(str, "  fattr: 0x%x [%s]\n", (guint) fu_struct_cab_file_get_fattr(st), tmp);
391
0
        } else {
392
0
            g_string_append_printf(str, "  fattr: 0x%x\n", (guint) fu_struct_cab_file_get_fattr(st));
393
0
        }
394
0
    }
395
0
    if (str->len > 0)
396
0
        g_string_set_size(str, str->len - 1);
397
0
    return g_string_free(g_steal_pointer(&str), FALSE);
398
0
}
399
static gboolean
400
fu_struct_cab_file_validate_internal(FuStructCabFile *st, GError **error)
401
14.3k
{
402
14.3k
    g_return_val_if_fail(st != NULL, FALSE);
403
14.3k
    return TRUE;
404
14.3k
}
405
static gboolean
406
fu_struct_cab_file_parse_internal(FuStructCabFile *st, GError **error)
407
14.3k
{
408
14.3k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
409
0
        g_autofree gchar *str = fu_struct_cab_file_to_string(st);
410
0
        g_debug("%s", str);
411
0
    }
412
14.3k
    if (!fu_struct_cab_file_validate_internal(st, error))
413
0
        return FALSE;
414
14.3k
    return TRUE;
415
14.3k
}
416
/**
417
 * fu_struct_cab_file_parse_stream: (skip):
418
 **/
419
FuStructCabFile *
420
fu_struct_cab_file_parse_stream(GInputStream *stream, gsize offset, GError **error)
421
14.7k
{
422
14.7k
    g_autoptr(FuStructCabFile) st = fu_struct_cab_file_new_internal();
423
14.7k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 16, NULL, error);
424
14.7k
    if (st->buf == NULL) {
425
345
        g_prefix_error(error, "FuStructCabFile failed read of 0x%x: ", (guint) 16);
426
345
        return NULL;
427
345
    }
428
14.4k
    if (st->buf->len != 16) {
429
62
        g_set_error(error,
430
62
                    FWUPD_ERROR,
431
62
                    FWUPD_ERROR_INVALID_DATA,
432
62
                    "FuStructCabFile requested 0x%x and got 0x%x",
433
62
                    (guint) 16,
434
62
                    (guint) st->buf->len);
435
62
        return NULL;
436
62
    }
437
14.3k
    if (!fu_struct_cab_file_parse_internal(st, error))
438
0
        return NULL;
439
14.3k
    return g_steal_pointer(&st);
440
14.3k
}
441
/**
442
 * fu_struct_cab_folder_ref: (skip):
443
 **/
444
FuStructCabFolder *
445
fu_struct_cab_folder_ref(FuStructCabFolder *st)
446
0
{
447
0
    g_return_val_if_fail(st != NULL, NULL);
448
0
    st->refcount++;
449
0
    return st;
450
0
}
451
/**
452
 * fu_struct_cab_folder_unref: (skip):
453
 **/
454
void
455
fu_struct_cab_folder_unref(FuStructCabFolder *st)
456
6.72k
{
457
6.72k
    g_return_if_fail(st != NULL);
458
6.72k
    if (st->refcount == 0) {
459
0
        g_critical("FuStructCabFolder refcount already zero");
460
0
        return;
461
0
    }
462
6.72k
    if (--st->refcount > 0)
463
0
        return;
464
6.72k
    if (st->buf != NULL)
465
6.61k
        g_byte_array_unref(st->buf);
466
6.72k
    g_free(st);
467
6.72k
}
468
static FuStructCabFolder *
469
fu_struct_cab_folder_new_internal(void)
470
6.72k
{
471
6.72k
    FuStructCabFolder *st = g_new0(FuStructCabFolder, 1);
472
6.72k
    st->refcount = 1;
473
6.72k
    return st;
474
6.72k
}
475
476
/* getters */
477
/**
478
 * fu_struct_cab_folder_get_offset: (skip):
479
 **/
480
guint32
481
fu_struct_cab_folder_get_offset(const FuStructCabFolder *st)
482
6.37k
{
483
6.37k
    g_return_val_if_fail(st != NULL, 0x0);
484
6.37k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
485
6.37k
}
486
/**
487
 * fu_struct_cab_folder_get_ndatab: (skip):
488
 **/
489
guint16
490
fu_struct_cab_folder_get_ndatab(const FuStructCabFolder *st)
491
799k
{
492
799k
    g_return_val_if_fail(st != NULL, 0x0);
493
799k
    return fu_memread_uint16(st->buf->data + 4, G_LITTLE_ENDIAN);
494
799k
}
495
/**
496
 * fu_struct_cab_folder_get_compression: (skip):
497
 **/
498
FuCabCompression
499
fu_struct_cab_folder_get_compression(const FuStructCabFolder *st)
500
6.45k
{
501
6.45k
    g_return_val_if_fail(st != NULL, 0x0);
502
6.45k
    return fu_memread_uint16(st->buf->data + 6, G_LITTLE_ENDIAN);
503
6.45k
}
504
505
/* setters */
506
/**
507
 * fu_struct_cab_folder_set_offset: (skip):
508
 **/
509
void
510
fu_struct_cab_folder_set_offset(FuStructCabFolder *st, guint32 value)
511
0
{
512
0
    g_return_if_fail(st != NULL);
513
0
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
514
0
}
515
/**
516
 * fu_struct_cab_folder_set_ndatab: (skip):
517
 **/
518
void
519
fu_struct_cab_folder_set_ndatab(FuStructCabFolder *st, guint16 value)
520
0
{
521
0
    g_return_if_fail(st != NULL);
522
0
    fu_memwrite_uint16(st->buf->data + 4, value, G_LITTLE_ENDIAN);
523
0
}
524
/**
525
 * fu_struct_cab_folder_set_compression: (skip):
526
 **/
527
void
528
fu_struct_cab_folder_set_compression(FuStructCabFolder *st, FuCabCompression value)
529
0
{
530
0
    g_return_if_fail(st != NULL);
531
0
    fu_memwrite_uint16(st->buf->data + 6, value, G_LITTLE_ENDIAN);
532
0
}
533
/**
534
 * fu_struct_cab_folder_new: (skip):
535
 **/
536
FuStructCabFolder *
537
fu_struct_cab_folder_new(void)
538
106
{
539
106
    FuStructCabFolder *st = fu_struct_cab_folder_new_internal();
540
106
    st->buf = g_byte_array_sized_new(8);
541
106
    fu_byte_array_set_size(st->buf, 8, 0x0);
542
106
    return st;
543
106
}
544
/**
545
 * fu_struct_cab_folder_to_string: (skip):
546
 **/
547
static gchar *
548
fu_struct_cab_folder_to_string(const FuStructCabFolder *st)
549
0
{
550
0
    g_autoptr(GString) str = g_string_new("FuStructCabFolder:\n");
551
0
    g_return_val_if_fail(st != NULL, NULL);
552
0
    g_string_append_printf(str, "  offset: 0x%x\n",
553
0
                           (guint) fu_struct_cab_folder_get_offset(st));
554
0
    g_string_append_printf(str, "  ndatab: 0x%x\n",
555
0
                           (guint) fu_struct_cab_folder_get_ndatab(st));
556
0
    {
557
0
        const gchar *tmp = fu_cab_compression_to_string(fu_struct_cab_folder_get_compression(st));
558
0
        if (tmp != NULL) {
559
0
            g_string_append_printf(str, "  compression: 0x%x [%s]\n", (guint) fu_struct_cab_folder_get_compression(st), tmp);
560
0
        } else {
561
0
            g_string_append_printf(str, "  compression: 0x%x\n", (guint) fu_struct_cab_folder_get_compression(st));
562
0
        }
563
0
    }
564
0
    if (str->len > 0)
565
0
        g_string_set_size(str, str->len - 1);
566
0
    return g_string_free(g_steal_pointer(&str), FALSE);
567
0
}
568
static gboolean
569
fu_struct_cab_folder_validate_internal(FuStructCabFolder *st, GError **error)
570
6.46k
{
571
6.46k
    g_return_val_if_fail(st != NULL, FALSE);
572
6.46k
    return TRUE;
573
6.46k
}
574
static gboolean
575
fu_struct_cab_folder_parse_internal(FuStructCabFolder *st, GError **error)
576
6.46k
{
577
6.46k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
578
0
        g_autofree gchar *str = fu_struct_cab_folder_to_string(st);
579
0
        g_debug("%s", str);
580
0
    }
581
6.46k
    if (!fu_struct_cab_folder_validate_internal(st, error))
582
0
        return FALSE;
583
6.46k
    return TRUE;
584
6.46k
}
585
/**
586
 * fu_struct_cab_folder_parse_stream: (skip):
587
 **/
588
FuStructCabFolder *
589
fu_struct_cab_folder_parse_stream(GInputStream *stream, gsize offset, GError **error)
590
6.61k
{
591
6.61k
    g_autoptr(FuStructCabFolder) st = fu_struct_cab_folder_new_internal();
592
6.61k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 8, NULL, error);
593
6.61k
    if (st->buf == NULL) {
594
115
        g_prefix_error(error, "FuStructCabFolder failed read of 0x%x: ", (guint) 8);
595
115
        return NULL;
596
115
    }
597
6.50k
    if (st->buf->len != 8) {
598
35
        g_set_error(error,
599
35
                    FWUPD_ERROR,
600
35
                    FWUPD_ERROR_INVALID_DATA,
601
35
                    "FuStructCabFolder requested 0x%x and got 0x%x",
602
35
                    (guint) 8,
603
35
                    (guint) st->buf->len);
604
35
        return NULL;
605
35
    }
606
6.46k
    if (!fu_struct_cab_folder_parse_internal(st, error))
607
0
        return NULL;
608
6.46k
    return g_steal_pointer(&st);
609
6.46k
}
610
/**
611
 * fu_struct_cab_header_ref: (skip):
612
 **/
613
FuStructCabHeader *
614
fu_struct_cab_header_ref(FuStructCabHeader *st)
615
0
{
616
0
    g_return_val_if_fail(st != NULL, NULL);
617
0
    st->refcount++;
618
0
    return st;
619
0
}
620
/**
621
 * fu_struct_cab_header_unref: (skip):
622
 **/
623
void
624
fu_struct_cab_header_unref(FuStructCabHeader *st)
625
389k
{
626
389k
    g_return_if_fail(st != NULL);
627
389k
    if (st->refcount == 0) {
628
0
        g_critical("FuStructCabHeader refcount already zero");
629
0
        return;
630
0
    }
631
389k
    if (--st->refcount > 0)
632
0
        return;
633
389k
    if (st->buf != NULL)
634
389k
        g_byte_array_unref(st->buf);
635
389k
    g_free(st);
636
389k
}
637
static FuStructCabHeader *
638
fu_struct_cab_header_new_internal(void)
639
389k
{
640
389k
    FuStructCabHeader *st = g_new0(FuStructCabHeader, 1);
641
389k
    st->refcount = 1;
642
389k
    return st;
643
389k
}
644
645
/* getters */
646
/**
647
 * fu_struct_cab_header_get_signature: (skip):
648
 **/
649
static gchar *
650
fu_struct_cab_header_get_signature(const FuStructCabHeader *st)
651
379k
{
652
379k
    g_return_val_if_fail(st != NULL, NULL);
653
379k
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 4, NULL);
654
379k
}
655
/**
656
 * fu_struct_cab_header_get_size: (skip):
657
 **/
658
guint32
659
fu_struct_cab_header_get_size(const FuStructCabHeader *st)
660
2.34k
{
661
2.34k
    g_return_val_if_fail(st != NULL, 0x0);
662
2.34k
    return fu_memread_uint32(st->buf->data + 8, G_LITTLE_ENDIAN);
663
2.34k
}
664
/**
665
 * fu_struct_cab_header_get_off_cffile: (skip):
666
 **/
667
guint32
668
fu_struct_cab_header_get_off_cffile(const FuStructCabHeader *st)
669
2.18k
{
670
2.18k
    g_return_val_if_fail(st != NULL, 0x0);
671
2.18k
    return fu_memread_uint32(st->buf->data + 16, G_LITTLE_ENDIAN);
672
2.18k
}
673
/**
674
 * fu_struct_cab_header_get_version_minor: (skip):
675
 **/
676
static guint8
677
fu_struct_cab_header_get_version_minor(const FuStructCabHeader *st)
678
5.13k
{
679
5.13k
    g_return_val_if_fail(st != NULL, 0x0);
680
5.13k
    return st->buf->data[24];
681
5.13k
}
682
/**
683
 * fu_struct_cab_header_get_version_major: (skip):
684
 **/
685
static guint8
686
fu_struct_cab_header_get_version_major(const FuStructCabHeader *st)
687
4.84k
{
688
4.84k
    g_return_val_if_fail(st != NULL, 0x0);
689
4.84k
    return st->buf->data[25];
690
4.84k
}
691
/**
692
 * fu_struct_cab_header_get_nr_folders: (skip):
693
 **/
694
guint16
695
fu_struct_cab_header_get_nr_folders(const FuStructCabHeader *st)
696
11.9k
{
697
11.9k
    g_return_val_if_fail(st != NULL, 0x0);
698
11.9k
    return fu_memread_uint16(st->buf->data + 26, G_LITTLE_ENDIAN);
699
11.9k
}
700
/**
701
 * fu_struct_cab_header_get_nr_files: (skip):
702
 **/
703
guint16
704
fu_struct_cab_header_get_nr_files(const FuStructCabHeader *st)
705
19.3k
{
706
19.3k
    g_return_val_if_fail(st != NULL, 0x0);
707
19.3k
    return fu_memread_uint16(st->buf->data + 28, G_LITTLE_ENDIAN);
708
19.3k
}
709
/**
710
 * fu_struct_cab_header_get_flags: (skip):
711
 **/
712
guint16
713
fu_struct_cab_header_get_flags(const FuStructCabHeader *st)
714
2.12k
{
715
2.12k
    g_return_val_if_fail(st != NULL, 0x0);
716
2.12k
    return fu_memread_uint16(st->buf->data + 30, G_LITTLE_ENDIAN);
717
2.12k
}
718
/**
719
 * fu_struct_cab_header_get_set_id: (skip):
720
 **/
721
guint16
722
fu_struct_cab_header_get_set_id(const FuStructCabHeader *st)
723
0
{
724
0
    g_return_val_if_fail(st != NULL, 0x0);
725
0
    return fu_memread_uint16(st->buf->data + 32, G_LITTLE_ENDIAN);
726
0
}
727
/**
728
 * fu_struct_cab_header_get_idx_cabinet: (skip):
729
 **/
730
guint16
731
fu_struct_cab_header_get_idx_cabinet(const FuStructCabHeader *st)
732
2.27k
{
733
2.27k
    g_return_val_if_fail(st != NULL, 0x0);
734
2.27k
    return fu_memread_uint16(st->buf->data + 34, G_LITTLE_ENDIAN);
735
2.27k
}
736
737
/* setters */
738
/**
739
 * fu_struct_cab_header_set_signature: (skip):
740
 **/
741
static gboolean
742
fu_struct_cab_header_set_signature(FuStructCabHeader *st, const gchar *value, GError **error)
743
106
{
744
106
    gsize len;
745
106
    g_return_val_if_fail(st != NULL, FALSE);
746
106
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
747
106
    if (value == NULL) {
748
0
        memset(st->buf->data + 0, 0x0, 4);
749
0
        return TRUE;
750
0
    }
751
106
    len = strlen(value);
752
106
    if (len > 4) {
753
0
        g_set_error(error,
754
0
                    FWUPD_ERROR,
755
0
                    FWUPD_ERROR_INVALID_DATA,
756
0
                    "string '%s' (0x%x bytes) does not fit in FuStructCabHeader.signature (0x%x bytes)",
757
0
                    value, (guint) len, (guint) 4);
758
0
        return FALSE;
759
0
    }
760
106
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
761
106
}
762
/**
763
 * fu_struct_cab_header_set_size: (skip):
764
 **/
765
void
766
fu_struct_cab_header_set_size(FuStructCabHeader *st, guint32 value)
767
0
{
768
0
    g_return_if_fail(st != NULL);
769
0
    fu_memwrite_uint32(st->buf->data + 8, value, G_LITTLE_ENDIAN);
770
0
}
771
/**
772
 * fu_struct_cab_header_set_off_cffile: (skip):
773
 **/
774
void
775
fu_struct_cab_header_set_off_cffile(FuStructCabHeader *st, guint32 value)
776
0
{
777
0
    g_return_if_fail(st != NULL);
778
0
    fu_memwrite_uint32(st->buf->data + 16, value, G_LITTLE_ENDIAN);
779
0
}
780
/**
781
 * fu_struct_cab_header_set_version_minor: (skip):
782
 **/
783
static void
784
fu_struct_cab_header_set_version_minor(FuStructCabHeader *st, guint8 value)
785
106
{
786
106
    g_return_if_fail(st != NULL);
787
106
    st->buf->data[24] = value;
788
106
}
789
/**
790
 * fu_struct_cab_header_set_version_major: (skip):
791
 **/
792
static void
793
fu_struct_cab_header_set_version_major(FuStructCabHeader *st, guint8 value)
794
106
{
795
106
    g_return_if_fail(st != NULL);
796
106
    st->buf->data[25] = value;
797
106
}
798
/**
799
 * fu_struct_cab_header_set_nr_folders: (skip):
800
 **/
801
void
802
fu_struct_cab_header_set_nr_folders(FuStructCabHeader *st, guint16 value)
803
106
{
804
106
    g_return_if_fail(st != NULL);
805
106
    fu_memwrite_uint16(st->buf->data + 26, value, G_LITTLE_ENDIAN);
806
106
}
807
/**
808
 * fu_struct_cab_header_set_nr_files: (skip):
809
 **/
810
void
811
fu_struct_cab_header_set_nr_files(FuStructCabHeader *st, guint16 value)
812
0
{
813
0
    g_return_if_fail(st != NULL);
814
0
    fu_memwrite_uint16(st->buf->data + 28, value, G_LITTLE_ENDIAN);
815
0
}
816
/**
817
 * fu_struct_cab_header_set_flags: (skip):
818
 **/
819
void
820
fu_struct_cab_header_set_flags(FuStructCabHeader *st, guint16 value)
821
0
{
822
0
    g_return_if_fail(st != NULL);
823
0
    fu_memwrite_uint16(st->buf->data + 30, value, G_LITTLE_ENDIAN);
824
0
}
825
/**
826
 * fu_struct_cab_header_set_set_id: (skip):
827
 **/
828
void
829
fu_struct_cab_header_set_set_id(FuStructCabHeader *st, guint16 value)
830
0
{
831
0
    g_return_if_fail(st != NULL);
832
0
    fu_memwrite_uint16(st->buf->data + 32, value, G_LITTLE_ENDIAN);
833
0
}
834
/**
835
 * fu_struct_cab_header_set_idx_cabinet: (skip):
836
 **/
837
void
838
fu_struct_cab_header_set_idx_cabinet(FuStructCabHeader *st, guint16 value)
839
0
{
840
0
    g_return_if_fail(st != NULL);
841
0
    fu_memwrite_uint16(st->buf->data + 34, value, G_LITTLE_ENDIAN);
842
0
}
843
/**
844
 * fu_struct_cab_header_new: (skip):
845
 **/
846
FuStructCabHeader *
847
fu_struct_cab_header_new(void)
848
106
{
849
106
    FuStructCabHeader *st = fu_struct_cab_header_new_internal();
850
106
    st->buf = g_byte_array_sized_new(36);
851
106
    fu_byte_array_set_size(st->buf, 36, 0x0);
852
106
    fu_struct_cab_header_set_signature(st, "MSCF", NULL);
853
106
    fu_struct_cab_header_set_version_minor(st, 3);
854
106
    fu_struct_cab_header_set_version_major(st, 1);
855
106
    fu_struct_cab_header_set_nr_folders(st, 1);
856
106
    return st;
857
106
}
858
/**
859
 * fu_struct_cab_header_to_string: (skip):
860
 **/
861
static gchar *
862
fu_struct_cab_header_to_string(const FuStructCabHeader *st)
863
0
{
864
0
    g_autoptr(GString) str = g_string_new("FuStructCabHeader:\n");
865
0
    g_return_val_if_fail(st != NULL, NULL);
866
0
    g_string_append_printf(str, "  size: 0x%x\n",
867
0
                           (guint) fu_struct_cab_header_get_size(st));
868
0
    g_string_append_printf(str, "  off_cffile: 0x%x\n",
869
0
                           (guint) fu_struct_cab_header_get_off_cffile(st));
870
0
    g_string_append_printf(str, "  nr_folders: 0x%x\n",
871
0
                           (guint) fu_struct_cab_header_get_nr_folders(st));
872
0
    g_string_append_printf(str, "  nr_files: 0x%x\n",
873
0
                           (guint) fu_struct_cab_header_get_nr_files(st));
874
0
    g_string_append_printf(str, "  flags: 0x%x\n",
875
0
                           (guint) fu_struct_cab_header_get_flags(st));
876
0
    g_string_append_printf(str, "  set_id: 0x%x\n",
877
0
                           (guint) fu_struct_cab_header_get_set_id(st));
878
0
    g_string_append_printf(str, "  idx_cabinet: 0x%x\n",
879
0
                           (guint) fu_struct_cab_header_get_idx_cabinet(st));
880
0
    if (str->len > 0)
881
0
        g_string_set_size(str, str->len - 1);
882
0
    return g_string_free(g_steal_pointer(&str), FALSE);
883
0
}
884
static gboolean
885
fu_struct_cab_header_validate_internal(FuStructCabHeader *st, GError **error)
886
384k
{
887
384k
    g_return_val_if_fail(st != NULL, FALSE);
888
384k
    if (strncmp((const gchar *) (st->buf->data + 0), "MSCF", 4) != 0) {
889
379k
        g_autofree gchar *str = fu_struct_cab_header_get_signature(st);
890
379k
        g_set_error(error,
891
379k
                    FWUPD_ERROR,
892
379k
                    FWUPD_ERROR_INVALID_DATA,
893
379k
                    "constant FuStructCabHeader.signature was not valid, "
894
379k
                    "expected 'MSCF' and got '%s'",
895
379k
                    str);
896
379k
        return FALSE;
897
379k
    }
898
5.13k
    if (fu_struct_cab_header_get_version_minor(st) != 3) {
899
298
        g_set_error_literal(error,
900
298
                            FWUPD_ERROR,
901
298
                            FWUPD_ERROR_INVALID_DATA,
902
298
                            "constant FuStructCabHeader.version_minor was not valid");
903
298
        return FALSE;
904
298
    }
905
4.84k
    if (fu_struct_cab_header_get_version_major(st) != 1) {
906
217
        g_set_error_literal(error,
907
217
                            FWUPD_ERROR,
908
217
                            FWUPD_ERROR_INVALID_DATA,
909
217
                            "constant FuStructCabHeader.version_major was not valid");
910
217
        return FALSE;
911
217
    }
912
4.62k
    return TRUE;
913
4.84k
}
914
/**
915
 * fu_struct_cab_header_validate_stream: (skip):
916
 **/
917
gboolean
918
fu_struct_cab_header_validate_stream(GInputStream *stream, gsize offset, GError **error)
919
387k
{
920
387k
    g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal();
921
387k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
922
387k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
923
387k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
924
387k
    if (st->buf == NULL) {
925
0
        g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36);
926
0
        return FALSE;
927
0
    }
928
387k
    if (st->buf->len != 36) {
929
5.07k
        g_set_error(error,
930
5.07k
                    FWUPD_ERROR,
931
5.07k
                    FWUPD_ERROR_INVALID_DATA,
932
5.07k
                    "FuStructCabHeader requested 0x%x and got 0x%x",
933
5.07k
                    (guint) 36,
934
5.07k
                    (guint) st->buf->len);
935
5.07k
        return FALSE;
936
5.07k
    }
937
381k
    return fu_struct_cab_header_validate_internal(st, error);
938
387k
}
939
static gboolean
940
fu_struct_cab_header_parse_internal(FuStructCabHeader *st, GError **error)
941
2.31k
{
942
2.31k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
943
0
        g_autofree gchar *str = fu_struct_cab_header_to_string(st);
944
0
        g_debug("%s", str);
945
0
    }
946
2.31k
    if (!fu_struct_cab_header_validate_internal(st, error))
947
0
        return FALSE;
948
2.31k
    return TRUE;
949
2.31k
}
950
/**
951
 * fu_struct_cab_header_parse_stream: (skip):
952
 **/
953
FuStructCabHeader *
954
fu_struct_cab_header_parse_stream(GInputStream *stream, gsize offset, GError **error)
955
2.31k
{
956
2.31k
    g_autoptr(FuStructCabHeader) st = fu_struct_cab_header_new_internal();
957
2.31k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 36, NULL, error);
958
2.31k
    if (st->buf == NULL) {
959
0
        g_prefix_error(error, "FuStructCabHeader failed read of 0x%x: ", (guint) 36);
960
0
        return NULL;
961
0
    }
962
2.31k
    if (st->buf->len != 36) {
963
0
        g_set_error(error,
964
0
                    FWUPD_ERROR,
965
0
                    FWUPD_ERROR_INVALID_DATA,
966
0
                    "FuStructCabHeader requested 0x%x and got 0x%x",
967
0
                    (guint) 36,
968
0
                    (guint) st->buf->len);
969
0
        return NULL;
970
0
    }
971
2.31k
    if (!fu_struct_cab_header_parse_internal(st, error))
972
0
        return NULL;
973
2.31k
    return g_steal_pointer(&st);
974
2.31k
}
975
/**
976
 * fu_struct_cab_header_reserve_ref: (skip):
977
 **/
978
FuStructCabHeaderReserve *
979
fu_struct_cab_header_reserve_ref(FuStructCabHeaderReserve *st)
980
0
{
981
0
    g_return_val_if_fail(st != NULL, NULL);
982
0
    st->refcount++;
983
0
    return st;
984
0
}
985
/**
986
 * fu_struct_cab_header_reserve_unref: (skip):
987
 **/
988
void
989
fu_struct_cab_header_reserve_unref(FuStructCabHeaderReserve *st)
990
90
{
991
90
    g_return_if_fail(st != NULL);
992
90
    if (st->refcount == 0) {
993
0
        g_critical("FuStructCabHeaderReserve refcount already zero");
994
0
        return;
995
0
    }
996
90
    if (--st->refcount > 0)
997
0
        return;
998
90
    if (st->buf != NULL)
999
78
        g_byte_array_unref(st->buf);
1000
90
    g_free(st);
1001
90
}
1002
static FuStructCabHeaderReserve *
1003
fu_struct_cab_header_reserve_new_internal(void)
1004
90
{
1005
90
    FuStructCabHeaderReserve *st = g_new0(FuStructCabHeaderReserve, 1);
1006
90
    st->refcount = 1;
1007
90
    return st;
1008
90
}
1009
1010
/* getters */
1011
/**
1012
 * fu_struct_cab_header_reserve_get_rsvd_hdr: (skip):
1013
 **/
1014
guint16
1015
fu_struct_cab_header_reserve_get_rsvd_hdr(const FuStructCabHeaderReserve *st)
1016
71
{
1017
71
    g_return_val_if_fail(st != NULL, 0x0);
1018
71
    return fu_memread_uint16(st->buf->data + 0, G_LITTLE_ENDIAN);
1019
71
}
1020
/**
1021
 * fu_struct_cab_header_reserve_get_rsvd_folder: (skip):
1022
 **/
1023
guint8
1024
fu_struct_cab_header_reserve_get_rsvd_folder(const FuStructCabHeaderReserve *st)
1025
71
{
1026
71
    g_return_val_if_fail(st != NULL, 0x0);
1027
71
    return st->buf->data[2];
1028
71
}
1029
/**
1030
 * fu_struct_cab_header_reserve_get_rsvd_block: (skip):
1031
 **/
1032
guint8
1033
fu_struct_cab_header_reserve_get_rsvd_block(const FuStructCabHeaderReserve *st)
1034
71
{
1035
71
    g_return_val_if_fail(st != NULL, 0x0);
1036
71
    return st->buf->data[3];
1037
71
}
1038
1039
/* setters */
1040
/**
1041
 * fu_struct_cab_header_reserve_set_rsvd_hdr: (skip):
1042
 **/
1043
void
1044
fu_struct_cab_header_reserve_set_rsvd_hdr(FuStructCabHeaderReserve *st, guint16 value)
1045
0
{
1046
0
    g_return_if_fail(st != NULL);
1047
0
    fu_memwrite_uint16(st->buf->data + 0, value, G_LITTLE_ENDIAN);
1048
0
}
1049
/**
1050
 * fu_struct_cab_header_reserve_set_rsvd_folder: (skip):
1051
 **/
1052
void
1053
fu_struct_cab_header_reserve_set_rsvd_folder(FuStructCabHeaderReserve *st, guint8 value)
1054
0
{
1055
0
    g_return_if_fail(st != NULL);
1056
0
    st->buf->data[2] = value;
1057
0
}
1058
/**
1059
 * fu_struct_cab_header_reserve_set_rsvd_block: (skip):
1060
 **/
1061
void
1062
fu_struct_cab_header_reserve_set_rsvd_block(FuStructCabHeaderReserve *st, guint8 value)
1063
0
{
1064
0
    g_return_if_fail(st != NULL);
1065
0
    st->buf->data[3] = value;
1066
0
}
1067
/**
1068
 * fu_struct_cab_header_reserve_new: (skip):
1069
 **/
1070
FuStructCabHeaderReserve *
1071
fu_struct_cab_header_reserve_new(void)
1072
0
{
1073
0
    FuStructCabHeaderReserve *st = fu_struct_cab_header_reserve_new_internal();
1074
0
    st->buf = g_byte_array_sized_new(4);
1075
0
    fu_byte_array_set_size(st->buf, 4, 0x0);
1076
0
    return st;
1077
0
}
1078
/**
1079
 * fu_struct_cab_header_reserve_to_string: (skip):
1080
 **/
1081
static gchar *
1082
fu_struct_cab_header_reserve_to_string(const FuStructCabHeaderReserve *st)
1083
0
{
1084
0
    g_autoptr(GString) str = g_string_new("FuStructCabHeaderReserve:\n");
1085
0
    g_return_val_if_fail(st != NULL, NULL);
1086
0
    g_string_append_printf(str, "  rsvd_hdr: 0x%x\n",
1087
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_hdr(st));
1088
0
    g_string_append_printf(str, "  rsvd_folder: 0x%x\n",
1089
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_folder(st));
1090
0
    g_string_append_printf(str, "  rsvd_block: 0x%x\n",
1091
0
                           (guint) fu_struct_cab_header_reserve_get_rsvd_block(st));
1092
0
    if (str->len > 0)
1093
0
        g_string_set_size(str, str->len - 1);
1094
0
    return g_string_free(g_steal_pointer(&str), FALSE);
1095
0
}
1096
static gboolean
1097
fu_struct_cab_header_reserve_validate_internal(FuStructCabHeaderReserve *st, GError **error)
1098
71
{
1099
71
    g_return_val_if_fail(st != NULL, FALSE);
1100
71
    return TRUE;
1101
71
}
1102
static gboolean
1103
fu_struct_cab_header_reserve_parse_internal(FuStructCabHeaderReserve *st, GError **error)
1104
71
{
1105
71
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
1106
0
        g_autofree gchar *str = fu_struct_cab_header_reserve_to_string(st);
1107
0
        g_debug("%s", str);
1108
0
    }
1109
71
    if (!fu_struct_cab_header_reserve_validate_internal(st, error))
1110
0
        return FALSE;
1111
71
    return TRUE;
1112
71
}
1113
/**
1114
 * fu_struct_cab_header_reserve_parse_stream: (skip):
1115
 **/
1116
FuStructCabHeaderReserve *
1117
fu_struct_cab_header_reserve_parse_stream(GInputStream *stream, gsize offset, GError **error)
1118
90
{
1119
90
    g_autoptr(FuStructCabHeaderReserve) st = fu_struct_cab_header_reserve_new_internal();
1120
90
    st->buf = fu_input_stream_read_byte_array(stream, offset, 4, NULL, error);
1121
90
    if (st->buf == NULL) {
1122
12
        g_prefix_error(error, "FuStructCabHeaderReserve failed read of 0x%x: ", (guint) 4);
1123
12
        return NULL;
1124
12
    }
1125
78
    if (st->buf->len != 4) {
1126
7
        g_set_error(error,
1127
7
                    FWUPD_ERROR,
1128
7
                    FWUPD_ERROR_INVALID_DATA,
1129
7
                    "FuStructCabHeaderReserve requested 0x%x and got 0x%x",
1130
7
                    (guint) 4,
1131
7
                    (guint) st->buf->len);
1132
7
        return NULL;
1133
7
    }
1134
71
    if (!fu_struct_cab_header_reserve_parse_internal(st, error))
1135
0
        return NULL;
1136
71
    return g_steal_pointer(&st);
1137
71
}