diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters
index 87cf1d5..677c412 100644
--- a/MiSTer.vcxproj.filters
+++ b/MiSTer.vcxproj.filters
@@ -200,7 +200,7 @@
Source Files\support
- Source Files
+ Source Files\support
diff --git a/file_io.cpp b/file_io.cpp
index 16b8c7c..d37fe18 100644
--- a/file_io.cpp
+++ b/file_io.cpp
@@ -548,7 +548,7 @@ int FileSeekLBA(fileTYPE *file, uint32_t offset)
}
// Read with offset advancing
-int FileReadAdv(fileTYPE *file, void *pBuffer, int length)
+int FileReadAdv(fileTYPE *file, void *pBuffer, int length, int failres)
{
ssize_t ret = 0;
@@ -558,7 +558,7 @@ int FileReadAdv(fileTYPE *file, void *pBuffer, int length)
if (ret < 0)
{
printf("FileReadAdv error(%d).\n", ret);
- return 0;
+ return failres;
}
}
else if (file->zip)
@@ -568,14 +568,14 @@ int FileReadAdv(fileTYPE *file, void *pBuffer, int length)
{
printf("FileReadEx(mz_zip_reader_extract_iter_read) Failed to read, error:%s\n",
mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive)));
- return 0;
+ return failres;
}
file->zip->offset += ret;
}
else
{
printf("FileReadAdv error(unknown file type).\n");
- return 0;
+ return failres;
}
file->offset += ret;
diff --git a/file_io.h b/file_io.h
index e0a8b73..900722e 100644
--- a/file_io.h
+++ b/file_io.h
@@ -72,7 +72,7 @@ __off64_t FileGetSize(fileTYPE *file);
int FileSeek(fileTYPE *file, __off64_t offset, int origin);
int FileSeekLBA(fileTYPE *file, uint32_t offset);
-int FileReadAdv(fileTYPE *file, void *pBuffer, int length);
+int FileReadAdv(fileTYPE *file, void *pBuffer, int length, int failres = 0);
int FileReadSec(fileTYPE *file, void *pBuffer);
int FileWriteAdv(fileTYPE *file, void *pBuffer, int length);
int FileWriteSec(fileTYPE *file, void *pBuffer);
diff --git a/support/x86/x86_share.cpp b/support/x86/x86_share.cpp
index 54fd835..f4ffbf4 100644
--- a/support/x86/x86_share.cpp
+++ b/support/x86/x86_share.cpp
@@ -630,6 +630,7 @@ static int process_request(void *reqres_buffer)
* 0000 fail
* 0001 open
* 0010 truncate/open */
+ uint16_t attr = *(uint16_t *)buf;
uint16_t actioncode = *(uint16_t *)(buf + 2);
uint16_t openmode = *(uint16_t *)(buf + 4);
@@ -662,7 +663,9 @@ static int process_request(void *reqres_buffer)
}
else
{
- if ((actioncode & 0xF0) == 0x10)
+ // some copiers create an empty file with hidden attribute and then fail if found non-hidden file
+ // so prohibit to create a hidden file.
+ if ((actioncode & 0xF0) == 0x10 && !(attr & FAT_HID))
{
mode = O_RDWR | O_CREAT;
spopres = 2;
@@ -736,8 +739,8 @@ static int process_request(void *reqres_buffer)
FileSeek(&open_file_handles[key], off, SEEK_SET);
uint16_t sz = buf[6] | (buf[7] << 8);
- int read = FileReadAdv(&open_file_handles[key], buf, sz);
- if (!read)
+ int read = FileReadAdv(&open_file_handles[key], buf, sz, -1);
+ if (read < 0)
{
res = 5;
break;
@@ -764,11 +767,15 @@ static int process_request(void *reqres_buffer)
FileSeek(&open_file_handles[key], off, SEEK_SET);
uint16_t sz = buf[6] | (buf[7] << 8);
- int written = FileWriteAdv(&open_file_handles[key], buf + 8, sz);
- if (!written)
+ int written = 0;
+ if (sz)
{
- res = 5;
- break;
+ written = FileWriteAdv(&open_file_handles[key], buf + 8, sz);
+ if (!written)
+ {
+ res = 5;
+ break;
+ }
}
*buf++ = written;
@@ -908,6 +915,12 @@ static int process_request(void *reqres_buffer)
break;
}
+ if(strchr(path, '?') || strchr(path, '*'))
+ {
+ res = 2;
+ break;
+ }
+
if (!FileDelete(path))
{
res = 2;
@@ -959,12 +972,15 @@ static int process_request(void *reqres_buffer)
*buf++ = 8;
memcpyb(buf, "MiSTer ", 11);
+
buf += 11;
*buf++ = 0; *buf++ = 0; // time;
*buf++ = 0; *buf++ = 0; // date;
*buf++ = 0; *buf++ = 0; *buf++ = 0; *buf++ = 0; // size;
- *(short *)buf = key; buf += 2;
- *(short *)buf = 0; buf += 2;
+ *buf++ = key;
+ *buf++ = key >> 8;
+ *buf++ = 0; *buf++ = 0;
+
res = 0;
reslen = 24;
break;
@@ -974,15 +990,18 @@ static int process_request(void *reqres_buffer)
struct dirent64 de, *de2;
while ((de2 = readdir64(d)))
{
- memcpy(&de, de2, sizeof(dirent64));
- sprintf(str, "%s/%s", path, de.d_name);
- stat64 *st = getPathStat(str);
-
- if (st && cmp_name(de.d_name, flt))
+ if (de2->d_type == DT_REG || (attr & FAT_DIR))
{
- name83(de2->d_name, de.d_name);
- de.d_name[11] = 0;
- locks[key].dir_items.push_back({ de, *st });
+ memcpy(&de, de2, sizeof(dirent64));
+ sprintf(str, "%s/%s", path, de.d_name);
+ stat64 *st = getPathStat(str);
+
+ if (st && cmp_name(de.d_name, flt))
+ {
+ name83(de2->d_name, de.d_name);
+ de.d_name[11] = 0;
+ locks[key].dir_items.push_back({ de, *st });
+ }
}
}
closedir(d);
@@ -1032,8 +1051,10 @@ static int process_request(void *reqres_buffer)
memcpyb(buf, &locks[key].dir_items[idx].st.st_size, 4);
buf += 4;
- *(short *)buf = key; buf += 2;
- *(short *)buf = idx; buf += 2;
+ *buf++ = key;
+ *buf++ = key >> 8;
+ *buf++ = idx;
+ *buf++ = idx >> 8;
res = 0;
reslen = 24;