summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2021-02-26 13:21:55 +0100
committer Olivier Galibert <galibert@pobox.com>2021-02-26 13:47:10 +0100
commit439f28144fb04b90fb9c39f3b184b3d83cc55f3f (patch)
treedff7107b866953d5ec2614e2bb8c065194924cac
parentb466a9ca61e41f1043475960f4cdde47f62c0cec (diff)
upd765_dsk, wd177x_dsk: Do not crash on damaged disks
-rw-r--r--src/lib/formats/upd765_dsk.cpp13
-rw-r--r--src/lib/formats/wd177x_dsk.cpp13
2 files changed, 14 insertions, 12 deletions
diff --git a/src/lib/formats/upd765_dsk.cpp b/src/lib/formats/upd765_dsk.cpp
index 0538dc58010..e5f298ed8fd 100644
--- a/src/lib/formats/upd765_dsk.cpp
+++ b/src/lib/formats/upd765_dsk.cpp
@@ -418,13 +418,14 @@ void upd765_format::extract_sectors(floppy_image *image, const format &f, desc_s
for(int i=0; i<f.sector_count; i++) {
desc_s &ds = sdesc[i];
- const auto &data = sectors[ds.sector_id];
- if(data.empty())
+ if(ds.sector_id >= sectors.size() || sectors[ds.sector_id].empty())
memset((void *)ds.data, 0, ds.size);
- else if(data.size() < ds.size) {
- memcpy((void *)ds.data, data.data(), data.size());
- memset((uint8_t *)ds.data + data.size(), 0, data.size() - ds.size);
+
+ else if(sectors[ds.sector_id].size() < ds.size) {
+ memcpy((void *)ds.data, sectors[ds.sector_id].data(), sectors[ds.sector_id].size());
+ memset((uint8_t *)ds.data + sectors[ds.sector_id].size(), 0, sectors[ds.sector_id].size() - ds.size);
+
} else
- memcpy((void *)ds.data, data.data(), ds.size);
+ memcpy((void *)ds.data, sectors[ds.sector_id].data(), ds.size);
}
}
diff --git a/src/lib/formats/wd177x_dsk.cpp b/src/lib/formats/wd177x_dsk.cpp
index e89fe9b3f6e..2979d213933 100644
--- a/src/lib/formats/wd177x_dsk.cpp
+++ b/src/lib/formats/wd177x_dsk.cpp
@@ -492,13 +492,14 @@ void wd177x_format::extract_sectors(floppy_image *image, const format &f, desc_s
for(int i=0; i<f.sector_count; i++) {
desc_s &ds = sdesc[i];
- const auto &data = sectors[ds.sector_id];
- if(data.empty())
+ if(ds.sector_id >= sectors.size() || sectors[ds.sector_id].empty())
memset((void *)ds.data, 0, ds.size);
- else if(data.size() < ds.size) {
- memcpy((void *)ds.data, data.data(), data.size());
- memset((uint8_t *)ds.data + data.size(), 0, data.size() - ds.size);
+
+ else if(sectors[ds.sector_id].size() < ds.size) {
+ memcpy((void *)ds.data, sectors[ds.sector_id].data(), sectors[ds.sector_id].size());
+ memset((uint8_t *)ds.data + sectors[ds.sector_id].size(), 0, sectors[ds.sector_id].size() - ds.size);
+
} else
- memcpy((void *)ds.data, data.data(), ds.size);
+ memcpy((void *)ds.data, sectors[ds.sector_id].data(), ds.size);
}
}