Skip to content

Commit

Permalink
Revert "fdtable: read, write, close: only execute methods if non-NULL"
Browse files Browse the repository at this point in the history
This reverts commit a9a909c.

PR #73978 introduced a regression.
Unfortunately this PR cannot be reverted without reverting also
Let's revert both PRs to stabilize main again towards the 3.7 release.

For more details on the issue see
zephyrproject-rtos/zephyr#75205

(cherry picked from commit 846556f)

Original-Signed-off-by: Alberto Escolar Piedras <alberto.escolar.piedras@nordicsemi.no>
GitOrigin-RevId: 846556f
Change-Id: I6589633d3c009e1ecb5fa3f3264fff054c655fad
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/zephyr/+/5678584
Tested-by: ChromeOS Prod (Robot) <chromeos-ci-prod@chromeos-bot.iam.gserviceaccount.com>
Reviewed-by: Fabio Baltieri <fabiobaltieri@google.com>
Commit-Queue: Fabio Baltieri <fabiobaltieri@google.com>
  • Loading branch information
aescolar authored and Chromeos LUCI committed Jul 5, 2024
1 parent 9fc8970 commit 62ce56b
Showing 1 changed file with 39 additions and 33 deletions.
72 changes: 39 additions & 33 deletions lib/os/fdtable.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ int zvfs_alloc_fd(void *obj, const struct fd_op_vtable *vtable)
return fd;
}

static ssize_t zvfs_rw(int fd, void *buf, size_t sz, bool is_write)
ssize_t zvfs_read(int fd, void *buf, size_t sz)
{
ssize_t res;

Expand All @@ -310,57 +310,63 @@ static ssize_t zvfs_rw(int fd, void *buf, size_t sz, bool is_write)
}

(void)k_mutex_lock(&fdtable[fd].lock, K_FOREVER);

if (is_write) {
if (fdtable[fd].vtable->write_offset == NULL) {
res = -1;
errno = EIO;
} else {
res = fdtable[fd].vtable->write_offset(fdtable[fd].obj, buf, sz,
fdtable[fd].offset);
}
} else {
if (fdtable[fd].vtable->read == NULL) {
res = -1;
errno = EIO;
} else {
res = fdtable[fd].vtable->read_offset(fdtable[fd].obj, buf, sz,
fdtable[fd].offset);
}
}
res = fdtable[fd].vtable->read_offs(fdtable[fd].obj, buf, sz, fdtable[fd].offset);
if (res > 0) {
fdtable[fd].offset += res;
switch (fdtable[fd].mode & ZVFS_MODE_IFMT) {
case ZVFS_MODE_IFDIR:
case ZVFS_MODE_IFBLK:
case ZVFS_MODE_IFSHM:
case ZVFS_MODE_IFREG:
fdtable[fd].offset += res;
break;
default:
break;
}
}

unlock:
k_mutex_unlock(&fdtable[fd].lock);

return res;
}

ssize_t zvfs_read(int fd, void *buf, size_t sz)
{
return zvfs_rw(fd, buf, sz, false);
}

ssize_t zvfs_write(int fd, const void *buf, size_t sz)
{
return zvfs_rw(fd, (void *)buf, sz, true);
ssize_t res;

if (_check_fd(fd) < 0) {
return -1;
}

(void)k_mutex_lock(&fdtable[fd].lock, K_FOREVER);
res = fdtable[fd].vtable->write_offs(fdtable[fd].obj, buf, sz, fdtable[fd].offset);
if (res > 0) {
switch (fdtable[fd].mode & ZVFS_MODE_IFMT) {
case ZVFS_MODE_IFDIR:
case ZVFS_MODE_IFBLK:
case ZVFS_MODE_IFSHM:
case ZVFS_MODE_IFREG:
fdtable[fd].offset += res;
break;
default:
break;
}
}
k_mutex_unlock(&fdtable[fd].lock);

return res;
}

int zvfs_close(int fd)
{
int res = 0;
int res;

if (_check_fd(fd) < 0) {
return -1;
}

(void)k_mutex_lock(&fdtable[fd].lock, K_FOREVER);
if (fdtable[fd].vtable->close != NULL) {
/* close() is optional - e.g. stdinout_fd_op_vtable */
res = fdtable[fd].vtable->close(fdtable[fd].obj);
}

res = fdtable[fd].vtable->close(fdtable[fd].obj);

k_mutex_unlock(&fdtable[fd].lock);

zvfs_free_fd(fd);
Expand Down

0 comments on commit 62ce56b

Please sign in to comment.