Skip to content

Commit 03338e7

Browse files
committed
Add GC_GUARD to temporary ruby objects for conninfo string
To ensure the ruby string isn't GC'ed before the libpq function returns.
1 parent d062274 commit 03338e7

1 file changed

Lines changed: 4 additions & 0 deletions

File tree

ext/pg_connection.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ pgconn_s_sync_connect(int argc, VALUE *argv, VALUE klass)
283283
this = pg_get_connection( self );
284284
conninfo = rb_funcall2( rb_cPGconn, rb_intern("parse_connect_args"), argc, argv );
285285
this->pgconn = gvl_PQconnectdb(StringValueCStr(conninfo));
286+
RB_GC_GUARD(conninfo);
286287

287288
if(this->pgconn == NULL)
288289
rb_raise(rb_ePGerror, "PQconnectdb() unable to allocate PGconn structure");
@@ -331,6 +332,7 @@ pgconn_s_connect_start( int argc, VALUE *argv, VALUE klass )
331332
this = pg_get_connection( rb_conn );
332333
conninfo = rb_funcall2( klass, rb_intern("parse_connect_args"), argc, argv );
333334
this->pgconn = gvl_PQconnectStart( StringValueCStr(conninfo) );
335+
RB_GC_GUARD(conninfo);
334336

335337
if( this->pgconn == NULL )
336338
rb_raise(rb_ePGerror, "PQconnectStart() unable to allocate PGconn structure");
@@ -352,6 +354,7 @@ pgconn_s_sync_ping( int argc, VALUE *argv, VALUE klass )
352354

353355
conninfo = rb_funcall2( klass, rb_intern("parse_connect_args"), argc, argv );
354356
ping = gvl_PQping( StringValueCStr(conninfo) );
357+
RB_GC_GUARD(conninfo);
355358

356359
return INT2FIX((int)ping);
357360
}
@@ -580,6 +583,7 @@ pgconn_reset_start2( VALUE self, VALUE conninfo )
580583

581584
/* Start new connection */
582585
this->pgconn = gvl_PQconnectStart( p_conninfo );
586+
RB_GC_GUARD(conninfo);
583587

584588
if( this->pgconn == NULL )
585589
rb_raise(rb_ePGerror, "PQconnectStart() unable to allocate PGconn structure");

0 commit comments

Comments
 (0)