204 lines
6.9 KiB
Diff
204 lines
6.9 KiB
Diff
From b3840bdcc0eee2a4d099a9af52199944ade7acb9 Mon Sep 17 00:00:00 2001
|
|
From: Ian Lance Taylor <iant@golang.org>
|
|
Date: Tue, 29 Nov 2022 17:28:44 -0800
|
|
Subject: [PATCH] syscall, runtime: always call XSI strerror_r
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This does the right thing for either glibc or musl on GNU/Linux.
|
|
|
|
Based on patch by Sören Tempel.
|
|
|
|
Change-Id: If2969e131f0fae456d58b35d839d8abe191fcc59
|
|
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/454176
|
|
Reviewed-by: Cherry Mui <cherryyz@google.com>
|
|
Reviewed-by: Ian Lance Taylor <iant@google.com>
|
|
TryBot-Bypass: Ian Lance Taylor <iant@google.com>
|
|
---
|
|
libgo/Makefile.am | 1 +
|
|
libgo/Makefile.in | 6 +++++-
|
|
libgo/go/syscall/errstr.go | 22 ++++++++-----------
|
|
libgo/go/syscall/errstr_glibc.go | 33 ----------------------------
|
|
libgo/runtime/go-strerror.c | 37 ++++++++++++++++++++++++++++++++
|
|
5 files changed, 52 insertions(+), 47 deletions(-)
|
|
delete mode 100644 libgo/go/syscall/errstr_glibc.go
|
|
create mode 100644 libgo/runtime/go-strerror.c
|
|
|
|
diff --git a/libgo/Makefile.am b/libgo/Makefile.am
|
|
index e0a1eec5..df568743 100644
|
|
--- a/libgo/Makefile.am
|
|
+++ b/libgo/Makefile.am
|
|
@@ -465,6 +465,7 @@ runtime_files = \
|
|
runtime/go-nanotime.c \
|
|
runtime/go-now.c \
|
|
runtime/go-nosys.c \
|
|
+ runtime/go-strerror.c \
|
|
runtime/go-reflect-call.c \
|
|
runtime/go-setenv.c \
|
|
runtime/go-signal.c \
|
|
diff --git a/libgo/Makefile.in b/libgo/Makefile.in
|
|
index 7bef5df9..f2f3f0fc 100644
|
|
--- a/libgo/Makefile.in
|
|
+++ b/libgo/Makefile.in
|
|
@@ -247,7 +247,7 @@ am__objects_4 = runtime/aeshash.lo runtime/go-assert.lo \
|
|
runtime/go-fieldtrack.lo runtime/go-matherr.lo \
|
|
runtime/go-memclr.lo runtime/go-memmove.lo \
|
|
runtime/go-memequal.lo runtime/go-nanotime.lo \
|
|
- runtime/go-now.lo runtime/go-nosys.lo \
|
|
+ runtime/go-now.lo runtime/go-nosys.lo runtime/go-strerror.lo \
|
|
runtime/go-reflect-call.lo runtime/go-setenv.lo \
|
|
runtime/go-signal.lo runtime/go-unsafe-pointer.lo \
|
|
runtime/go-unsetenv.lo runtime/go-unwind.lo \
|
|
@@ -917,6 +917,7 @@ runtime_files = \
|
|
runtime/go-nanotime.c \
|
|
runtime/go-now.c \
|
|
runtime/go-nosys.c \
|
|
+ runtime/go-strerror.c \
|
|
runtime/go-reflect-call.c \
|
|
runtime/go-setenv.c \
|
|
runtime/go-signal.c \
|
|
@@ -1390,6 +1391,8 @@ runtime/go-now.lo: runtime/$(am__dirstamp) \
|
|
runtime/$(DEPDIR)/$(am__dirstamp)
|
|
runtime/go-nosys.lo: runtime/$(am__dirstamp) \
|
|
runtime/$(DEPDIR)/$(am__dirstamp)
|
|
+runtime/go-strerror.lo: runtime/$(am__dirstamp) \
|
|
+ runtime/$(DEPDIR)/$(am__dirstamp)
|
|
runtime/go-reflect-call.lo: runtime/$(am__dirstamp) \
|
|
runtime/$(DEPDIR)/$(am__dirstamp)
|
|
runtime/go-setenv.lo: runtime/$(am__dirstamp) \
|
|
@@ -1457,6 +1460,7 @@ distclean-compile:
|
|
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-reflect-call.Plo@am__quote@
|
|
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-setenv.Plo@am__quote@
|
|
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-signal.Plo@am__quote@
|
|
+@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-strerror.Plo@am__quote@
|
|
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-unsafe-pointer.Plo@am__quote@
|
|
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-unsetenv.Plo@am__quote@
|
|
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-unwind.Plo@am__quote@
|
|
diff --git a/libgo/go/syscall/errstr.go b/libgo/go/syscall/errstr.go
|
|
index 6c2441d3..9f688e2a 100644
|
|
--- a/libgo/go/syscall/errstr.go
|
|
+++ b/libgo/go/syscall/errstr.go
|
|
@@ -4,23 +4,19 @@
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
-// +build !hurd
|
|
-// +build !linux
|
|
-
|
|
package syscall
|
|
|
|
-//sysnb strerror_r(errnum int, buf []byte) (err Errno)
|
|
-//strerror_r(errnum _C_int, buf *byte, buflen Size_t) _C_int
|
|
+import "internal/bytealg"
|
|
+
|
|
+//extern go_strerror
|
|
+func go_strerror(_C_int, *byte, Size_t) _C_int
|
|
|
|
func Errstr(errnum int) string {
|
|
- for len := 128; ; len *= 2 {
|
|
- b := make([]byte, len)
|
|
- errno := strerror_r(errnum, b)
|
|
+ for size := 128; ; size *= 2 {
|
|
+ b := make([]byte, size)
|
|
+ errno := go_strerror(_C_int(errnum), &b[0], Size_t(len(b)))
|
|
if errno == 0 {
|
|
- i := 0
|
|
- for b[i] != 0 {
|
|
- i++
|
|
- }
|
|
+ i := bytealg.IndexByte(b, 0)
|
|
// Lowercase first letter: Bad -> bad, but
|
|
// STREAM -> STREAM.
|
|
if i > 1 && 'A' <= b[0] && b[0] <= 'Z' && 'a' <= b[1] && b[1] <= 'z' {
|
|
@@ -29,7 +25,7 @@ func Errstr(errnum int) string {
|
|
return string(b[:i])
|
|
}
|
|
if errno != ERANGE {
|
|
- return "errstr failure"
|
|
+ return "strerror_r failure"
|
|
}
|
|
}
|
|
}
|
|
diff --git a/libgo/go/syscall/errstr_glibc.go b/libgo/go/syscall/errstr_glibc.go
|
|
deleted file mode 100644
|
|
index 5b19e6f2..00000000
|
|
--- a/libgo/go/syscall/errstr_glibc.go
|
|
+++ /dev/null
|
|
@@ -1,33 +0,0 @@
|
|
-// errstr_glibc.go -- GNU/Linux and GNU/Hurd specific error strings.
|
|
-
|
|
-// Copyright 2010 The Go Authors. All rights reserved.
|
|
-// Use of this source code is governed by a BSD-style
|
|
-// license that can be found in the LICENSE file.
|
|
-
|
|
-// We use this rather than errstr.go because on GNU/Linux sterror_r
|
|
-// returns a pointer to the error message, and may not use buf at all.
|
|
-
|
|
-// +build hurd linux
|
|
-
|
|
-package syscall
|
|
-
|
|
-import "unsafe"
|
|
-
|
|
-//sysnb strerror_r(errnum int, b []byte) (errstr *byte)
|
|
-//strerror_r(errnum _C_int, b *byte, len Size_t) *byte
|
|
-
|
|
-func Errstr(errnum int) string {
|
|
- a := make([]byte, 128)
|
|
- p := strerror_r(errnum, a)
|
|
- b := (*[1000]byte)(unsafe.Pointer(p))
|
|
- i := 0
|
|
- for b[i] != 0 {
|
|
- i++
|
|
- }
|
|
- // Lowercase first letter: Bad -> bad, but STREAM -> STREAM.
|
|
- if i > 1 && 'A' <= b[0] && b[0] <= 'Z' && 'a' <= b[1] && b[1] <= 'z' {
|
|
- c := b[0] + 'a' - 'A'
|
|
- return string(c) + string(b[1:i])
|
|
- }
|
|
- return string(b[:i])
|
|
-}
|
|
diff --git a/libgo/runtime/go-strerror.c b/libgo/runtime/go-strerror.c
|
|
new file mode 100644
|
|
index 00000000..13d1d91d
|
|
--- /dev/null
|
|
+++ b/libgo/runtime/go-strerror.c
|
|
@@ -0,0 +1,37 @@
|
|
+/* go-strerror.c -- wrapper around XSI-compliant strerror_r.
|
|
+
|
|
+ Copyright 2022 The Go Authors. All rights reserved.
|
|
+ Use of this source code is governed by a BSD-style
|
|
+ license that can be found in the LICENSE file. */
|
|
+
|
|
+/* There are two version of strerror_r on GNU/Linux: a GNU-specific
|
|
+ and an XSI-compliant version. The former version is only available
|
|
+ on glibc. Since glibc 2.13, the XSI-compliant version is also
|
|
+ provided by glibc if _GNU_SOURCE is not defined. Since the
|
|
+ entirety of gofrontend is compiled with _GNU_SOURCE, this file
|
|
+ exists to selectively undefine it and provides an alias to the
|
|
+ XSI-compliant version of strerror_r(3). */
|
|
+
|
|
+#ifdef __linux__
|
|
+
|
|
+/* Force selection of XSI-compliant strerror_r by glibc. */
|
|
+#undef XOPEN_SOURCE
|
|
+#define XOPEN_SOURCE 600
|
|
+#undef _POSIX_C_SOURCE
|
|
+#define _POSIX_C_SOURCE 200112L
|
|
+#undef _GNU_SOURCE
|
|
+
|
|
+#endif /* __linux__ */
|
|
+
|
|
+#include <string.h>
|
|
+
|
|
+#ifndef HAVE_STRERROR_R
|
|
+// Provided by go-nosys.c if not provided by libc itself.
|
|
+extern int strerror_r (int, char *, size_t);
|
|
+#endif
|
|
+
|
|
+int
|
|
+go_strerror (int errnum, char *buf, size_t buflen)
|
|
+{
|
|
+ return strerror_r (errnum, buf, buflen);
|
|
+}
|