From 1ec3e20bdee6ad3648e285c586b96fad9dbef0fb Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Fri, 10 Jan 2025 09:27:17 +0100 Subject: [PATCH] Verify array input to PG::TypeMapByColumn This could cause a segfault. Fixes #620 --- ext/pg_type_map_by_column.c | 1 + spec/pg/type_map_by_column_spec.rb | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/ext/pg_type_map_by_column.c b/ext/pg_type_map_by_column.c index 20e3a3893..61d621020 100644 --- a/ext/pg_type_map_by_column.c +++ b/ext/pg_type_map_by_column.c @@ -54,6 +54,7 @@ pg_tmbc_fit_to_query( VALUE self, VALUE params ) t_tmbc *this = RTYPEDDATA_DATA( self ); t_typemap *default_tm; + Check_Type(params, T_ARRAY); nfields = (int)RARRAY_LEN( params ); if ( this->nfields != nfields ) { rb_raise( rb_eArgError, "number of result fields (%d) does not match number of mapped columns (%d)", diff --git a/spec/pg/type_map_by_column_spec.rb b/spec/pg/type_map_by_column_spec.rb index b73f124a1..15bc696a6 100644 --- a/spec/pg/type_map_by_column_spec.rb +++ b/spec/pg/type_map_by_column_spec.rb @@ -182,6 +182,12 @@ def decode(res, tuple, field) expect{ PG::TypeMapByColumn.new( [123] ) }.to raise_error(TypeError, /wrong argument type (Integer|Fixnum)/) end + it "should raise an error for invalid input when used as type_map" do + map = PG::TypeMapByColumn.new([PG::TextEncoder::Integer.new]) + record_encoder = PG::TextEncoder::Record.new(type_map: map) + expect{ record_encoder.encode(123) }.to raise_error(TypeError) + end + it "shouldn't allow result mappings with different number of fields" do res = @conn.exec( "SELECT 1" ) expect{ res.type_map = PG::TypeMapByColumn.new([]) }.to raise_error(ArgumentError, /mapped columns/)