mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Merge pull request #443 from NoahGorny/add-already-opened-assert
Assert that the file isnt open in lfs_file_opencfg
This commit is contained in:
		
							
								
								
									
										60
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -415,6 +415,31 @@ static inline void lfs_superblock_tole32(lfs_superblock_t *superblock) { | |||||||
|     superblock->attr_max    = lfs_tole32(superblock->attr_max); |     superblock->attr_max    = lfs_tole32(superblock->attr_max); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static inline bool lfs_mlist_isopen(struct lfs_mlist *head, | ||||||
|  |         struct lfs_mlist *node) { | ||||||
|  |     for (struct lfs_mlist **p = &head; *p; p = &(*p)->next) { | ||||||
|  |         if (*p == (struct lfs_mlist*)node) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline void lfs_mlist_remove(lfs_t *lfs, struct lfs_mlist *mlist) { | ||||||
|  |     for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { | ||||||
|  |         if (*p == mlist) { | ||||||
|  |             *p = (*p)->next; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static inline void lfs_mlist_append(lfs_t *lfs, struct lfs_mlist *mlist) { | ||||||
|  |     mlist->next = lfs->mlist; | ||||||
|  |     lfs->mlist = mlist; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /// Internal operations predeclared here /// | /// Internal operations predeclared here /// | ||||||
| static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, | static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, | ||||||
| @@ -2022,6 +2047,8 @@ int lfs_mkdir(lfs_t *lfs, const char *path) { | |||||||
|  |  | ||||||
| int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { | int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { | ||||||
|     LFS_TRACE("lfs_dir_open(%p, %p, \"%s\")", (void*)lfs, (void*)dir, path); |     LFS_TRACE("lfs_dir_open(%p, %p, \"%s\")", (void*)lfs, (void*)dir, path); | ||||||
|  |     LFS_ASSERT(!lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)dir)); | ||||||
|  |  | ||||||
|     lfs_stag_t tag = lfs_dir_find(lfs, &dir->m, &path, NULL); |     lfs_stag_t tag = lfs_dir_find(lfs, &dir->m, &path, NULL); | ||||||
|     if (tag < 0) { |     if (tag < 0) { | ||||||
|         LFS_TRACE("lfs_dir_open -> %"PRId32, tag); |         LFS_TRACE("lfs_dir_open -> %"PRId32, tag); | ||||||
| @@ -2064,8 +2091,7 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { | |||||||
|  |  | ||||||
|     // add to list of mdirs |     // add to list of mdirs | ||||||
|     dir->type = LFS_TYPE_DIR; |     dir->type = LFS_TYPE_DIR; | ||||||
|     dir->next = (lfs_dir_t*)lfs->mlist; |     lfs_mlist_append(lfs, (struct lfs_mlist *)dir); | ||||||
|     lfs->mlist = (struct lfs_mlist*)dir; |  | ||||||
|  |  | ||||||
|     LFS_TRACE("lfs_dir_open -> %d", 0); |     LFS_TRACE("lfs_dir_open -> %d", 0); | ||||||
|     return 0; |     return 0; | ||||||
| @@ -2074,12 +2100,7 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { | |||||||
| int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir) { | int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir) { | ||||||
|     LFS_TRACE("lfs_dir_close(%p, %p)", (void*)lfs, (void*)dir); |     LFS_TRACE("lfs_dir_close(%p, %p)", (void*)lfs, (void*)dir); | ||||||
|     // remove from list of mdirs |     // remove from list of mdirs | ||||||
|     for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { |     lfs_mlist_remove(lfs, (struct lfs_mlist *)dir); | ||||||
|         if (*p == (struct lfs_mlist*)dir) { |  | ||||||
|             *p = (*p)->next; |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     LFS_TRACE("lfs_dir_close -> %d", 0); |     LFS_TRACE("lfs_dir_close -> %d", 0); | ||||||
|     return 0; |     return 0; | ||||||
| @@ -2402,9 +2423,10 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, | |||||||
|                  ".buffer=%p, .attrs=%p, .attr_count=%"PRIu32"})", |                  ".buffer=%p, .attrs=%p, .attr_count=%"PRIu32"})", | ||||||
|             (void*)lfs, (void*)file, path, flags, |             (void*)lfs, (void*)file, path, flags, | ||||||
|             (void*)cfg, cfg->buffer, (void*)cfg->attrs, cfg->attr_count); |             (void*)cfg, cfg->buffer, (void*)cfg->attrs, cfg->attr_count); | ||||||
|  |     LFS_ASSERT(!lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file)); | ||||||
|  |  | ||||||
|     // deorphan if we haven't yet, needed at most once after poweron |     // deorphan if we haven't yet, needed at most once after poweron | ||||||
|     if ((flags & 3) != LFS_O_RDONLY) { |     if ((flags & LFS_O_RDWR) != LFS_O_RDONLY) { | ||||||
|         int err = lfs_fs_forceconsistency(lfs); |         int err = lfs_fs_forceconsistency(lfs); | ||||||
|         if (err) { |         if (err) { | ||||||
|             LFS_TRACE("lfs_file_opencfg -> %d", err); |             LFS_TRACE("lfs_file_opencfg -> %d", err); | ||||||
| @@ -2429,8 +2451,7 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, | |||||||
|  |  | ||||||
|     // get id, add to list of mdirs to catch update changes |     // get id, add to list of mdirs to catch update changes | ||||||
|     file->type = LFS_TYPE_REG; |     file->type = LFS_TYPE_REG; | ||||||
|     file->next = (lfs_file_t*)lfs->mlist; |     lfs_mlist_append(lfs, (struct lfs_mlist *)file); | ||||||
|     lfs->mlist = (struct lfs_mlist*)file; |  | ||||||
|  |  | ||||||
|     if (tag == LFS_ERR_NOENT) { |     if (tag == LFS_ERR_NOENT) { | ||||||
|         if (!(flags & LFS_O_CREAT)) { |         if (!(flags & LFS_O_CREAT)) { | ||||||
| @@ -2479,7 +2500,7 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, | |||||||
|  |  | ||||||
|     // fetch attrs |     // fetch attrs | ||||||
|     for (unsigned i = 0; i < file->cfg->attr_count; i++) { |     for (unsigned i = 0; i < file->cfg->attr_count; i++) { | ||||||
|         if ((file->flags & 3) != LFS_O_WRONLY) { |         if ((file->flags & LFS_O_RDWR) != LFS_O_WRONLY) { | ||||||
|             lfs_stag_t res = lfs_dir_get(lfs, &file->m, |             lfs_stag_t res = lfs_dir_get(lfs, &file->m, | ||||||
|                     LFS_MKTAG(0x7ff, 0x3ff, 0), |                     LFS_MKTAG(0x7ff, 0x3ff, 0), | ||||||
|                     LFS_MKTAG(LFS_TYPE_USERATTR + file->cfg->attrs[i].type, |                     LFS_MKTAG(LFS_TYPE_USERATTR + file->cfg->attrs[i].type, | ||||||
| @@ -2491,7 +2512,7 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if ((file->flags & 3) != LFS_O_RDONLY) { |         if ((file->flags & LFS_O_RDWR) != LFS_O_RDONLY) { | ||||||
|             if (file->cfg->attrs[i].size > lfs->attr_max) { |             if (file->cfg->attrs[i].size > lfs->attr_max) { | ||||||
|                 err = LFS_ERR_NOSPC; |                 err = LFS_ERR_NOSPC; | ||||||
|                 goto cleanup; |                 goto cleanup; | ||||||
| @@ -2566,12 +2587,7 @@ int lfs_file_close(lfs_t *lfs, lfs_file_t *file) { | |||||||
|     int err = lfs_file_sync(lfs, file); |     int err = lfs_file_sync(lfs, file); | ||||||
|  |  | ||||||
|     // remove from list of mdirs |     // remove from list of mdirs | ||||||
|     for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { |     lfs_mlist_remove(lfs, (struct lfs_mlist*)file); | ||||||
|         if (*p == (struct lfs_mlist*)file) { |  | ||||||
|             *p = (*p)->next; |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // clean up memory |     // clean up memory | ||||||
|     if (!file->cfg->buffer) { |     if (!file->cfg->buffer) { | ||||||
| @@ -2808,7 +2824,7 @@ lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, | |||||||
|     LFS_TRACE("lfs_file_read(%p, %p, %p, %"PRIu32")", |     LFS_TRACE("lfs_file_read(%p, %p, %p, %"PRIu32")", | ||||||
|             (void*)lfs, (void*)file, buffer, size); |             (void*)lfs, (void*)file, buffer, size); | ||||||
|     LFS_ASSERT(file->flags & LFS_F_OPENED); |     LFS_ASSERT(file->flags & LFS_F_OPENED); | ||||||
|     LFS_ASSERT((file->flags & 3) != LFS_O_WRONLY); |     LFS_ASSERT((file->flags & LFS_O_RDWR) != LFS_O_WRONLY); | ||||||
|  |  | ||||||
|     uint8_t *data = buffer; |     uint8_t *data = buffer; | ||||||
|     lfs_size_t nsize = size; |     lfs_size_t nsize = size; | ||||||
| @@ -2888,7 +2904,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, | |||||||
|     LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")", |     LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")", | ||||||
|             (void*)lfs, (void*)file, buffer, size); |             (void*)lfs, (void*)file, buffer, size); | ||||||
|     LFS_ASSERT(file->flags & LFS_F_OPENED); |     LFS_ASSERT(file->flags & LFS_F_OPENED); | ||||||
|     LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY); |     LFS_ASSERT((file->flags & LFS_O_RDWR) != LFS_O_RDONLY); | ||||||
|  |  | ||||||
|     const uint8_t *data = buffer; |     const uint8_t *data = buffer; | ||||||
|     lfs_size_t nsize = size; |     lfs_size_t nsize = size; | ||||||
| @@ -3053,7 +3069,7 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { | |||||||
|     LFS_TRACE("lfs_file_truncate(%p, %p, %"PRIu32")", |     LFS_TRACE("lfs_file_truncate(%p, %p, %"PRIu32")", | ||||||
|             (void*)lfs, (void*)file, size); |             (void*)lfs, (void*)file, size); | ||||||
|     LFS_ASSERT(file->flags & LFS_F_OPENED); |     LFS_ASSERT(file->flags & LFS_F_OPENED); | ||||||
|     LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY); |     LFS_ASSERT((file->flags & LFS_O_RDWR) != LFS_O_RDONLY); | ||||||
|  |  | ||||||
|     if (size > LFS_FILE_MAX) { |     if (size > LFS_FILE_MAX) { | ||||||
|         LFS_TRACE("lfs_file_truncate -> %d", LFS_ERR_INVAL); |         LFS_TRACE("lfs_file_truncate -> %d", LFS_ERR_INVAL); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user