Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions _demo/go/export/libexport.h.want
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,9 @@ github.com_goplus_llgo_runtime_internal_clite_pthread_init(void) GO_SYMBOL_RENAM
void
github.com_goplus_llgo_runtime_internal_clite_pthread_sync_init(void) GO_SYMBOL_RENAME("github.com/goplus/llgo/runtime/internal/clite/pthread/sync.init")

void
github.com_goplus_llgo_runtime_internal_clite_signal_init(void) GO_SYMBOL_RENAME("github.com/goplus/llgo/runtime/internal/clite/signal.init")

void
github.com_goplus_llgo_runtime_internal_runtime_goarch_init(void) GO_SYMBOL_RENAME("github.com/goplus/llgo/runtime/internal/runtime/goarch.init")

Expand Down
12 changes: 0 additions & 12 deletions runtime/internal/runtime/z_rt.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,18 +109,6 @@ const MaxZero = 1024

var ZeroVal [MaxZero]byte

// func init() {
// signal.Signal(c.Int(syscall.SIGSEGV), func(v c.Int) {
// switch syscall.Signal(v) {
// case syscall.SIGSEGV:
// panic(errorString("invalid memory address or nil pointer dereference"))
// default:
// var buf [20]byte
// panic(errorString("unexpected signal value: " + string(itoa(buf[:], uint64(v)))))
// }
// })
// }

// -----------------------------------------------------------------------------

type SigjmpBuf struct {
Expand Down
48 changes: 48 additions & 0 deletions runtime/internal/runtime/z_signal.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//go:build !wasm && !baremetal

/*
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package runtime
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing Documentation

This file lacks explanatory comments. Given the platform-specific nature and relationship to PR #1059, please add:

// This file contains platform-specific runtime initialization for non-wasm targets.
// The SIGSEGV signal handler enables Go-style panic recovery for nil pointer dereferences
// instead of immediate process termination.
//
// For wasm platform compatibility, signal handling is excluded via build tags.
// See PR #1059 for wasm platform requirements.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done


import (
c "github.com/goplus/llgo/runtime/internal/clite"
"github.com/goplus/llgo/runtime/internal/clite/signal"
)

const (
// SIGSEGV is signal number 11 on all Unix-like systems (Linux, Darwin, BSD, etc.)
// Using a hardcoded constant avoids importing the syscall package, which would
// introduce dependencies on errors and internal/reflectlite packages that cause
// linking issues in c-shared and c-archive build modes.
SIGSEGV = c.Int(0xb)
)

// This file contains platform-specific runtime initialization for non-wasm targets.
// The SIGSEGV signal handler enables Go-style panic recovery for nil pointer dereferences
// instead of immediate process termination.
//
// For wasm platform compatibility, signal handling is excluded via build tags.
// See PR #1059 for wasm platform requirements.
func init() {
signal.Signal(SIGSEGV, func(v c.Int) {
if v == SIGSEGV {
panic(errorString("invalid memory address or nil pointer dereference"))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Security: Non-Async-Signal-Safe Operations

This signal handler violates async-signal-safety by calling panic(), which allocates memory via c.Malloc(). Per POSIX standards, signal handlers should only call async-signal-safe functions.

Risk: If SIGSEGV occurs while inside malloc/free, the handler calling malloc again can cause deadlock or memory corruption.

Recommendation: Consider pre-allocating the error value and using only async-signal-safe operations in the handler, similar to how standard Go's runtime handles signals with dedicated signal stacks and atomic operations.

}
var buf [20]byte
panic(errorString("unexpected signal value: " + string(itoa(buf[:], uint64(v)))))
})
}
Loading