summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/fat.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c
index d9aecd8cb0..4bf76bf8ef 100644
--- a/firmware/drivers/fat.c
+++ b/firmware/drivers/fat.c
@@ -1861,9 +1861,8 @@ static int transfer( unsigned int start, int count, char* buf, bool write )
1861{ 1861{
1862 int rc; 1862 int rc;
1863 1863
1864 start += fat_bpb.startsector; /* offset by partition location */ 1864 LDEBUGF("transfer(s=%x, c=%x, %s)\n",
1865 1865 start+ fat_bpb.startsector, count, write?"write":"read");
1866 LDEBUGF("transfer(s=%x, c=%x, %s)\n",start, count, write?"write":"read");
1867 if (write) { 1866 if (write) {
1868 unsigned int firstallowed; 1867 unsigned int firstallowed;
1869#ifdef HAVE_FAT16SUPPORT 1868#ifdef HAVE_FAT16SUPPORT
@@ -1873,12 +1872,15 @@ static int transfer( unsigned int start, int count, char* buf, bool write )
1873#endif 1872#endif
1874 firstallowed = fat_bpb.firstdatasector; 1873 firstallowed = fat_bpb.firstdatasector;
1875 1874
1876 if (start < firstallowed + fat_bpb.startsector) 1875 if (start < firstallowed)
1877 panicf("Writing before data\n"); 1876 panicf("Write %d before data\n", firstallowed - start);
1878 rc = ata_write_sectors(start, count, buf); 1877 if (start + count > fat_bpb.totalsectors)
1878 panicf("Write %d after data\n",
1879 start + count - fat_bpb.totalsectors);
1880 rc = ata_write_sectors(start + fat_bpb.startsector, count, buf);
1879 } 1881 }
1880 else 1882 else
1881 rc = ata_read_sectors(start, count, buf); 1883 rc = ata_read_sectors(start + fat_bpb.startsector, count, buf);
1882 if (rc < 0) { 1884 if (rc < 0) {
1883 DEBUGF( "transfer() - Couldn't %s sector %x" 1885 DEBUGF( "transfer() - Couldn't %s sector %x"
1884 " (error code %d)\n", 1886 " (error code %d)\n",