Merge pull request #11830 from apolcyn/fix_credential_compose_leaks_master

Fix ruby memory leaks when composing credentials, noticed with asan
pull/11852/head
apolcyn 7 years ago committed by GitHub
commit da0c0ecb1a
  1. 5
      src/ruby/ext/grpc/rb_call_credentials.c
  2. 6
      src/ruby/ext/grpc/rb_channel_credentials.c

@ -239,6 +239,7 @@ static VALUE grpc_rb_call_credentials_compose(int argc, VALUE *argv,
VALUE self) { VALUE self) {
grpc_call_credentials *creds; grpc_call_credentials *creds;
grpc_call_credentials *other; grpc_call_credentials *other;
grpc_call_credentials *prev = NULL;
VALUE mark; VALUE mark;
if (argc == 0) { if (argc == 0) {
return self; return self;
@ -249,6 +250,10 @@ static VALUE grpc_rb_call_credentials_compose(int argc, VALUE *argv,
rb_ary_push(mark, argv[i]); rb_ary_push(mark, argv[i]);
other = grpc_rb_get_wrapped_call_credentials(argv[i]); other = grpc_rb_get_wrapped_call_credentials(argv[i]);
creds = grpc_composite_call_credentials_create(creds, other, NULL); 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); return grpc_rb_wrap_call_credentials(creds, mark);
} }

@ -184,6 +184,7 @@ static VALUE grpc_rb_channel_credentials_compose(int argc, VALUE *argv,
VALUE self) { VALUE self) {
grpc_channel_credentials *creds; grpc_channel_credentials *creds;
grpc_call_credentials *other; grpc_call_credentials *other;
grpc_channel_credentials *prev = NULL;
VALUE mark; VALUE mark;
if (argc == 0) { if (argc == 0) {
return self; return self;
@ -195,6 +196,11 @@ static VALUE grpc_rb_channel_credentials_compose(int argc, VALUE *argv,
rb_ary_push(mark, argv[i]); rb_ary_push(mark, argv[i]);
other = grpc_rb_get_wrapped_call_credentials(argv[i]); other = grpc_rb_get_wrapped_call_credentials(argv[i]);
creds = grpc_composite_channel_credentials_create(creds, other, NULL); creds = grpc_composite_channel_credentials_create(creds, other, NULL);
if (prev != NULL) {
grpc_channel_credentials_release(prev);
}
prev = creds;
if (creds == NULL) { if (creds == NULL) {
rb_raise(rb_eRuntimeError, rb_raise(rb_eRuntimeError,
"Failed to compose channel and call credentials"); "Failed to compose channel and call credentials");

Loading…
Cancel
Save