bug#79072: install -d onto readonly fs prints the wrong error

Collin Funk <[email protected]>
Newsgroups gmane.comp.gnu.core-utils.bugs
Message-ID <[email protected]>
Hi Lauri,

Lauri Tirkkonen via GNU coreutils Bug Reports <[email protected]>
writes:

> saw this on coreutils 9.7 on Alpine Linux, but it also reproduces on
> commit 027855dcad52d718927c3405bc7d605143e2a625.
>
> 	# mount -t tmpfs -o ro none /mnt
> 	# ./src/ginstall -d /mnt/foo
> 	ginstall: cannot change permissions of ‘/mnt/foo’: No such file or directory
>
> I would expect the error to be EROFS for creating the directory, not
> changing permissions of the directory that was not able to be created.
> strace confirms mkdir() returns EROFS, but install tries to open() and
> stat() the not-created directory afterward.

Thanks for the report.

It looks like the Gnulib mkdir-p module does not fail when 'mkdir' fails
with EROFS. And it looks like it has always behaved this way.

Paul, you are certainly more familiar with gnulib's mkdir-p and savewd
modules than I am. Can you check that the attached patch is correct
before I commit it?

Here is the new error based on Lauri's example:

    $ ./src/ginstall -d /mnt/foo
    ginstall: cannot create directory ‘/mnt/foo’: Read-only file system

Thanks,
Collin
0001-mkdir-p-Diagnose-read-only-file-systems.patch (text/x-patch, 1.6 KB)
From 822da07feb7862acbade9cb9aa5a9f5fa9cc6458 Mon Sep 17 00:00:00 2001
Message-ID: <822da07feb7862acbade9cb9aa5a9f5fa9cc6458.1753164543.git.collin.funk1@gmail.com>
From: Collin Funk <[email protected]>
Date: Mon, 21 Jul 2025 23:02:55 -0700
Subject: [PATCH] mkdir-p: Diagnose read-only file systems.

* lib/mkdir-p.c (make_dir_parents): Check for 'mkdir' failing on a
read-only file system.
---
 ChangeLog     | 4 ++++
 lib/mkdir-p.c | 4 ++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 99ca126183..3948326827 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2025-07-21  Collin Funk  <[email protected]>
 
+	mkdir-p: Diagnose read-only file systems.
+	* lib/mkdir-p.c (make_dir_parents): Check for 'mkdir' failing on a
+	read-only file system.
+
 	sys_un-h: Make sure that the 'sys' subdirectory is created.
 	* modules/sys_un-h (Makefile.am): Make the 'sys' subdirectory. Remove
 	@NMD@ that is not applicable to subdirectories.
diff --git a/lib/mkdir-p.c b/lib/mkdir-p.c
index f5df9843e4..fc83434655 100644
--- a/lib/mkdir-p.c
+++ b/lib/mkdir-p.c
@@ -182,8 +182,8 @@ make_dir_parents (char *dir,
                     return true;
 
                   if (mkdir_errno == 0
-                      || (mkdir_errno != ENOENT && make_ancestor
-                          && errno != ENOTDIR))
+                      || (mkdir_errno != ENOENT && mkdir_errno != EROFS
+                          && make_ancestor && errno != ENOTDIR))
                     {
                       error (0, errno,
                              _(keep_owner
-- 
2.50.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.