Skip to content

Commit

Permalink
Adds an intermediate stage in closing an fd. (#441)
Browse files Browse the repository at this point in the history
* Adds an intermediate stage in closing an fd.

Adds a new bit to mark an fd being in shutdown. This is a state
during close that marks the fd as being bad, with all kernel calls
(from other threads) returning EBADF if they refer to this fd.
At the same time the fd is not marked as free for reuse by another
open.

This fixes the race condition in
#440

* Fix bug when dev->close returns an error.
  • Loading branch information
balazsracz authored Oct 8, 2020
1 parent 83a76c3 commit abba7dd
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/freertos_drivers/common/Device.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,11 @@ int Device::close(struct _reent *reent, int fd)
// stdin, stdout, and stderr never get closed
return 0;
}
files[fd].inshdn = true;
int result = f->dev->close(f);
if (result < 0)
{
files[fd].inshdn = false;
errno = -result;
return -1;
}
Expand Down
1 change: 1 addition & 0 deletions src/freertos_drivers/common/Devtab.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ struct File
off_t offset; /**< current offset within file */
int flags; /**< open flags */
uint8_t inuse : 1; /**< true if this is an open fd. */
uint8_t inshdn : 1; /**< true if this fd is in shutdown. */
uint8_t device : 1; /**< true if this is a device, false if file system */
uint8_t dir : 1; /**< true if this is a directory, else false */
uint8_t dirty : 1; /**< true if this file is dirty and needs flush */
Expand Down
3 changes: 2 additions & 1 deletion src/freertos_drivers/common/Fileio.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ int FileIO::fd_alloc(void)
if (files[i].inuse == false)
{
files[i].inuse = true;
files[i].inshdn = false;
files[i].device = true;
files[i].dir = false;
files[i].dirty = false;
Expand Down Expand Up @@ -85,7 +86,7 @@ File* FileIO::file_lookup(int fd)
errno = EBADF;
return nullptr;
}
if (files[fd].inuse == 0)
if (files[fd].inuse == 0 || files[fd].inshdn == 1)
{
errno = EBADF;
return nullptr;
Expand Down

0 comments on commit abba7dd

Please sign in to comment.