Просмотр исходного кода

fix: 内存文件系统需要兼容r+和rb+,且读取数据有越界风险

Wendal Chen 2 лет назад
Родитель
Сommit
83fc1c631e
1 измененных файлов с 5 добавлено и 2 удалено
  1. 5 2
      luat/vfs/luat_fs_mem.c

+ 5 - 2
luat/vfs/luat_fs_mem.c

@@ -49,7 +49,7 @@ FILE* luat_vfs_ram_fopen(void* userdata, const char *filename, const char *mode)
         return NULL;
     }
     // 写文件
-    if (!strcmp("w", mode) || !strcmp("wb", mode) || !strcmp("w+", mode) || !strcmp("wb+", mode) ) {
+    if (!strcmp("w", mode) || !strcmp("wb", mode) || !strcmp("w+", mode) || !strcmp("wb+", mode) || !strcmp("r+", mode) || !strcmp("rb+", mode)) {
         // 先看看是否存在, 如果存在就重用老的
         for (size_t i = 0; i < RAM_FILE_MAX; i++)
         {
@@ -179,7 +179,10 @@ size_t luat_vfs_ram_fread(void* userdata, void *ptr, size_t size, size_t nmemb,
     //LLOGD("fread %p %p %d %d", userdata, stream, fd->size, fd->offset);
     //LLOGD("fread2 %p %p %d %d", userdata, stream, size * nmemb, fd->offset);
     size_t read_size = size*nmemb;
-    if (fd->offset + read_size > fd->file->size) {
+    if (fd->offset >= fd->file->size) {
+        return 0;
+    }
+    if (fd->offset + read_size >= fd->file->size) {
         read_size = fd->file->size - fd->offset;
     }
     memcpy(ptr, fd->file->ptr + fd->offset, read_size);