nodejs / nodejs/node

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

Ouverte
#28,656 7 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

fs
Langage dominant
JavaScript
Étoiles
122k
Forks
37.4k
Merge moyen
4 j 3 h
PR mergées (30 j)
272

Description

  • 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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire le problème en utilisant fs.access(MOUNT_PATH, fs.constants.W_OK) sur le montage NFS signalé, en le comparant à fs.writeFileSync, fs.readFileSync, fs.stat et à la vérification R_OK. Déterminez si le résultat différent est un comportement NFS attendu ou un problème dans la gestion de fs.access par Node.js ; le travail est terminé lorsque la cause est documentée ou qu’une modification ciblée du runtime et sa validation sont identifiées.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, node.js
Domaine
operating-systems
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
À clarifier
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.