Subject: | date::iso can throw warnings in certain conditions (with patch) |
date::iso can throw warnings under certain conditions, like when its
given a true but obviously non-date value and options like past and
present are there.
$ perl -Twle 'use CGI::ValidOp; use CGI::ValidOp::Test; check_check(
"date::iso(past,present)", "foobar", undef, 0 );'
ok 1
ok 2
ok 3 - testing: foobar = with date::iso(past,present)
Use of uninitialized value $value[0] in numeric gt (>) at
/usr/local/perl/5.10.1/lib/site_perl/5.10.1/CGI/ValidOp/Check/date.pm
line 98.
ok 4 - -e : 1
# Tests were run but no plan was declared and done_testing() was not seen.
Turns out the problem is my($y,$m,$d) = check_iso_format($value) or
return; and that
check_iso_format() will sometimes return an explicit undef. The above
is actually:
( my($y,$m,$d = check_iso_format($value) ) or return; so when
check_iso_format()
returns undef the LHS of that condition is a list of size one which is true.
The solution is to use just "return" which will do the right thing.
Patch attached.
Subject: | 0001-Given-a-true-but-invalid-ISO-date-the-check-would-wa.patch |
From 0bd54274bc8e2a3cee7fccfece7362e30a926051 Mon Sep 17 00:00:00 2001
From: Michael G. Schwern <schwern@pobox.com>
Date: Thu, 5 Aug 2010 19:57:34 -0700
Subject: [PATCH] Given a true but invalid ISO date, the check would warn.
Turns out the problem is my($y,$m,$d) = check_iso_format($value) or return; and that
check_iso_format() will sometimes return an explicit undef. The above is actually:
( my($y,$m,$d = check_iso_format($value) ) or return; so when check_iso_format()
returns undef the LHS of that condition is a list of size one which is true.
The solution is to use just "return" which will do the right thing.
---
lib/CGI/ValidOp/Check/date.pm | 4 ++--
t/16check_date.t | 4 +++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/lib/CGI/ValidOp/Check/date.pm b/lib/CGI/ValidOp/Check/date.pm
index 3574ea7..3ac0869 100644
--- a/lib/CGI/ValidOp/Check/date.pm
+++ b/lib/CGI/ValidOp/Check/date.pm
@@ -120,7 +120,7 @@ sub check_iso_format {
my( $y, $m, $d ) =
$date =~ qr#^(\d{1,4})-(\d{1,2})-(\d{1,2})$#
- or return undef;
+ or return;
return ($y, $m, $d);
}
@@ -133,7 +133,7 @@ sub check_american_format {
my( $m, $d, $y ) =
$date =~ qr#^(\d{1,2})(?:-|/)(\d{1,2})(?:-|/)(\d{4})$#
- or return undef;
+ or return;
return ($y, $m, $d);
}
diff --git a/t/16check_date.t b/t/16check_date.t
index 932f980..83d14fa 100755
--- a/t/16check_date.t
+++ b/t/16check_date.t
@@ -6,7 +6,8 @@ use lib qw/ t lib /;
use CGI::ValidOp::Test;
-use Test::More tests => 607;
+use Test::NoWarnings;
+use Test::More tests => 612;
use vars qw/ $one $errmsg /;
use Data::Dumper;
use Test::Taint;
@@ -130,6 +131,7 @@ BEGIN { use_ok( 'CGI::ValidOp::Param' )}
# iso
my $errmsg = 'William Blake must include year, month, and date as YYYY-MM-DD';
check_check( 'date::iso', undef, undef, 0 );
+ check_check( 'date::iso(past,present)', 'foobar', undef, 0 );
check_check( 'date::iso', 10, undef, 0, $errmsg );
check_check( 'date::iso', '2004', undef, 0, $errmsg );
check_check( 'date::iso', '2004-10', undef, 0, $errmsg );
--
1.7.2