mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-23 03:10:05 +08:00
fix: os.RemoveAll not working on Windows7
This commit is contained in:
parent
87c3f700e5
commit
abb55199f2
188
.github/patch/go1.25.patch
vendored
188
.github/patch/go1.25.patch
vendored
@ -1,4 +1,5 @@
|
||||
Subject: [PATCH] Revert "runtime: always use LoadLibraryEx to load system libraries"
|
||||
Subject: [PATCH] Fix os.RemoveAll not working on Windows7
|
||||
Revert "runtime: always use LoadLibraryEx to load system libraries"
|
||||
Revert "syscall: remove Windows 7 console handle workaround"
|
||||
Revert "net: remove sysSocket fallback for Windows 7"
|
||||
Revert "crypto/rand,runtime: switch RtlGenRandom for ProcessPrng"
|
||||
@ -655,3 +656,188 @@ diff --git a/src/syscall/dll_windows.go b/src/syscall/dll_windows.go
|
||||
} else {
|
||||
h, e = loadlibrary(namep)
|
||||
}
|
||||
Index: src/os/removeall_at.go
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go
|
||||
--- a/src/os/removeall_at.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c)
|
||||
+++ b/src/os/removeall_at.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed)
|
||||
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
-//go:build unix || wasip1 || windows
|
||||
+//go:build unix || wasip1
|
||||
|
||||
package os
|
||||
|
||||
@@ -175,3 +175,25 @@
|
||||
}
|
||||
return newDirFile(fd, name)
|
||||
}
|
||||
+
|
||||
+func rootRemoveAll(r *Root, name string) error {
|
||||
+ // Consistency with os.RemoveAll: Strip trailing /s from the name,
|
||||
+ // so RemoveAll("not_a_directory/") succeeds.
|
||||
+ for len(name) > 0 && IsPathSeparator(name[len(name)-1]) {
|
||||
+ name = name[:len(name)-1]
|
||||
+ }
|
||||
+ if endsWithDot(name) {
|
||||
+ // Consistency with os.RemoveAll: Return EINVAL when trying to remove .
|
||||
+ return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL}
|
||||
+ }
|
||||
+ _, err := doInRoot(r, name, nil, func(parent sysfdType, name string) (struct{}, error) {
|
||||
+ return struct{}{}, removeAllFrom(parent, name)
|
||||
+ })
|
||||
+ if IsNotExist(err) {
|
||||
+ return nil
|
||||
+ }
|
||||
+ if err != nil {
|
||||
+ return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)}
|
||||
+ }
|
||||
+ return err
|
||||
+}
|
||||
Index: src/os/removeall_noat.go
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/src/os/removeall_noat.go b/src/os/removeall_noat.go
|
||||
--- a/src/os/removeall_noat.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c)
|
||||
+++ b/src/os/removeall_noat.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed)
|
||||
@@ -2,7 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
-//go:build (js && wasm) || plan9
|
||||
+//go:build (js && wasm) || plan9 || windows
|
||||
|
||||
package os
|
||||
|
||||
@@ -140,3 +140,22 @@
|
||||
}
|
||||
return err
|
||||
}
|
||||
+
|
||||
+func rootRemoveAll(r *Root, name string) error {
|
||||
+ if endsWithDot(name) {
|
||||
+ // Consistency with os.RemoveAll: Return EINVAL when trying to remove .
|
||||
+ return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL}
|
||||
+ }
|
||||
+ if err := checkPathEscapesLstat(r, name); err != nil {
|
||||
+ if err == syscall.ENOTDIR {
|
||||
+ // Some intermediate path component is not a directory.
|
||||
+ // RemoveAll treats this as success (since the target doesn't exist).
|
||||
+ return nil
|
||||
+ }
|
||||
+ return &PathError{Op: "RemoveAll", Path: name, Err: err}
|
||||
+ }
|
||||
+ if err := RemoveAll(joinPath(r.root.name, name)); err != nil {
|
||||
+ return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)}
|
||||
+ }
|
||||
+ return nil
|
||||
+}
|
||||
Index: src/os/root_noopenat.go
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/src/os/root_noopenat.go b/src/os/root_noopenat.go
|
||||
--- a/src/os/root_noopenat.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c)
|
||||
+++ b/src/os/root_noopenat.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed)
|
||||
@@ -11,7 +11,6 @@
|
||||
"internal/filepathlite"
|
||||
"internal/stringslite"
|
||||
"sync/atomic"
|
||||
- "syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -185,25 +184,6 @@
|
||||
}
|
||||
return nil
|
||||
}
|
||||
-
|
||||
-func rootRemoveAll(r *Root, name string) error {
|
||||
- if endsWithDot(name) {
|
||||
- // Consistency with os.RemoveAll: Return EINVAL when trying to remove .
|
||||
- return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL}
|
||||
- }
|
||||
- if err := checkPathEscapesLstat(r, name); err != nil {
|
||||
- if err == syscall.ENOTDIR {
|
||||
- // Some intermediate path component is not a directory.
|
||||
- // RemoveAll treats this as success (since the target doesn't exist).
|
||||
- return nil
|
||||
- }
|
||||
- return &PathError{Op: "RemoveAll", Path: name, Err: err}
|
||||
- }
|
||||
- if err := RemoveAll(joinPath(r.root.name, name)); err != nil {
|
||||
- return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)}
|
||||
- }
|
||||
- return nil
|
||||
-}
|
||||
|
||||
func rootReadlink(r *Root, name string) (string, error) {
|
||||
if err := checkPathEscapesLstat(r, name); err != nil {
|
||||
Index: src/os/root_openat.go
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/src/os/root_openat.go b/src/os/root_openat.go
|
||||
--- a/src/os/root_openat.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c)
|
||||
+++ b/src/os/root_openat.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed)
|
||||
@@ -194,28 +194,6 @@
|
||||
return nil
|
||||
}
|
||||
|
||||
-func rootRemoveAll(r *Root, name string) error {
|
||||
- // Consistency with os.RemoveAll: Strip trailing /s from the name,
|
||||
- // so RemoveAll("not_a_directory/") succeeds.
|
||||
- for len(name) > 0 && IsPathSeparator(name[len(name)-1]) {
|
||||
- name = name[:len(name)-1]
|
||||
- }
|
||||
- if endsWithDot(name) {
|
||||
- // Consistency with os.RemoveAll: Return EINVAL when trying to remove .
|
||||
- return &PathError{Op: "RemoveAll", Path: name, Err: syscall.EINVAL}
|
||||
- }
|
||||
- _, err := doInRoot(r, name, nil, func(parent sysfdType, name string) (struct{}, error) {
|
||||
- return struct{}{}, removeAllFrom(parent, name)
|
||||
- })
|
||||
- if IsNotExist(err) {
|
||||
- return nil
|
||||
- }
|
||||
- if err != nil {
|
||||
- return &PathError{Op: "RemoveAll", Path: name, Err: underlyingError(err)}
|
||||
- }
|
||||
- return err
|
||||
-}
|
||||
-
|
||||
func rootRename(r *Root, oldname, newname string) error {
|
||||
_, err := doInRoot(r, oldname, nil, func(oldparent sysfdType, oldname string) (struct{}, error) {
|
||||
_, err := doInRoot(r, newname, nil, func(newparent sysfdType, newname string) (struct{}, error) {
|
||||
Index: src/os/root_windows.go
|
||||
IDEA additional info:
|
||||
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
|
||||
<+>UTF-8
|
||||
===================================================================
|
||||
diff --git a/src/os/root_windows.go b/src/os/root_windows.go
|
||||
--- a/src/os/root_windows.go (revision f56f1e23507e646c85243a71bde7b9629b2f970c)
|
||||
+++ b/src/os/root_windows.go (revision 0a52622d2331ff975fb0442617ec19bc352bb2ed)
|
||||
@@ -402,3 +402,14 @@
|
||||
}
|
||||
return fi.Mode(), nil
|
||||
}
|
||||
+
|
||||
+func checkPathEscapes(r *Root, name string) error {
|
||||
+ if !filepathlite.IsLocal(name) {
|
||||
+ return errPathEscapes
|
||||
+ }
|
||||
+ return nil
|
||||
+}
|
||||
+
|
||||
+func checkPathEscapesLstat(r *Root, name string) error {
|
||||
+ return checkPathEscapes(r, name)
|
||||
+}
|
||||
|
||||
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -59,6 +59,8 @@ jobs:
|
||||
- { goos: linux, goarch: s390x, output: s390x, debian: s390x, rpm: s390x }
|
||||
- { goos: linux, goarch: ppc64le, output: ppc64le, debian: ppc64el, rpm: ppc64le }
|
||||
|
||||
# Go 1.25 with special patch can work on Windows 7
|
||||
# https://github.com/MetaCubeX/go/commits/release-branch.go1.25/
|
||||
- { goos: windows, goarch: '386', output: '386' }
|
||||
- { goos: windows, goarch: amd64, goamd64: v1, output: amd64-compatible } # old style file name will be removed in next released
|
||||
- { goos: windows, goarch: amd64, goamd64: v3, output: amd64 }
|
||||
@ -176,6 +178,8 @@ jobs:
|
||||
# 7c1157f9544922e96945196b47b95664b1e39108: "net: remove sysSocket fallback for Windows 7"
|
||||
# 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround"
|
||||
# a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries"
|
||||
# sepical fix:
|
||||
# - os.RemoveAll not working on Windows7
|
||||
- name: Revert Golang1.25 commit for Windows7/8
|
||||
if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '' }}
|
||||
run: |
|
||||
|
||||
Loading…
Reference in New Issue
Block a user