diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c index f870f0f55ef30a0e7d20df48c304bbf279ee2a16..2e0138e11e31981ca1f1994622ac12c5449416ad 100644 --- a/src/sbbs3/filedat.c +++ b/src/sbbs3/filedat.c @@ -155,12 +155,15 @@ str_list_t loadfilenames(smb_t* smb, const char* filespec, time_t t, enum file_s return NULL; fseek(smb->sid_fp, start * sizeof(fileidxrec_t), SEEK_SET); - while(!feof(smb->sid_fp)) { + size_t offset = start; + while(!feof(smb->sid_fp) && offset < smb->status.total_files) { fileidxrec_t fidx; if(smb_fread(smb, &fidx, sizeof(fidx), smb->sid_fp) != sizeof(fidx)) break; + offset++; + if(fidx.idx.number == 0) /* invalid message number, ignore */ continue; @@ -197,9 +200,10 @@ file_t* loadfiles(smb_t* smb, const char* filespec, time_t t, enum file_detail d return NULL; fseek(smb->sid_fp, start * sizeof(fileidxrec_t), SEEK_SET); - long offset = start; - while(!feof(smb->sid_fp)) { - file_t* f = &file_list[*count]; + size_t offset = start; + size_t cnt = 0; + while(!feof(smb->sid_fp) && offset < smb->status.total_files) { + file_t* f = &file_list[cnt]; if(smb_fread(smb, &f->file_idx, sizeof(f->file_idx), smb->sid_fp) != sizeof(f->file_idx)) break; @@ -215,14 +219,17 @@ file_t* loadfiles(smb_t* smb, const char* filespec, time_t t, enum file_detail d if(!wildmatch(f->file_idx.name, filespec, /* path: */false, /* case-sensitive: */false)) continue; } - int result = smb_getfile(smb, f, detail); - if(result != SMB_SUCCESS) - break; - (*count)++; + cnt++; } if(order != FILE_SORT_NATURAL) - sortfiles(file_list, *count, order); + sortfiles(file_list, cnt, order); + // Read (and set convenience pointers) *after* sorting the list + for((*count) = 0; (*count) < cnt; (*count)++) { + int result = smb_getfile(smb, &file_list[*count], detail); + if(result != SMB_SUCCESS) + break; + } return file_list; } @@ -231,7 +238,7 @@ static int file_compare_name_a(const void* v1, const void* v2) file_t* f1 = (file_t*)v1; file_t* f2 = (file_t*)v2; - return stricmp(f1->name, f2->name); + return stricmp(f1->file_idx.name, f2->file_idx.name); } static int file_compare_name_ac(const void* v1, const void* v2) @@ -239,7 +246,7 @@ static int file_compare_name_ac(const void* v1, const void* v2) file_t* f1 = (file_t*)v1; file_t* f2 = (file_t*)v2; - return strcmp(f1->name, f2->name); + return strcmp(f1->file_idx.name, f2->file_idx.name); } static int file_compare_name_d(const void* v1, const void* v2) @@ -247,7 +254,7 @@ static int file_compare_name_d(const void* v1, const void* v2) file_t* f1 = (file_t*)v1; file_t* f2 = (file_t*)v2; - return stricmp(f2->name, f1->name); + return stricmp(f2->file_idx.name, f1->file_idx.name); } static int file_compare_name_dc(const void* v1, const void* v2) @@ -255,7 +262,7 @@ static int file_compare_name_dc(const void* v1, const void* v2) file_t* f1 = (file_t*)v1; file_t* f2 = (file_t*)v2; - return strcmp(f2->name, f1->name); + return strcmp(f2->file_idx.name, f1->file_idx.name); } static int file_compare_date_a(const void* v1, const void* v2)