jgvariant-ostree: Handle non-canonical endianness in static deltas.
Change-Id: I333fce6d6f4df995d6d965261bb66e50c116f02d
diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java
index edcf2bf..10b1661 100644
--- a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java
+++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java
@@ -57,15 +57,41 @@
private static final Decoder<DeltaSuperblock> DECODER =
Decoder.ofStructure(
- DeltaSuperblock.class,
- Metadata.decoder(),
- Decoder.ofLong().withByteOrder(ByteOrder.BIG_ENDIAN),
- Checksum.decoder(),
- Checksum.decoder(),
- Commit.decoder(),
- Decoder.ofByteArray().map(DeltaSuperblock::parseDeltaNameList),
- Decoder.ofArray(DeltaMetaEntry.decoder()),
- Decoder.ofArray(DeltaFallback.decoder()));
+ DeltaSuperblock.class,
+ Metadata.decoder(),
+ Decoder.ofLong().withByteOrder(ByteOrder.BIG_ENDIAN),
+ Checksum.decoder(),
+ Checksum.decoder(),
+ Commit.decoder(),
+ Decoder.ofByteArray().map(DeltaSuperblock::parseDeltaNameList),
+ Decoder.ofArray(DeltaMetaEntry.decoder()).withByteOrder(ByteOrder.LITTLE_ENDIAN),
+ Decoder.ofArray(DeltaFallback.decoder()).withByteOrder(ByteOrder.LITTLE_ENDIAN))
+ .map(
+ deltaSuperblock -> {
+ // Fix up the endianness of the 'entries' and 'fallbacks' fields, which have
+ // unspecified byte order.
+ var endiannessMetadatum =
+ deltaSuperblock.metadata().fields().get("ostree.endianness");
+ if (endiannessMetadatum != null
+ && endiannessMetadatum.value() instanceof Byte endiannessByte
+ && endiannessByte == (byte) 'B') {
+ return deltaSuperblock.byteSwapped();
+ } else {
+ return deltaSuperblock;
+ }
+ });
+
+ private DeltaSuperblock byteSwapped() {
+ return new DeltaSuperblock(
+ metadata,
+ timestamp,
+ fromChecksum,
+ toChecksum,
+ commit,
+ dependencies,
+ entries.stream().map(DeltaMetaEntry::byteSwapped).toList(),
+ fallbacks.stream().map(DeltaFallback::byteSwapped).toList());
+ }
private static List<DeltaName> parseDeltaNameList(byte[] bytes) {
var byteBuffer = ByteBuffer.wrap(bytes);