On Thu, Aug 26, 2004 at 08:25:05AM +1000, Carl Brewer wrote:
> sub hash_post {
>     # this has to get called instead of read_post, as read_post()
>     # gobbles up the POST arguments and they're no longer available...
>     # and this calls read_post() :)
> 
>     # returns a hash of all the POST values
> 
>     my ($r) = shift;
> 
>     my $post_string = CB::read_post($r);
>     my %rethash = {};
> 
>     my @bits = split(/&/, $post_string);
>     foreach my $bit (@bits) {
>         $bit =~ /^(.*)=(.*)$/;
>         my $key = CGI::Util::unescape($1);
>         my $value = CGI::Util::unescape($2);
>         $rethash{$key} = $value;
>     }
>     return %rethash;
> }


A really quick look and I see that 
>         $bit =~ /^(.*)=(.*)$/;
should be
          $bit =~ /^(.*?)=(.*)$/ || next;
or else the greedy match in the key will grab up to an "=" sign
in the value, if one exists.  Also, you do double work on a
sequence without any '=' sign, because $1 and $2 will still be
the same from the previous match if there was one, or else might
be a previous match from elsewhere in the program (!) if there
was not a previous key/value in the $post_string.

The line should really be
          $bit =~ /^(.+?)=(.*)$/;
if you want to handle those and additionally wish to disallow
empty keys, either.

If you do want to allow key/value pairs without "=", then a
slight variation in code should be used.


However, these probably have nothing to do with the question you
are asking; I'm just pointing out a bug in the code you posted.

Cheers,
Glenn

-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html

Reply via email to