Committed by Greg Sabino Mullane <[email protected]>

Prevent core dump if the second argument to the quote()
method is anything but a hashref. Also make the output a little smarter in
that area. Add tests for same. (CPAN bug #101980)

---
 Changes        |  8 ++++++++
 Pg.xs          |  8 +++++++-
 t/03dbmethod.t | 20 +++++++++++++++++++-
 3 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/Changes b/Changes
index 8953de7..0c635bf 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,14 @@
  'GSM' is Greg Sabino Mullane, [email protected]
 
 
+Version ??
+
+  - Prevent core dump if the second argument to the quote() method 
+    is anything but a hashref
+    [Greg Sabino Mullane]
+    (CPAN bug #101980)
+
+
 Version 3.5.0  Released January 6, 2015 (git commit 
bb13d3306fd1c73fac1c0c8a330c14e6b8443942)
 
   - Allow "placeholder escaping" by the use of a backslash directly before it, 
e.g.
diff --git a/Pg.xs b/Pg.xs
index 3c7d4e6..3dde3f9 100644
--- a/Pg.xs
+++ b/Pg.xs
@@ -252,6 +252,9 @@ quote(dbh, to_quote_sv, type_sv=Nullsv)
                                }
                                else {
                                        SV **svp;
+                                       /* Currently the type argument must be 
a hashref, so throw an exception if not */
+                                       if (!SvROK(type_sv) || 
SvTYPE(SvRV(type_sv)) != SVt_PVHV)
+                                               croak("Second argument to quote 
must be a hashref");
                                        if ((svp = 
hv_fetch((HV*)SvRV(type_sv),"pg_type", 7, 0)) != NULL) {
                                                type_info = 
pg_type_data(SvIV(*svp));
                                        }
@@ -263,7 +266,10 @@ quote(dbh, to_quote_sv, type_sv=Nullsv)
                                        }
                                }
                                if (!type_info) {
-                                       warn("Unknown type %" IVdf ", 
defaulting to UNKNOWN",SvIV(type_sv));
+                                       if (NULL == type_info)
+                                               warn("No type given, defaulting 
to UNKNOWN");
+                                       else
+                                               warn("Unknown type %" IVdf ", 
defaulting to UNKNOWN", SvIV(type_sv));
                                        type_info = pg_type_data(PG_UNKNOWN);
                                }
                        }
diff --git a/t/03dbmethod.t b/t/03dbmethod.t
index 6103d98..764256b 100644
--- a/t/03dbmethod.t
+++ b/t/03dbmethod.t
@@ -26,7 +26,7 @@ my $dbh = connect_database();
 if (! $dbh) {
        plan skip_all => 'Connection to database failed, cannot continue 
testing';
 }
-plan tests => 559;
+plan tests => 562;
 
 isnt ($dbh, undef, 'Connect to database for database handle method testing');
 
@@ -1314,6 +1314,24 @@ is ($dbh->quote('foobar'), q{'foobar'}, $t);
 # Test various quote types
 #
 
+## Invalid type arguments
+$t='DB handle method "quote" throws exception on non-reference type argument';
+eval { $dbh->quote('abc', 'def'); };
+like ($@, qr{hashref}, $t);
+
+$t='DB handle method "quote" throws exception on arrayref type argument';
+eval { $dbh->quote('abc', ['arraytest']); };
+like ($@, qr{hashref}, $t);
+
+SKIP: {
+       eval { require Test::Warn; };
+       if ($@) {
+               skip ('Need Test::Warn for some tests', 1);
+       }
+
+       $t='DB handle method "quote" allows an empty hashref';
+       Test::Warn::warning_like ( sub { $dbh->quote('abc', {}); }, 
qr/UNKNOWN/, $t);
+}
 
 ## Points
 $t='DB handle method "quote" works with type PG_POINT';
-- 
1.8.4

Reply via email to