aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Alexander Polcyn <apolcyn@google.com>2017-07-14 14:23:25 -0700
committerGravatar Alexander Polcyn <apolcyn@google.com>2017-07-14 14:53:55 -0700
commit77349cd80a79283be2a88c02754aad4baf28f328 (patch)
tree9f10aeb2024547c9991a07a2631af4995a626952 /src
parentabcdfc9676c46a7f04091cf0e7f84f0e2b3fcf86 (diff)
fix ruby memory leaks when composing credentials
Diffstat (limited to 'src')
-rw-r--r--src/ruby/ext/grpc/rb_call_credentials.c5
-rw-r--r--src/ruby/ext/grpc/rb_channel_credentials.c6
2 files changed, 11 insertions, 0 deletions
diff --git a/src/ruby/ext/grpc/rb_call_credentials.c b/src/ruby/ext/grpc/rb_call_credentials.c
index 95e01a2c19..17083dd414 100644
--- a/src/ruby/ext/grpc/rb_call_credentials.c
+++ b/src/ruby/ext/grpc/rb_call_credentials.c
@@ -239,6 +239,7 @@ static VALUE grpc_rb_call_credentials_compose(int argc, VALUE *argv,
VALUE self) {
grpc_call_credentials *creds;
grpc_call_credentials *other;
+ grpc_call_credentials *prev = NULL;
VALUE mark;
if (argc == 0) {
return self;
@@ -249,6 +250,10 @@ static VALUE grpc_rb_call_credentials_compose(int argc, VALUE *argv,
rb_ary_push(mark, argv[i]);
other = grpc_rb_get_wrapped_call_credentials(argv[i]);
creds = grpc_composite_call_credentials_create(creds, other, NULL);
+ if (prev != NULL) {
+ grpc_call_credentials_release(prev);
+ }
+ prev = creds;
}
return grpc_rb_wrap_call_credentials(creds, mark);
}
diff --git a/src/ruby/ext/grpc/rb_channel_credentials.c b/src/ruby/ext/grpc/rb_channel_credentials.c
index 07935a13dc..83601ca694 100644
--- a/src/ruby/ext/grpc/rb_channel_credentials.c
+++ b/src/ruby/ext/grpc/rb_channel_credentials.c
@@ -184,6 +184,7 @@ static VALUE grpc_rb_channel_credentials_compose(int argc, VALUE *argv,
VALUE self) {
grpc_channel_credentials *creds;
grpc_call_credentials *other;
+ grpc_channel_credentials *prev = NULL;
VALUE mark;
if (argc == 0) {
return self;
@@ -195,6 +196,11 @@ static VALUE grpc_rb_channel_credentials_compose(int argc, VALUE *argv,
rb_ary_push(mark, argv[i]);
other = grpc_rb_get_wrapped_call_credentials(argv[i]);
creds = grpc_composite_channel_credentials_create(creds, other, NULL);
+ if (prev != NULL) {
+ grpc_channel_credentials_release(prev);
+ }
+ prev = creds;
+
if (creds == NULL) {
rb_raise(rb_eRuntimeError,
"Failed to compose channel and call credentials");