Skip to content

Commit afbb3e9

Browse files
committed
runtime/cgo: add error checks for safe stack retrieval on Unix
1 parent f062d7b commit afbb3e9

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

src/runtime/cgo/gcc_stack_unix.c

+11-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define _GNU_SOURCE
99
#endif
1010

11+
#include <errno.h>
1112
#include <pthread.h>
1213
#include "libcgo.h"
1314

@@ -20,16 +21,21 @@ x_cgo_getstackbound(uintptr bounds[2])
2021

2122
// Needed before pthread_getattr_np, too, since before glibc 2.32
2223
// it did not call pthread_attr_init in all cases (see #65625).
23-
pthread_attr_init(&attr);
24+
if (pthread_attr_init(&attr) != 0)
25+
fatalf("pthread_attr_init failed: %d", errno);
2426
#if defined(__GLIBC__) || defined(__BIONIC__) || (defined(__sun) && !defined(__illumos__))
2527
// pthread_getattr_np is a GNU extension supported in glibc.
2628
// Solaris is not glibc but does support pthread_getattr_np
2729
// (and the fallback doesn't work...). Illumos does not.
28-
pthread_getattr_np(pthread_self(), &attr); // GNU extension
29-
pthread_attr_getstack(&attr, &addr, &size); // low address
30+
if (pthread_getattr_np(pthread_self(), &attr) != 0) // GNU extension
31+
fatalf("pthread_getattr_np failed: %d", errno);
32+
if (pthread_attr_getstack(&attr, &addr, &size) != 0) // low address
33+
fatalf("pthread_attr_getstack failed: %d", errno);
3034
#elif defined(__illumos__)
31-
pthread_attr_get_np(pthread_self(), &attr);
32-
pthread_attr_getstack(&attr, &addr, &size); // low address
35+
if (pthread_attr_get_np(pthread_self(), &attr) != 0) // Illumos extension
36+
fatalf("pthread_attr_get_np failed: %d", errno);
37+
if (pthread_attr_getstack(&attr, &addr, &size) != 0) // low address
38+
fatalf("pthread_attr_getstack failed: %d", errno);
3339
#else
3440
// We don't know how to get the current stacks, leave it as
3541
// 0 and the caller will use an estimate based on the current

0 commit comments

Comments
 (0)