@@ -85,9 +85,9 @@ protected VirtualFileSystem delegate() {
8585 return _inner ;
8686 }
8787
88- private boolean canAccess (Inode inode , int mode ) {
88+ private boolean canAccess (Inode inode , Stat stat , int mode ) {
8989 try {
90- checkAccess (inode , mode , false );
90+ checkAccess (inode , stat , mode , false );
9191 return true ;
9292 } catch (IOException e ) {
9393 }
@@ -102,38 +102,39 @@ public int access(Inode inode, int mode) throws IOException {
102102 throw new InvalException ("invalid access mask" );
103103 }
104104
105+ Stat stat = _inner .getattr (inode );
105106 if ((mode & ACCESS4_READ ) != 0 ) {
106- if (canAccess (inode , ACE4_READ_DATA )) {
107+ if (canAccess (inode , stat , ACE4_READ_DATA )) {
107108 accessmask |= ACCESS4_READ ;
108109 }
109110 }
110111
111112 if ((mode & ACCESS4_LOOKUP ) != 0 ) {
112- if (canAccess (inode , ACE4_EXECUTE )) {
113+ if (canAccess (inode , stat , ACE4_EXECUTE )) {
113114 accessmask |= ACCESS4_LOOKUP ;
114115 }
115116 }
116117
117118 if ((mode & ACCESS4_MODIFY ) != 0 ) {
118- if (canAccess (inode , ACE4_WRITE_DATA )) {
119+ if (canAccess (inode , stat , ACE4_WRITE_DATA )) {
119120 accessmask |= ACCESS4_MODIFY ;
120121 }
121122 }
122123
123124 if ((mode & ACCESS4_EXECUTE ) != 0 ) {
124- if (canAccess (inode , ACE4_EXECUTE )) {
125+ if (canAccess (inode , stat , ACE4_EXECUTE )) {
125126 accessmask |= ACCESS4_EXECUTE ;
126127 }
127128 }
128129
129130 if ((mode & ACCESS4_EXTEND ) != 0 ) {
130- if (canAccess (inode , ACE4_APPEND_DATA )) {
131+ if (canAccess (inode , stat , ACE4_APPEND_DATA )) {
131132 accessmask |= ACCESS4_EXTEND ;
132133 }
133134 }
134135
135136 if ((mode & ACCESS4_DELETE ) != 0 ) {
136- if (canAccess (inode , ACE4_DELETE_CHILD )) {
137+ if (canAccess (inode , stat , ACE4_DELETE_CHILD )) {
137138 accessmask |= ACCESS4_DELETE ;
138139 }
139140 }
@@ -146,19 +147,19 @@ public int access(Inode inode, int mode) throws IOException {
146147 */
147148
148149 if ((mode & ACCESS4_XAREAD ) != 0 ) {
149- if (canAccess (inode , ACE4_READ_DATA )) {
150+ if (canAccess (inode , stat , ACE4_READ_DATA )) {
150151 accessmask |= ACCESS4_XAREAD ;
151152 }
152153 }
153154
154155 if ((mode & ACCESS4_XALIST ) != 0 ) {
155- if (canAccess (inode , ACE4_READ_DATA )) {
156+ if (canAccess (inode , stat , ACE4_READ_DATA )) {
156157 accessmask |= ACCESS4_XALIST ;
157158 }
158159 }
159160
160161 if ((mode & ACCESS4_XAWRITE ) != 0 ) {
161- if (canAccess (inode , ACE4_WRITE_DATA )) {
162+ if (canAccess (inode , stat , ACE4_WRITE_DATA )) {
162163 accessmask |= ACCESS4_XAWRITE ;
163164 }
164165 }
@@ -393,6 +394,10 @@ private Subject checkAccess(Inode inode, int requestedMask) throws IOException {
393394 }
394395
395396 private Subject checkAccess (Inode inode , int requestedMask , boolean shouldLog ) throws IOException {
397+ return checkAccess (inode , _inner .getattr (inode ), requestedMask , shouldLog );
398+ }
399+
400+ private Subject checkAccess (Inode inode , Stat stat , int requestedMask , boolean shouldLog ) throws IOException {
396401
397402 Subject effectiveSubject = _subject ;
398403 Access aclMatched = Access .UNDEFINED ;
@@ -453,7 +458,6 @@ private Subject checkAccess(Inode inode, int requestedMask, boolean shouldLog) t
453458 * always allows it.
454459 */
455460 if ((aclMatched == Access .UNDEFINED ) && (requestedMask != ACE4_READ_ATTRIBUTES )) {
456- Stat stat = _inner .getattr (inode );
457461 int unixAccessmask = unixToAccessmask (effectiveSubject , stat );
458462 if ((unixAccessmask & requestedMask ) != requestedMask ) {
459463 if (shouldLog ) {
0 commit comments