Ticket #23550: pbf-deserialization-fix.diff

File pbf-deserialization-fix.diff, 3.4 KB (added by giora.kosoi@…, 2 months ago)

Fix for deserialization error

  • src/org/openstreetmap/josm/data/osm/pbf/Blob.java

     
    44import java.io.ByteArrayInputStream;
    55import java.io.IOException;
    66import java.io.InputStream;
     7import java.util.zip.Inflater;
    78import java.util.zip.InflaterInputStream;
    89
    910import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
     
    9697            case lz4:
    9798                throw new IOException(this.compressionType + " pbf is not currently supported");
    9899            case zlib:
    99                 return new InflaterInputStream(bais);
     100                Inflater inflater = new Inflater();
     101                inflater.setInput(this.bytes, 0, this.bytes.length);
     102                return new InflaterInputStream(bais, inflater);
    100103            default:
    101104                throw new IOException("unknown compression type is not currently supported: " + this.compressionType.name());
    102105        }
  • src/org/openstreetmap/josm/io/OsmPbfReader.java

     
    1919import jakarta.annotation.Nullable;
    2020
    2121import org.apache.commons.compress.utils.CountingInputStream;
     22import org.apache.commons.compress.utils.IOUtils;
    2223import org.openstreetmap.josm.data.Bounds;
    2324import org.openstreetmap.josm.data.DataSource;
    2425import org.openstreetmap.josm.data.coor.LatLon;
     
    185186        int size = Integer.MIN_VALUE;
    186187        Blob.CompressionType type = null;
    187188        ProtobufRecord current = null;
     189        byte [] bytes = null;
    188190        while (parser.hasNext() && cis.getBytesRead() - start < header.dataSize()) {
    189191            current = new ProtobufRecord(baos, parser);
    190192            switch (current.getField()) {
    191193                case 1:
    192194                    type = Blob.CompressionType.raw;
     195                    bytes = current.getBytes();
    193196                    break;
    194197                case 2:
    195198                    size = current.asUnsignedVarInt().intValue();
     
    196199                    break;
    197200                case 3:
    198201                    type = Blob.CompressionType.zlib;
     202                    bytes = current.getBytes();
    199203                    break;
    200204                case 4:
    201205                    type = Blob.CompressionType.lzma;
     206                    bytes = current.getBytes();
    202207                    break;
    203208                case 5:
    204209                    type = Blob.CompressionType.bzip2;
     210                    bytes = current.getBytes();
    205211                    break;
    206212                case 6:
    207213                    type = Blob.CompressionType.lz4;
     214                    bytes = current.getBytes();
    208215                    break;
    209216                case 7:
    210217                    type = Blob.CompressionType.zstd;
     218                    bytes = current.getBytes();
    211219                    break;
    212220                default:
    213221                    throw new IllegalStateException("Unknown compression type: " + current.getField());
     
    216224        if (type == null) {
    217225            throw new IllegalStateException("Compression type not found, pbf may be malformed");
    218226        }
    219         return new Blob(size, type, current.getBytes());
     227        return new Blob(size, type, bytes);
    220228    }
    221229
    222230    /**