[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[lintian] 01/04: Solve regex recursion problem in comment stripping for minification



This is an automated email from the git hooks/post-receive script.

broucaries-guest pushed a commit to branch master
in repository lintian.

commit 0d634d703c092e01b3cf38f4df14140ea12f6232
Author: Bastien ROUCARIÈS <roucaries.bastien+debian@gmail.com>
Date:   Sun Aug 30 17:04:07 2015 +0200

    Solve regex recursion problem in comment stripping for minification
    
    Closes: #795955
---
 checks/cruft.pm | 55 +++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 37 insertions(+), 18 deletions(-)

diff --git a/checks/cruft.pm b/checks/cruft.pm
index 130a679..6d59263 100644
--- a/checks/cruft.pm
+++ b/checks/cruft.pm
@@ -931,31 +931,50 @@ sub _search_in_block0 {
     return;
 }
 
-# try to detect non human source based on line length
-sub _linelength_test {
-    my ($entry, $info, $name, $basename, $dirname, $block) = @_;
-    my $strip = $block;
-    # from perl faq strip comments
-    $strip
-      =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?(?=\n)|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;
-    # strip empty line
-    $strip =~ s/^\s*\n//mg;
-    # remove last \n
-    $strip =~ s/\n\Z//m;
-    # compute now means line length
-    my $total = length($strip);
-    if($total > 0) {
-        my $linelength = $total/($strip =~ tr/\n// + 1);
-        if($linelength > 255) {
+# detect if max line of block is > cutoff
+# return false if file is minified
+sub _linelength_test_maxlength_ok {
+    my ($entry, $info, $name, $basename, $dirname, $block, $cutoff) = @_;
+    while($block =~ /([^\n]+)\n?/g){
+        my $linelength = length($1);
+        if($linelength > $cutoff) {
             tag 'source-contains-prebuilt-javascript-object',
-              $name, 'mean line length is about', int($linelength),
-              'characters';
+              $name, 'line length is', int($linelength),
+              "characters (>$cutoff)";
             # Check for missing source.  It will check
             # for the source file in well known directories
             check_missing_source($entry,$info,$name,$basename,$dirname,
                 [['(?i)\.js$','.debug.js'],['(?i)\.js$','-debug.js'],['','']]);
+            return 0;
         }
     }
+    return 1;
+}
+
+# try to detect non human source based on line length
+sub _linelength_test {
+    my ($entry, $info, $name, $basename, $dirname, $block) = @_;
+
+    # first check if line > 1024 that is likely minification
+    if(
+        _linelength_test_maxlength_ok(
+            $entry, $info, $name, $basename, $dirname, $block,1024
+        )
+      ) {
+# now try to be more clever and work only on the 8192 character in order to avoid
+# regexp recursion problems
+        my $strip = substr($block,0,8192);
+        # from perl faq strip comments
+        $strip
+          =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?(?=\n)|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;
+        # strip empty line
+        $strip =~ s/^\s*\n//mg;
+        # remove last \n
+        $strip =~ s/\n\Z//m;
+        _linelength_test_maxlength_ok(
+            $entry, $info, $name, $basename, $dirname, $strip,256
+          );
+    }
     return;
 }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/lintian/lintian.git


Reply to: