Commit 8ce0f8699347bb4beab1cbdb4245907d21cc26ea

Authored by balrog
1 parent 59795a1f

Currently trying to turn an oversized directory into a VVFAT image will

result in a cryptic error (and an abort):
  qemu: block-vvfat.c:97: array_get: Assertion `index < array->next' failed.
  Aborted

Turn this into an actually useful error message:
  Directory does not fit in FAT16 (capacity 504MB)
  qemu: could not open disk image fat:$DIR/


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5665 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 13 additions and 9 deletions
block-vvfat.c
@@ -890,7 +890,6 @@ static int init_directories(BDRVVVFATState* s, @@ -890,7 +890,6 @@ static int init_directories(BDRVVVFATState* s,
890 s->path = mapping->path; 890 s->path = mapping->path;
891 891
892 for (i = 0, cluster = 0; i < s->mapping.next; i++) { 892 for (i = 0, cluster = 0; i < s->mapping.next; i++) {
893 - int j;  
894 /* MS-DOS expects the FAT to be 0 for the root directory 893 /* MS-DOS expects the FAT to be 0 for the root directory
895 * (except for the media byte). */ 894 * (except for the media byte). */
896 /* LATER TODO: still true for FAT32? */ 895 /* LATER TODO: still true for FAT32? */
@@ -923,20 +922,25 @@ static int init_directories(BDRVVVFATState* s, @@ -923,20 +922,25 @@ static int init_directories(BDRVVVFATState* s,
923 922
924 assert(mapping->begin < mapping->end); 923 assert(mapping->begin < mapping->end);
925 924
  925 + /* next free cluster */
  926 + cluster = mapping->end;
  927 +
  928 + if(cluster > s->cluster_count) {
  929 + fprintf(stderr,"Directory does not fit in FAT%d (capacity %s)\n",
  930 + s->fat_type,
  931 + s->fat_type == 12 ? s->sector_count == 2880 ? "1.44 MB"
  932 + : "2.88 MB"
  933 + : "504MB");
  934 + return -EINVAL;
  935 + }
  936 +
926 /* fix fat for entry */ 937 /* fix fat for entry */
927 if (fix_fat) { 938 if (fix_fat) {
  939 + int j;
928 for(j = mapping->begin; j < mapping->end - 1; j++) 940 for(j = mapping->begin; j < mapping->end - 1; j++)
929 fat_set(s, j, j+1); 941 fat_set(s, j, j+1);
930 fat_set(s, mapping->end - 1, s->max_fat_value); 942 fat_set(s, mapping->end - 1, s->max_fat_value);
931 } 943 }
932 -  
933 - /* next free cluster */  
934 - cluster = mapping->end;  
935 -  
936 - if(cluster > s->cluster_count) {  
937 - fprintf(stderr,"Directory does not fit in FAT%d\n",s->fat_type);  
938 - return -1;  
939 - }  
940 } 944 }
941 945
942 mapping = array_get(&(s->mapping), 0); 946 mapping = array_get(&(s->mapping), 0);