ACTINIC.pm - sub ProcessEscapableText fails to properly detect multiple instances of embedded HTML. All versions up to 6.1.4 are affected.
Symptoms:
In View Search Settings / Results / Display Options, check "Description". Now into a product description put some embedded HTML e.g.
Normal description!!<<font color=red>>!!this is red!!<</font>>!! and this is normal.
Now upload and search for that product and the results will be garbled.
Cause:
The lines
Are not splitting the text as expected. The first line is only matching once and $sEndPart contains all text after the 1st lot of embedded HTML.
Solution:
The existing code was too scary for me so I replace the entire routine with the following and it seems to work OK.
Norman
Symptoms:
In View Search Settings / Results / Display Options, check "Description". Now into a product description put some embedded HTML e.g.
Normal description!!<<font color=red>>!!this is red!!<</font>>!! and this is normal.
Now upload and search for that product and the results will be garbled.
Cause:
The lines
Code:
my (@PartsList) = ($sString =~ m/((.*?)!!<(.*?)>!!)*/g); my ($sEndPart) = ($sString =~ m/>!!(.*?)$/g); # get the closing encode text
Solution:
The existing code was too scary for me so I replace the entire routine with the following and it seems to work OK.
Code:
sub ProcessEscapableText { #? ACTINIC::ASSERT($#_ == 0, "Invalid argument count in ProcessEscapableText ($#_)", __LINE__, __FILE__); my ($sString) = @_; # # first see if there is any escaped text # my (@Response); if ($sString !~ /!!</) # no escaped text { return (EncodeText($sString)); # encode it } # # pick apart the string # my $sNewString = ''; while ( $sString =~ m/(.*?)!!<(.*?)>!!(.*)/ ) # pick out embedded HTML { @Response = EncodeText($1); # encode preceding text if ($Response[0] != $::SUCCESS) { return (@Response); } $sNewString .= $Response[1] . $2; # encode text + raw HTML $sString = $3; # now look for more } @Response = EncodeText($sString); # encode final part if ($Response[0] != $::SUCCESS) { return (@Response); } $sNewString .= $Response[1]; # add in final part return ($::SUCCESS, $sNewString, 0, 0); }
Norman
Comment