From 6475967948872b41a6e25e1983e8b592a6e19dc3 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 26 Apr 2021 15:24:48 -0400 Subject: [PATCH] dos33_raw: add some sanity checks try to warn a bit if we write beyond the end of what we expect --- utils/dos33fs-utils/dos33_raw.c | 39 ++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/utils/dos33fs-utils/dos33_raw.c b/utils/dos33fs-utils/dos33_raw.c index 7d6182dc..2ed3eabf 100644 --- a/utils/dos33fs-utils/dos33_raw.c +++ b/utils/dos33fs-utils/dos33_raw.c @@ -5,6 +5,8 @@ #include #include +#include + /* usage: dos33_raw track sector file */ static void usage(char *exe_name) { printf("Usage:\n"); @@ -31,13 +33,15 @@ static int goto_dos_track_sector(int fd, int track, int sector) { int main(int argc, char **argv) { - unsigned int track,sector,start,count,total; + unsigned int track,sector,start,count,total,max_track,filesize; + unsigned int max_sector,check_max=0; int disk_image_fd; int file_fd; unsigned char buffer[256]; int result,read_result; + struct stat statbuf; - if (argc<6) { + if (argc<7) { usage(argv[0]); } @@ -46,7 +50,34 @@ int main(int argc, char **argv) { start=atoi(argv[5]); count=atoi(argv[6]); - /* FIXME: check limits based on stat of file */ + if (argc>7) { + max_track=atoi(argv[7]); + check_max=1; + } + + /* check filesize using stat */ + result=stat(argv[4], &statbuf); + if (result<0) { + fprintf(stderr,"Error stating %s: %s\n", + argv[4],strerror(errno)); + exit(1); + } + filesize=statbuf.st_size; + + if (count==0) { + count=(filesize/256); + if ((filesize%256)!=0) count++; + } + + /* sanity check we aren't going off the last track */ + if (check_max) { + max_sector=((track*16)+sector+count); + if (max_sector >= max_track*16) { + fprintf(stderr,"Error, %d exceeds max_sector of %d\n", + max_sector,max_track*16); + exit(1); + } + } if (track>34) { fprintf(stderr,"Warning! Unusual track number %d\n",track); @@ -109,5 +140,7 @@ int main(int argc, char **argv) { close(file_fd); close(disk_image_fd); + fprintf(stderr,"Wrote %d sectors\n",count); + return 0; }