diff --git a/src/sbbs3/file.cpp b/src/sbbs3/file.cpp
index babd798bd7dcdb733a2309e1982d33d06b59dcac..4c905c8c098cfc69d41c7788842319845f5edc85 100644
--- a/src/sbbs3/file.cpp
+++ b/src/sbbs3/file.cpp
@@ -44,7 +44,7 @@ void sbbs_t::showfileinfo(file_t* f, bool show_extdesc)
 
 	bprintf(P_TRUNCATE, text[FiCredits]
 		,(cfg.dir[f->dir]->misc&DIR_FREE || !f->cost) ? "FREE" : ultoac((ulong)f->cost,tmp));
-	if(getfilesize(&cfg, f) > 0 &&  f->size == f->file_idx.idx.size) {
+	if(getfilesize(&cfg, f) > 0 &&  f->size == smb_getfilesize(&f->idx)) {
 #if 0 // I don't think anyone cares about the CRC-16 checksum value of a file
 		if(f->file_idx.hash.flags & SMB_HASH_CRC16) {
 			SAFEPRINTF(tmp, "%04x", f->file_idx.hash.data.crc16);
diff --git a/src/sbbs3/filedat.c b/src/sbbs3/filedat.c
index a5204c5c7bb2fd4433e09719078580a4ff6aa2ec..2721d9d61e3c040fef0c33e8eabb48baea0a4b09 100644
--- a/src/sbbs3/filedat.c
+++ b/src/sbbs3/filedat.c
@@ -310,7 +310,12 @@ static int file_compare_size_a(const void* v1, const void* v2)
 	file_t* f1 = (file_t*)v1;
 	file_t* f2 = (file_t*)v2;
 
-	return f1->idx.size - f2->idx.size;
+	int64_t diff = smb_getfilesize(&f1->idx) - smb_getfilesize(&f2->idx);
+	if(diff < 0)
+		return -1;
+	if(diff > 0)
+		return 1;
+	return 0;
 }
 
 static int file_compare_size_d(const void* v1, const void* v2)
@@ -318,7 +323,12 @@ static int file_compare_size_d(const void* v1, const void* v2)
 	file_t* f1 = (file_t*)v1;
 	file_t* f2 = (file_t*)v2;
 
-	return f2->idx.size - f1->idx.size;
+	int64_t diff = smb_getfilesize(&f2->idx) - smb_getfilesize(&f1->idx);
+	if(diff < 0)
+		return -1;
+	if(diff > 0)
+		return 1;
+	return 0;
 }
 
 void sortfiles(file_t* filelist, size_t count, enum file_sort order)
diff --git a/src/sbbs3/js_filebase.c b/src/sbbs3/js_filebase.c
index 08eacba5b227da2f06b2aec08d49455744900995..e6d09508458f947b5cac1de0a17904eebc8ec245 100644
--- a/src/sbbs3/js_filebase.c
+++ b/src/sbbs3/js_filebase.c
@@ -254,7 +254,7 @@ set_file_properties(JSContext *cx, JSObject* obj, file_t* f, enum file_detail de
 	if(is_valid_dirnum(scfg, f->dir) && (scfg->dir[f->dir]->misc & DIR_FCHK) && detail >= file_detail_normal)
 		val = DOUBLE_TO_JSVAL((double)getfilesize(scfg, f));
 	else
-		val = UINT_TO_JSVAL(f->idx.size);
+		val = DOUBLE_TO_JSVAL((double)smb_getfilesize(&f->idx));
 	if(!JS_DefineProperty(cx, obj, "size", val, NULL, NULL, flags))
 		return false;
 
@@ -328,11 +328,7 @@ parse_file_index_properties(JSContext *cx, JSObject* obj, fileidxrec_t* idx)
 		SAFECOPY(idx->name, cp);
 	}
 	if(JS_GetProperty(cx, obj, prop_name = "size", &val) && !JSVAL_NULL_OR_VOID(val)) {
-		if(!JS_ValueToECMAUint32(cx, val, &idx->idx.size)) {
-			free(cp);
-			JS_ReportError(cx, "Error converting adding '%s' property to Uint32", prop_name);
-			return FALSE;
-		}
+		smb_setfilesize(&idx->idx, (uint64_t)JSVAL_TO_DOUBLE(val));
 	}
 	if(JS_GetProperty(cx, obj, prop_name = "crc16", &val) && !JSVAL_NULL_OR_VOID(val)) {
 		idx->hash.data.crc16 = JSVAL_TO_INT(val);
@@ -675,7 +671,7 @@ js_hash_file(JSContext *cx, uintN argc, jsval *arglist)
 	if(size == -1)
 		JS_ReportError(cx, "File does not exist: %s", path);
 	else {
-		file.idx.size = (uint32_t)size;
+		smb_setfilesize(&file.idx, size);
 		if((p->smb_result = smb_hashfile(path, size, &file.file_idx.hash.data)) > 0) {
 			file.file_idx.hash.flags = p->smb_result;
 			file.hdr.when_written.time = (uint32_t)fdate(path);
diff --git a/src/sbbs3/smbutil.c b/src/sbbs3/smbutil.c
index 797bd078443ef466225ec14544de0f019fab9517..a7f7e0612858e26fcd2110e8ce9647e08db9d2e1 100644
--- a/src/sbbs3/smbutil.c
+++ b/src/sbbs3/smbutil.c
@@ -581,7 +581,7 @@ void dumpindex(ulong start, ulong count)
 		printf("%10"PRIu32"  ", idx.number);
 		switch(smb_msg_type(idx.attr)) {
 			case SMB_MSG_TYPE_FILE:
-				printf("F %10lu  ", (ulong)idx.size);
+				printf("F %10"PRIu64"  ", smb_getfilesize(&idx));
 				break;
 			case SMB_MSG_TYPE_BALLOT:
 				printf("V  %04hX  %-10"PRIu32, idx.votes,idx.remsg);
diff --git a/src/smblib/smbdefs.h b/src/smblib/smbdefs.h
index cd676ec2c40b933216db74e87f767b2c6426eace..9adb5ed8bc8454281e9888db570235fcef9cb7db 100644
--- a/src/smblib/smbdefs.h
+++ b/src/smblib/smbdefs.h
@@ -393,7 +393,7 @@ typedef struct {	/* Index record */
 		};
 		struct {			/* when msg.type == FILE */
 			uint32_t	size;
-			uint16_t	unused;	/* possibly store additional 16-bits of file size here */
+			uint16_t	size_ext; /* store additional 16-bits of file size here */
 		};
 	};
 	smb_msg_attr_t	attr;		/* attributes (read, permanent, etc.) */
diff --git a/src/smblib/smbfile.c b/src/smblib/smbfile.c
index b9ac5c3bddd8bcb838336fd31fd964253ff58920..f23ce9ec437c687ab98da9a68346998e41553d1f 100644
--- a/src/smblib/smbfile.c
+++ b/src/smblib/smbfile.c
@@ -221,6 +221,7 @@ int smb_findfile(smb_t* smb, const char* filename, smbfile_t* file)
 	smbfile_t file_ = {0};
 	if(f == NULL)
 		f = &file_;
+	uint64_t fsize;
 	char fname[SMB_FILEIDX_NAMELEN + 1] = "";
 	if(filename != NULL)
 		smb_fileidxname(filename, fname, sizeof(fname));
@@ -249,8 +250,9 @@ int smb_findfile(smb_t* smb, const char* filename, smbfile_t* file)
 		if(file == NULL)
 			continue;
 
-		if((f->file_idx.hash.flags & SMB_HASH_MASK) != 0 || f->file_idx.idx.size > 0) {
-			if(f->file_idx.idx.size > 0 && f->file_idx.idx.size != fidx.idx.size)
+		fsize = smb_getfilesize(&f->idx);
+		if((f->file_idx.hash.flags & SMB_HASH_MASK) != 0 || fsize > 0) {
+			if(fsize > 0 && fsize != smb_getfilesize(&fidx.idx))
 				continue;
 			if((f->file_idx.hash.flags & SMB_HASH_CRC16) && f->file_idx.hash.data.crc16 != fidx.hash.data.crc16)
 				continue;
@@ -460,3 +462,19 @@ int smb_removefile(smb_t* smb, smbfile_t* file)
 	smb_unlocksmbhdr(smb);
 	return result;
 }
+
+uint64_t smb_getfilesize(idxrec_t* idx)
+{
+	return ((uint64_t)idx->size) | (((uint64_t)idx->size_ext) << 32);
+}
+
+int smb_setfilesize(idxrec_t* idx, uint64_t size)
+{
+	if(size > 0xffffffffffffULL)
+		return SMB_ERR_FILE_LEN;
+
+	idx->size = (uint32_t)size;
+	idx->size_ext = (uint16_t)(size >> 32);
+
+	return SMB_SUCCESS;
+}
diff --git a/src/smblib/smblib.c b/src/smblib/smblib.c
index 7eaa5c9bed88d252765bde37616ddcac297b58b7..ef2771d49305fd9e5fa87710000cbd394fd63aff 100644
--- a/src/smblib/smblib.c
+++ b/src/smblib/smblib.c
@@ -1730,7 +1730,7 @@ int smb_init_idx(smb_t* smb, smbmsg_t* msg)
 		if(msg->name != NULL)
 			smb_fileidxname(msg->name, msg->file_idx.name, sizeof(msg->file_idx.name));
 		if(msg->size > 0)
-			msg->idx.size = (uint32_t)msg->size;
+			smb_setfilesize(&msg->idx, msg->size);
 	} else {
 		msg->idx.subj = smb_subject_crc(msg->subj);
 		if(smb->status.attr & SMB_EMAIL) {
diff --git a/src/smblib/smblib.h b/src/smblib/smblib.h
index eb2f37760a16c2b32bf562882d7c33a190ac1528..95493f7487018d5976f9f82b43695ccf4821129e 100644
--- a/src/smblib/smblib.h
+++ b/src/smblib/smblib.h
@@ -295,6 +295,8 @@ SMBEXPORT int		smb_loadfile(smb_t*, const char* filename, smbfile_t*, enum file_
 SMBEXPORT void		smb_freefilemem(smbfile_t*);
 SMBEXPORT int		smb_removefile(smb_t*, smbfile_t*);
 SMBEXPORT char*		smb_fileidxname(const char* filename, char* buf, size_t);
+SMBEXPORT uint64_t	smb_getfilesize(idxrec_t*);
+SMBEXPORT int		smb_setfilesize(idxrec_t*, uint64_t);
 
 #ifdef __cplusplus
 }