Hi Corinna,

Corinna Vinschen wrote:
On Feb 27 13:18, Christian Franke wrote:
...

diff --git a/winsup/cygwin/errno.cc b/winsup/cygwin/errno.cc
index 7d58e62ec..d8c057e51 100644
--- a/winsup/cygwin/errno.cc
+++ b/winsup/cygwin/errno.cc
@@ -167,8 +167,8 @@ const char *_sys_errlist[] =
  /* ESTALE 133 */        "Stale NFS file handle",
  /* ENOTSUP 134 */       "Not supported",
  /* ENOMEDIUM 135 */     "No medium found",
-/* ENOSHARE 136 */       "No such host or network path",
-/* ECASECLASH 137 */     "Filename exists with different case",
+                         NULL, /* Was ENOSHARE 136, no longer used. */
+                         NULL, /* Was ECASECLASH 137, no longer used. */
In terms of politenness, wouldn't it be better to define them as
empty strings?  This may be one crash less in already existing
binaries...

Indeed, I missed that case. Patch attached.

Christian

From 151da4ef76f84cd0343e6f49aa23de398ca73d1c Mon Sep 17 00:00:00 2001
From: Christian Franke <christian.fra...@t-online.de>
Date: Tue, 27 Feb 2024 17:21:45 +0100
Subject: [PATCH 2/2] Cygwin: set ENOSHARE and ECASECLASH _sys_errlist[]
 entries to empty

These errno values are no longer used by Cygwin.  Change the entries
to empty strings instead of NULL to avoid crashes in existing
binaries directly accessing the table.  Enhance strerror_worker()
such that empty strings also result in "Unknown error ..." messages.
Also add a static_assert check for the _sys_errlist[] size.

Signed-off-by: Christian Franke <christian.fra...@t-online.de>
---
 winsup/cygwin/errno.cc | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/winsup/cygwin/errno.cc b/winsup/cygwin/errno.cc
index 7d58e62ec..004a4021e 100644
--- a/winsup/cygwin/errno.cc
+++ b/winsup/cygwin/errno.cc
@@ -167,8 +167,8 @@ const char *_sys_errlist[] =
 /* ESTALE 133 */         "Stale NFS file handle",
 /* ENOTSUP 134 */        "Not supported",
 /* ENOMEDIUM 135 */      "No medium found",
-/* ENOSHARE 136 */       "No such host or network path",
-/* ECASECLASH 137 */     "Filename exists with different case",
+                         "", /* Was ENOSHARE 136, no longer used. */
+                         "", /* Was ECASECLASH 137, no longer used. */
 /* EILSEQ 138 */         "Invalid or incomplete multibyte or wide character",
 /* EOVERFLOW 139 */      "Value too large for defined data type",
 /* ECANCELED 140 */      "Operation canceled",
@@ -177,6 +177,8 @@ const char *_sys_errlist[] =
 /* ESTRPIPE 143 */       "Streams pipe error"
 };
 
+static_assert(143 + 1 == sizeof (_sys_errlist) / sizeof (_sys_errlist[0]));
+
 int NO_COPY_INIT _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);
 };
 
@@ -228,7 +230,11 @@ strerror_worker (int errnum)
 {
   char *res;
   if (errnum >= 0 && errnum < _sys_nerr)
-    res = (char *) _sys_errlist [errnum];
+    {
+      res = (char *) _sys_errlist [errnum];
+      if (res && !*res)
+       res = NULL;
+    }
   else
     res = NULL;
   return res;
-- 
2.43.0

Reply via email to