nodejs / nodejs/node

fs.access throws permission error while checking W_OK on writable dir

未关闭
#28,656 7 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

fs
主要语言
JavaScript
星标
122k
派生
37.3k
平均合并
4 天 2 小时
30 天内合并 PR
283

描述

  • Version: v10.16.0 (also happening on v12.6.0)
  • Platform: 18.6.0 Darwin Kernel Version 18.6.0 (also happening on 4.15.0-54-generic Ubuntu)
  • Subsystem: fs

I'm experiencing a rather unexpected behaviour when trying fs.access on a directory that's also an NFS shared mount point. The check for fs.constants.W_OK throws Error: EACCES: permission denied, access '/mnt/test/nfs' even though the directory is writable and permissions seem to be correct for the user running the node script process.

Below is a reproduction of what I'm seeing.

const os = require('os');
const path = require('path');
const fs = require('fs');

// Path to the mount directory
const MOUNT_PATH = '/mnt/test/nfs';

const filePath = path.join(MOUNT_PATH, 'foo.txt');

// Write a file
fs.writeFileSync(filePath, 'Hello world!'); // Passes OK

// Read a file
const contents = fs.readFileSync(filePath); // Passes OK
console.log(contents.toString('utf-8')); // 'Hello World!'

// Get stats
os.userInfo();
/*
{
  uid: 431,
  gid: 433,
  username: 'test',
  homedir: '/home/test',
  shell: '/sbin/nologin'
}
*/

fs.stat(MOUNT_PATH, console.log);
/*
> null Stats {
  dev: 52,
  mode: 16895, <- '0777' octal
  nlink: 1,
  uid: 431, <- Correct uid
  gid: 433, <- Correct gid
  rdev: 0,
  blksize: 4096,
  ino: 263,
  size: 184,
  blocks: 0,
  atimeMs: 1562948571578.2288,
  mtimeMs: 1562897414354.1873,
  ctimeMs: 1562897414354.1873,
  birthtimeMs: 0,
  atime: 2019-07-12T16:22:51.578Z,
  mtime: 2019-07-12T02:10:14.354Z,
  ctime: 2019-07-12T02:10:14.354Z,
  birthtime: 1970-01-01T00:00:00.000Z
}
*/


// Test permissions
fs.access(MOUNT_PATH, fs.constants.R_OK, console.error); // Passes OK
fs.access(MOUNT_PATH, fs.constants.W_OK, console.error); 
/* 
 [Error: EACCES: permission denied, access '/mnt/test/nfs'] {
  errno: -13,
  code: 'EACCES',
  syscall: 'access',
  path: '/mnt/test/nfs'
*/

This does not happen on any other directory outside the NFS share. I stumbled upon the exception when writing a very simple health checker script to test the mount availability for a running web service.

Am I missing something? What's the catch here? Thanks in advance.

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先在报告的 NFS 挂载上使用 fs.access(MOUNT_PATH, fs.constants.W_OK) 进行复现,并将其与 fs.writeFileSync、fs.readFileSync、fs.stat 和 R_OK 检查进行比较。确定不同的结果是预期的 NFS 行为,还是 Node.js 处理 fs.access 时存在问题;完成标准是记录原因,或确定一项有针对性的 runtime 更改及其验证方式。

由索引模型根据 Issue 内容生成。

评估

技术栈
javascript, node.js
领域
operating-systems
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
冷清
描述清晰度
需要澄清
新手友好度
38/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。