From 5c77c57aa23ae6c9b360f58450f2591851e38a12 Mon Sep 17 00:00:00 2001 From: Lisias Date: Thu, 14 Dec 2017 01:08:23 -0200 Subject: [PATCH] Fixing and optimizing the loop detection as suggested in: https://github.com/AppleCommander/AppleCommander/pull/19#pullrequestreview-82712102 --- .../storage/os/dos33/DosFormatDisk.java | 12 ++++++------ .../storage/os/dos33/DosSectorAddress.java | 19 +++++++++++++++++-- .../storage/os/prodos/ProdosFormatDisk.java | 10 +++++----- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosFormatDisk.java b/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosFormatDisk.java index 68adce7..7f2184d 100644 --- a/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosFormatDisk.java +++ b/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosFormatDisk.java @@ -20,9 +20,9 @@ package com.webcodepro.applecommander.storage.os.dos33; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.Set; +import java.util.HashSet; import com.webcodepro.applecommander.storage.DirectoryEntry; import com.webcodepro.applecommander.storage.DiskException; @@ -147,13 +147,13 @@ public class DosFormatDisk extends FormattedDisk { byte[] vtoc = readVtoc(); int track = AppleUtil.getUnsignedByte(vtoc[1]); int sector = AppleUtil.getUnsignedByte(vtoc[2]); - final Map> visits = new HashMap<>(); + final Set visits = new HashSet<>(); while (sector != 0) { // bug fix: iterate through all catalog _sectors_ // Prevents a recursive catalog crawling. - if ( !visits.containsKey(track) ) visits.put(track, new HashMap()); - if ( visits.get(track).containsKey(sector)) throw new DiskCorruptException("Recursive Directory structure detected.", DiskCorruptException.Kind.RECURSIVE_DIRECTORY_STRUCTURE, new DosSectorAddress(track, sector)); - else visits.get(track).put(sector, Boolean.TRUE); + final DosSectorAddress address = new DosSectorAddress(track, sector); + if ( visits.contains(address)) throw new DiskCorruptException("Recursive Directory structure detected.", DiskCorruptException.Kind.RECURSIVE_DIRECTORY_STRUCTURE, address); + else visits.add(address); byte[] catalogSector = readSector(track, sector); int offset = 0x0b; diff --git a/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosSectorAddress.java b/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosSectorAddress.java index 96ecbfe..b8d160c 100644 --- a/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosSectorAddress.java +++ b/src/main/java/com/webcodepro/applecommander/storage/os/dos33/DosSectorAddress.java @@ -29,13 +29,28 @@ public class DosSectorAddress { public final Integer track; public final Integer sector; - + public DosSectorAddress(int track, int sector) { this.track = track; this.sector = sector; } - + public String toString() { return "Track:" + this.track + ", Sector:" + this.sector; } + + public boolean equals(final Object other){ + if(other == null) return false; + if(!(other instanceof DosSectorAddress)) return false; + + final DosSectorAddress o = (DosSectorAddress) other; + return this.track == o.track && this.sector == o.sector; + } + + public int hashCode() { + int result = 17; + result = 31 * result + this.track.hashCode(); + result = 31 * result + this.sector.hashCode(); + return result; + } } diff --git a/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFormatDisk.java b/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFormatDisk.java index 7ba45e5..ab30105 100644 --- a/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFormatDisk.java +++ b/src/main/java/com/webcodepro/applecommander/storage/os/prodos/ProdosFormatDisk.java @@ -23,10 +23,10 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Properties; +import java.util.Set; +import java.util.HashSet; import com.webcodepro.applecommander.storage.DirectoryEntry; import com.webcodepro.applecommander.storage.DiskException; @@ -275,11 +275,11 @@ public class ProdosFormatDisk extends FormattedDisk { */ protected List getFiles(int blockNumber) throws DiskException { List files = new ArrayList<>(); - final Map visits = new HashMap<>(); + final Set visits = new HashSet<>(); while (blockNumber != 0) { // Prevents a recursive catalog crawling. - if ( visits.containsKey(blockNumber)) throw new DiskCorruptException("Recursive Directory structure detected.", DiskCorruptException.Kind.RECURSIVE_DIRECTORY_STRUCTURE, new ProdosBlockAddress(blockNumber)); - else visits.put(blockNumber, Boolean.TRUE); + if ( visits.contains(blockNumber)) throw new DiskCorruptException("Recursive Directory structure detected.", DiskCorruptException.Kind.RECURSIVE_DIRECTORY_STRUCTURE, new ProdosBlockAddress(blockNumber)); + else visits.add(blockNumber); byte[] block = readBlock(blockNumber); int offset = 4;