diff options
author | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-03-31 15:13:12 +0000 |
---|---|---|
committer | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-03-31 15:13:12 +0000 |
commit | b277d5c19326b572c19c77ceb13ad73dbe213c23 (patch) | |
tree | 98e0f474d93010b7655ad4b7528df65b3874537f /nuttx | |
parent | 8f17baae37707f163ce7bbe7772d060efe11a858 (diff) | |
download | px4-firmware-b277d5c19326b572c19c77ceb13ad73dbe213c23.tar.gz px4-firmware-b277d5c19326b572c19c77ceb13ad73dbe213c23.tar.bz2 px4-firmware-b277d5c19326b572c19c77ceb13ad73dbe213c23.zip |
Fix read() return value for the case of permissions problem
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4545 7fd9a85b-ad96-42d3-883c-3090e2eb8679
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/fs/fs_read.c | 44 | ||||
-rw-r--r-- | nuttx/sched/sched_setupidlefiles.c | 2 |
2 files changed, 25 insertions, 21 deletions
diff --git a/nuttx/fs/fs_read.c b/nuttx/fs/fs_read.c index 8afa65637..045c81f59 100644 --- a/nuttx/fs/fs_read.c +++ b/nuttx/fs/fs_read.c @@ -1,8 +1,8 @@ /**************************************************************************** * fs_read.c * - * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * Copyright (C) 2007-2009, 2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -63,35 +63,39 @@ static inline ssize_t file_read(int fd, FAR void *buf, size_t nbytes) list = sched_getfiles(); if (!list) { - errno = EMFILE; - return ERROR; + /* Failed to get the file list */ + + ret = -EMFILE; } /* Were we given a valid file descriptor? */ - if ((unsigned int)fd < CONFIG_NFILE_DESCRIPTORS) + else if ((unsigned int)fd < CONFIG_NFILE_DESCRIPTORS) { FAR struct file *this_file = &list->fl_files[fd]; + FAR struct inode *inode = this_file->f_inode; - /* Was this file opened for read access? */ + /* Yes.. Was this file opened for read access? */ - if ((this_file->f_oflags & O_RDOK) != 0) + if ((this_file->f_oflags & O_RDOK) == 0) { - struct inode *inode = this_file->f_inode; + /* No.. File is not read-able */ - /* Is a driver or mountpoint registered? If so, does it support - * the read method? - */ + ret = -EACCES; + } - if (inode && inode->u.i_ops && inode->u.i_ops->read) - { - /* Yes, then let it perform the read. NOTE that for the case - * of the mountpoint, we depend on the read methods bing - * identical in signature and position in the operations vtable. - */ + /* Is a driver or mountpoint registered? If so, does it support + * the read method? + */ + + else if (inode && inode->u.i_ops && inode->u.i_ops->read) + { + /* Yes.. then let it perform the read. NOTE that for the case + * of the mountpoint, we depend on the read methods bing + * identical in signature and position in the operations vtable. + */ - ret = (int)inode->u.i_ops->read(this_file, (char*)buf, (size_t)nbytes); - } + ret = (int)inode->u.i_ops->read(this_file, (char*)buf, (size_t)nbytes); } } @@ -99,7 +103,7 @@ static inline ssize_t file_read(int fd, FAR void *buf, size_t nbytes) if (ret < 0) { - errno = -ret; + set_errno(-ret); return ERROR; } diff --git a/nuttx/sched/sched_setupidlefiles.c b/nuttx/sched/sched_setupidlefiles.c index 7b2839685..f2bfb78d2 100644 --- a/nuttx/sched/sched_setupidlefiles.c +++ b/nuttx/sched/sched_setupidlefiles.c @@ -123,7 +123,7 @@ int sched_setupidlefiles(FAR _TCB *tcb) * it and got some file descriptor other than 0. */ - if (fd >- 0) + if (fd > 0) { slldbg("Open /dev/console fd: %d\n", fd); (void)close(fd); |