On Fri, Oct 26, 2018 at 02:53:48PM +0200, Sebastien Marie wrote:
> Hi,
>
> On IRC, someone reported problem with tcpdump whereas /etc was readonly.
> I will not comment on this unsupported configuration, but instead
> looking at unveil(2) itself as it is the root cause of this particular
> problem.
>
> The problem was reported on 6.4, and my tests are done on -current
> (where the problem is still exposed).
>
> It seems unveil(2) doesn't work (generate errno EROFS) on if the path is
> on a readonly filesystem.
>
> [...]
>
> I didn't expect unveil(2) to error out if the partition is readonly.
>
> Reading code source, I see we already have code for managing exceptions
> like that. so I assume a different code path.
>
The following diff corrects my testcase.
Index: kern/vfs_lookup.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_lookup.c,v
retrieving revision 1.74
diff -u -p -r1.74 vfs_lookup.c
--- kern/vfs_lookup.c 13 Aug 2018 23:11:44 -0000 1.74
+++ kern/vfs_lookup.c 26 Oct 2018 15:53:14 -0000
@@ -549,7 +549,8 @@ dirloop:
* Allow for unveiling of a file in a directory
* where we don't have access to create it ourselves
*/
- if (ndp->ni_pledge == PLEDGE_UNVEIL && error == EACCES)
+ if (ndp->ni_pledge == PLEDGE_UNVEIL &&
+ (error == EACCES || error == EROFS))
error = EJUSTRETURN;
if (error != EJUSTRETURN)
At this specific place, we check the result of VOP_LOOKUP(9).
For now, I didn't check deeper in ufs_lookup() for the exact source of
EROFS. I will try to look that.
thanks.
--
Sebastien Marie