From 51ba2bb81923298f08b8ec6d50d0c579b4b63ef3 Mon Sep 17 00:00:00 2001 From: Hiroshi Ioka Date: Tue, 11 Jul 2017 18:57:54 +0900 Subject: [PATCH] runtime/cgo: make code robust According to http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_key_create.html, pthread_key_create return an error number which is greater than or equal to 0. I don't know the scenario that pthread_setspecific would fail, but also don't know the future. Add some error handlings just in case. Change-Id: I0774b79ef658d67e300f4a9aab1f2e3879acc7ee Reviewed-on: https://go-review.googlesource.com/54811 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/runtime/cgo/gcc_android_386.c | 7 +++++-- src/runtime/cgo/gcc_android_amd64.c | 7 +++++-- src/runtime/cgo/gcc_darwin_386.c | 7 +++++-- src/runtime/cgo/gcc_darwin_amd64.c | 7 +++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/runtime/cgo/gcc_android_386.c b/src/runtime/cgo/gcc_android_386.c index 23a15f1c87..28f553c446 100644 --- a/src/runtime/cgo/gcc_android_386.c +++ b/src/runtime/cgo/gcc_android_386.c @@ -36,7 +36,7 @@ inittls(void) */ ntofree = 0; for(;;) { - if(pthread_key_create(&k, nil) < 0) { + if(pthread_key_create(&k, nil) != 0) { fprintf(stderr, "runtime/cgo: pthread_key_create failed\n"); abort(); } @@ -77,7 +77,10 @@ threadentry(void *v) ts = *(ThreadStart*)v; free(v); - pthread_setspecific(k1, (void*)ts.g); + if (pthread_setspecific(k1, (void*)ts.g) != 0) { + fprintf(stderr, "runtime/cgo: pthread_setspecific failed\n"); + abort(); + } crosscall_386(ts.fn); return nil; diff --git a/src/runtime/cgo/gcc_android_amd64.c b/src/runtime/cgo/gcc_android_amd64.c index e006c49bcf..6f92d90dd4 100644 --- a/src/runtime/cgo/gcc_android_amd64.c +++ b/src/runtime/cgo/gcc_android_amd64.c @@ -41,7 +41,7 @@ inittls(void) */ ntofree = 0; for(;;) { - if(pthread_key_create(&k, nil) < 0) { + if(pthread_key_create(&k, nil) != 0) { fprintf(stderr, "runtime/cgo: pthread_key_create failed\n"); abort(); } @@ -82,7 +82,10 @@ threadentry(void *v) ts = *(ThreadStart*)v; free(v); - pthread_setspecific(k1, (void*)ts.g); + if (pthread_setspecific(k1, (void*)ts.g) != 0) { + fprintf(stderr, "runtime/cgo: pthread_setspecific failed\n"); + abort(); + } crosscall_amd64(ts.fn); return nil; diff --git a/src/runtime/cgo/gcc_darwin_386.c b/src/runtime/cgo/gcc_darwin_386.c index 9d1b942575..7d3c55cd56 100644 --- a/src/runtime/cgo/gcc_darwin_386.c +++ b/src/runtime/cgo/gcc_darwin_386.c @@ -64,7 +64,7 @@ inittls(void) */ ntofree = 0; for(;;) { - if(pthread_key_create(&k, nil) < 0) { + if(pthread_key_create(&k, nil) != 0) { fprintf(stderr, "runtime/cgo: pthread_key_create failed\n"); abort(); } @@ -142,7 +142,10 @@ threadentry(void *v) ts = *(ThreadStart*)v; free(v); - pthread_setspecific(k1, (void*)ts.g); + if (pthread_setspecific(k1, (void*)ts.g) != 0) { + fprintf(stderr, "runtime/cgo: pthread_setspecific failed\n"); + abort(); + } crosscall_386(ts.fn); return nil; diff --git a/src/runtime/cgo/gcc_darwin_amd64.c b/src/runtime/cgo/gcc_darwin_amd64.c index 9c2de6b2cd..c57608c675 100644 --- a/src/runtime/cgo/gcc_darwin_amd64.c +++ b/src/runtime/cgo/gcc_darwin_amd64.c @@ -35,7 +35,7 @@ inittls(void) */ ntofree = 0; for(;;) { - if(pthread_key_create(&k, nil) < 0) { + if(pthread_key_create(&k, nil) != 0) { fprintf(stderr, "runtime/cgo: pthread_key_create failed\n"); abort(); } @@ -113,7 +113,10 @@ threadentry(void *v) ts = *(ThreadStart*)v; free(v); - pthread_setspecific(k1, (void*)ts.g); + if (pthread_setspecific(k1, (void*)ts.g) != 0) { + fprintf(stderr, "runtime/cgo: pthread_setspecific failed\n"); + abort(); + } crosscall_amd64(ts.fn); return nil; -- 2.48.1