<p>Martin Roth has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/28046">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">util/lint: update checkpatch.pl to latest linux version<br><br>Change-Id: I43d09a912fafe896c045df080c0f75fe6d908087<br>Signed-off-by: Martin Roth <martinroth@google.com><br>---<br>M util/lint/checkpatch.pl<br>1 file changed, 279 insertions(+), 189 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/46/28046/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/util/lint/checkpatch.pl b/util/lint/checkpatch.pl</span><br><span>index c35a0d6..265b04c 100755</span><br><span>--- a/util/lint/checkpatch.pl</span><br><span>+++ b/util/lint/checkpatch.pl</span><br><span>@@ -1,9 +1,11 @@</span><br><span> #!/usr/bin/env perl</span><br><span style="color: hsl(120, 100%, 40%);">+# SPDX-License-Identifier: GPL-2.0</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span> # (c) 2001, Dave Jones. (the file handling bit)</span><br><span> # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)</span><br><span> # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)</span><br><span> # (c) 2008-2010 Andy Whitcroft <apw@canonical.com></span><br><span style="color: hsl(0, 100%, 40%);">-# Licensed under the terms of the GNU GPL License version 2</span><br><span style="color: hsl(120, 100%, 40%);">+# (c) 2010-2018 Joe Perches <joe@perches.com></span><br><span> </span><br><span> use strict;</span><br><span> use warnings;</span><br><span>@@ -464,6 +466,7 @@</span><br><span> our $logFunctions = qr{(?x:</span><br><span>         printk(?:_ratelimited|_once|_deferred_once|_deferred|)|</span><br><span>      (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|</span><br><span style="color: hsl(120, 100%, 40%);">+    TP_printk|</span><br><span>   WARN(?:_RATELIMIT|_ONCE|)|</span><br><span>   panic|</span><br><span>       MODULE_[A-Z_]+|</span><br><span>@@ -575,6 +578,7 @@</span><br><span>        $mode_perms_search .= '|' if ($mode_perms_search ne "");</span><br><span>   $mode_perms_search .= $entry->[0];</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+$mode_perms_search = "(?:${mode_perms_search})";</span><br><span> </span><br><span> our $mode_perms_world_writable = qr{</span><br><span>   S_IWUGO         |</span><br><span>@@ -609,6 +613,37 @@</span><br><span>     $mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");</span><br><span>     $mode_perms_string_search .= $entry;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";</span><br><span style="color: hsl(120, 100%, 40%);">+our $multi_mode_perms_string_search = qr{</span><br><span style="color: hsl(120, 100%, 40%);">+     ${single_mode_perms_string_search}</span><br><span style="color: hsl(120, 100%, 40%);">+    (?:\s*\|\s*${single_mode_perms_string_search})*</span><br><span style="color: hsl(120, 100%, 40%);">+}x;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sub perms_to_octal {</span><br><span style="color: hsl(120, 100%, 40%);">+  my ($string) = @_;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ my $val = "";</span><br><span style="color: hsl(120, 100%, 40%);">+       my $oval = "";</span><br><span style="color: hsl(120, 100%, 40%);">+      my $to = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   my $curpos = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       my $lastpos = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {</span><br><span style="color: hsl(120, 100%, 40%);">+              $curpos = pos($string);</span><br><span style="color: hsl(120, 100%, 40%);">+               my $match = $2;</span><br><span style="color: hsl(120, 100%, 40%);">+               my $omatch = $1;</span><br><span style="color: hsl(120, 100%, 40%);">+              last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));</span><br><span style="color: hsl(120, 100%, 40%);">+         $lastpos = $curpos;</span><br><span style="color: hsl(120, 100%, 40%);">+           $to |= $mode_permission_string_types{$match};</span><br><span style="color: hsl(120, 100%, 40%);">+         $val .= '\s*\|\s*' if ($val ne "");</span><br><span style="color: hsl(120, 100%, 40%);">+         $val .= $match;</span><br><span style="color: hsl(120, 100%, 40%);">+               $oval .= $omatch;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     $oval =~ s/^\s*\|\s*//;</span><br><span style="color: hsl(120, 100%, 40%);">+       $oval =~ s/\s*\|\s*$//;</span><br><span style="color: hsl(120, 100%, 40%);">+       return sprintf("%04o", $to);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> our $allowed_asm_includes = qr{(?x:</span><br><span>         irq|</span><br><span>@@ -768,7 +803,8 @@</span><br><span> our $declaration_macros = qr{(?x:</span><br><span>      (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|</span><br><span>         (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|</span><br><span style="color: hsl(0, 100%, 40%);">-   (?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(</span><br><span style="color: hsl(120, 100%, 40%);">+      (?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(|</span><br><span style="color: hsl(120, 100%, 40%);">+     (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(</span><br><span> )};</span><br><span> </span><br><span> sub deparenthesize {</span><br><span>@@ -1056,7 +1092,7 @@</span><br><span>       } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {</span><br><span>            $address = $1;</span><br><span>               $comment = $2 if defined $2;</span><br><span style="color: hsl(0, 100%, 40%);">-            $formatted_email =~ s/$address.*$//;</span><br><span style="color: hsl(120, 100%, 40%);">+          $formatted_email =~ s/\Q$address\E.*$//;</span><br><span>             $name = $formatted_email;</span><br><span>            $name = trim($name);</span><br><span>                 $name =~ s/^\"|\"$//g;</span><br><span>@@ -1198,7 +1234,7 @@</span><br><span>     for ($off = 1; $off < length($line); $off++) {</span><br><span>            $c = substr($line, $off, 1);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # Comments we are wacking completly including the begin</span><br><span style="color: hsl(120, 100%, 40%);">+               # Comments we are whacking completely including the begin</span><br><span>            # and end, all to $;.</span><br><span>                if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {</span><br><span>                       $sanitise_quote = '*/';</span><br><span>@@ -1278,6 +1314,7 @@</span><br><span> sub get_quoted_string {</span><br><span>   my ($line, $rawline) = @_;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        return "" if (!defined($line) || !defined($rawline));</span><br><span>      return "" if ($line !~ m/($String)/g);</span><br><span>     return substr($rawline, $-[0], $+[0] - $-[0]);</span><br><span> }</span><br><span>@@ -1631,6 +1668,28 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+sub get_stat_real {</span><br><span style="color: hsl(120, 100%, 40%);">+       my ($linenr, $lc) = @_;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     my $stat_real = raw_line($linenr, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (my $count = $linenr + 1; $count <= $lc; $count++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           $stat_real = $stat_real . "\n" . raw_line($count, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return $stat_real;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sub get_stat_here {</span><br><span style="color: hsl(120, 100%, 40%);">+  my ($linenr, $cnt, $here) = @_;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     my $herectx = $here . "\n";</span><br><span style="color: hsl(120, 100%, 40%);">+ for (my $n = 0; $n < $cnt; $n++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return $herectx;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> sub cat_vet {</span><br><span>       my ($vet) = @_;</span><br><span>      my ($res, $coded);</span><br><span>@@ -2244,6 +2303,8 @@</span><br><span> </span><br><span>       my $camelcase_file_seeded = 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    my $checklicenseline = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  sanitise_line_reset();</span><br><span>       my $line;</span><br><span>    foreach my $rawline (@rawlines) {</span><br><span>@@ -2336,6 +2397,14 @@</span><br><span> </span><br><span>               my $rawline = $rawlines[$linenr - 1];</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# check if it's a mode change, rename or start of a patch</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!$in_commit_log &&</span><br><span style="color: hsl(120, 100%, 40%);">+                    ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ ||</span><br><span style="color: hsl(120, 100%, 40%);">+              ($line =~ /^rename (?:from|to) \S+\s*$/ ||</span><br><span style="color: hsl(120, 100%, 40%);">+                     $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  $is_patch = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #extract the line range in the file after the patch is applied</span><br><span>                if (!$in_commit_log &&</span><br><span>                   $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {</span><br><span>@@ -2446,6 +2515,7 @@</span><br><span>                      } else {</span><br><span>                             $check = $check_orig;</span><br><span>                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     $checklicenseline = 1;</span><br><span>                       next;</span><br><span>                }</span><br><span> </span><br><span>@@ -2567,12 +2637,6 @@</span><br><span>                            "A patch subject line should describe the change not the tool that found it\n" . $herecurr);</span><br><span>          }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Check for old stable address</span><br><span style="color: hsl(0, 100%, 40%);">-             if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     ERROR("STABLE_ADDRESS",</span><br><span style="color: hsl(0, 100%, 40%);">-                             "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # Check for unwanted Gerrit info</span><br><span>                if ($in_commit_log && $line =~ /^\s*change-id:/i) {</span><br><span>                  ERROR("GERRIT_CHANGE_ID",</span><br><span>@@ -2795,7 +2859,10 @@</span><br><span> # Only applies when adding the entry originally, after that we do not have</span><br><span> # sufficient context to determine whether it is indeed long enough.</span><br><span>            if ($realfile =~ /Kconfig/ &&</span><br><span style="color: hsl(0, 100%, 40%);">-               $line =~ /^\+\s*config\s+/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 # 'choice' is usually the last thing on the line (though</span><br><span style="color: hsl(120, 100%, 40%);">+              # Kconfig supports named choices), so use a word boundary</span><br><span style="color: hsl(120, 100%, 40%);">+             # (\b) rather than a whitespace character (\s)</span><br><span style="color: hsl(120, 100%, 40%);">+                $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {</span><br><span>                       my $length = 0;</span><br><span>                      my $cnt = $realcnt;</span><br><span>                  my $ln = $linenr + 1;</span><br><span>@@ -2810,9 +2877,13 @@</span><br><span>                               next if ($f =~ /^-/);</span><br><span>                                last if (!$file && $f =~ /^\@\@/);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                          if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {</span><br><span>                                   $is_start = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                          } elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          } elsif ($lines[$ln - 1] =~ /^\+\s*(?:help|---help---)\s*$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        if ($lines[$ln - 1] =~ "---help---") {</span><br><span style="color: hsl(120, 100%, 40%);">+                                              WARN("CONFIG_DESCRIPTION",</span><br><span style="color: hsl(120, 100%, 40%);">+                                               "prefer 'help' over '---help---' for new help texts\n" . $herecurr);</span><br><span style="color: hsl(120, 100%, 40%);">+                                   }</span><br><span>                                    $length = -1;</span><br><span>                                }</span><br><span> </span><br><span>@@ -2820,7 +2891,13 @@</span><br><span>                               $f =~ s/#.*//;</span><br><span>                               $f =~ s/^\s+//;</span><br><span>                              next if ($f =~ /^$/);</span><br><span style="color: hsl(0, 100%, 40%);">-                           if ($f =~ /^\s*config\s/) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                         # This only checks context lines in the patch</span><br><span style="color: hsl(120, 100%, 40%);">+                         # and so hopefully shouldn't trigger false</span><br><span style="color: hsl(120, 100%, 40%);">+                                # positives, even though some of these are</span><br><span style="color: hsl(120, 100%, 40%);">+                            # common words in help texts</span><br><span style="color: hsl(120, 100%, 40%);">+                          if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|</span><br><span style="color: hsl(120, 100%, 40%);">+                                           if|endif|menu|endmenu|source)\b/x) {</span><br><span>                                       $is_end = 1;</span><br><span>                                         last;</span><br><span>                                }</span><br><span>@@ -2896,6 +2973,30 @@</span><br><span>                   }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# check for using SPDX license tag at beginning of files</span><br><span style="color: hsl(120, 100%, 40%);">+               if ($realline == $checklicenseline) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               $checklicenseline = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+                        } elsif ($rawline =~ /^\+/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         my $comment = "";</span><br><span style="color: hsl(120, 100%, 40%);">+                           if ($realfile =~ /\.(h|s|S)$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      $comment = '/*';</span><br><span style="color: hsl(120, 100%, 40%);">+                              } elsif ($realfile =~ /\.(c|dts|dtsi)$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    $comment = '//';</span><br><span style="color: hsl(120, 100%, 40%);">+                              } elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   $comment = '#';</span><br><span style="color: hsl(120, 100%, 40%);">+                               } elsif ($realfile =~ /\.rst$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     $comment = '..';</span><br><span style="color: hsl(120, 100%, 40%);">+                              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                           if ($comment !~ /^$/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                   $rawline !~ /^\+\Q$comment\E SPDX-License-Identifier: /) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        WARN("SPDX_LICENSE_TAG",</span><br><span style="color: hsl(120, 100%, 40%);">+                                         "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);</span><br><span style="color: hsl(120, 100%, 40%);">+                           }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # check we are in a valid source file if not then ignore this hunk</span><br><span>            next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);</span><br><span> </span><br><span>@@ -2905,6 +3006,7 @@</span><br><span> #     logging functions like pr_info that end in a string</span><br><span> #        lines with a single string</span><br><span> # #defines that are a single string</span><br><span style="color: hsl(120, 100%, 40%);">+#    lines with an RFC3986 like URL</span><br><span> #</span><br><span> # There are 3 different line length message types:</span><br><span> # LONG_LINE_COMMENT        a comment starts before but extends beyond $max_line_length</span><br><span>@@ -2931,8 +3033,13 @@</span><br><span>                                  $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {</span><br><span>                             $msg_type = "";</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   # EFI_GUID is another special case</span><br><span style="color: hsl(0, 100%, 40%);">-                      } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   # More special cases</span><br><span style="color: hsl(120, 100%, 40%);">+                  } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||</span><br><span style="color: hsl(120, 100%, 40%);">+                            $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                $msg_type = "";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   # URL ($rawline is used in case the URL is in a comment)</span><br><span style="color: hsl(120, 100%, 40%);">+                      } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {</span><br><span>                           $msg_type = "";</span><br><span> </span><br><span>                        # Otherwise set the alternate message types</span><br><span>@@ -2961,20 +3068,6 @@</span><br><span>                              "adding a line without newline at end of file\n" . $herecurr);</span><br><span>                }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Blackfin: use hi/lo macros</span><br><span style="color: hsl(0, 100%, 40%);">-               if ($realfile =~ m@arch/blackfin/.*\.S$@) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              my $herevet = "$here\n" . cat_vet($line) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                            ERROR("LO_MACRO",</span><br><span style="color: hsl(0, 100%, 40%);">-                                   "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           my $herevet = "$here\n" . cat_vet($line) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                            ERROR("HI_MACRO",</span><br><span style="color: hsl(0, 100%, 40%);">-                                   "use the HI() macro, not (... >> 16)\n" . $herevet);</span><br><span style="color: hsl(0, 100%, 40%);">-                      }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # check we are in a valid source file C or perl if not then ignore this hunk</span><br><span>            next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);</span><br><span> </span><br><span>@@ -3004,6 +3097,12 @@</span><br><span>                  }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# check for assignments on the start of a line</span><br><span style="color: hsl(120, 100%, 40%);">+         if ($sline =~ /^\+\s+($Assignment)[^=]/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    CHK("ASSIGNMENT_CONTINUATIONS",</span><br><span style="color: hsl(120, 100%, 40%);">+                         "Assignment operator '$1' should be on the previous line\n" . $hereprev);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # check for && or || at the start of a line</span><br><span>           if ($rawline =~ /^\+\s*(&&|\|\|)/) {</span><br><span>                         CHK("LOGICAL_CONTINUATIONS",</span><br><span>@@ -3012,7 +3111,7 @@</span><br><span> </span><br><span> # check indentation starts on a tab stop</span><br><span>               if ($^V && $^V ge 5.10.0 &&</span><br><span style="color: hsl(0, 100%, 40%);">-                 $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$))/) {</span><br><span style="color: hsl(120, 100%, 40%);">+              $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {</span><br><span>                        my $indent = length($1);</span><br><span>                     if ($indent % 8) {</span><br><span>                           if (WARN("TABSTOP",</span><br><span>@@ -3134,6 +3233,7 @@</span><br><span>                      $line =~ /^\+[a-z_]*init/ ||</span><br><span>                 $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||</span><br><span>                $line =~ /^\+\s*DECLARE/ ||</span><br><span style="color: hsl(120, 100%, 40%);">+                   $line =~ /^\+\s*builtin_[\w_]*driver/ ||</span><br><span>                     $line =~ /^\+\s*__setup/)) {</span><br><span>                   if (CHK("LINE_SPACING",</span><br><span>                            "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&</span><br><span>@@ -3213,6 +3313,12 @@</span><br><span> # check we are in a valid C source file if not then ignore this hunk</span><br><span>                 next if ($realfile !~ /\.(h|c)$/);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# check for unusual line ending [ or (</span><br><span style="color: hsl(120, 100%, 40%);">+                if ($line =~ /^\+.*([\[\(])\s*$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   CHK("OPEN_ENDED_LINE",</span><br><span style="color: hsl(120, 100%, 40%);">+                          "Lines should not end with a '$1'\n" . $herecurr);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # check if this appears to be the start function declaration, save the name</span><br><span>           if ($sline =~ /^\+\{\s*$/ &&</span><br><span>                     $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {</span><br><span>@@ -3254,18 +3360,6 @@</span><br><span>                          "CVS style keyword markers, these will _not_ be updated\n". $herecurr);</span><br><span>               }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Blackfin: don't use __builtin_bfin_[cs]sync</span><br><span style="color: hsl(0, 100%, 40%);">-          if ($line =~ /__builtin_bfin_csync/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  my $herevet = "$here\n" . cat_vet($line) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                    ERROR("CSYNC",</span><br><span style="color: hsl(0, 100%, 40%);">-                              "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               if ($line =~ /__builtin_bfin_ssync/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  my $herevet = "$here\n" . cat_vet($line) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                    ERROR("SSYNC",</span><br><span style="color: hsl(0, 100%, 40%);">-                              "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # check for old HOTPLUG __dev<foo> section markings</span><br><span>               if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {</span><br><span>                        WARN("HOTPLUG_SECTION",</span><br><span>@@ -3860,28 +3954,10 @@</span><br><span>                       "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);</span><br><span>               }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# printk should use KERN_* levels.  Note that follow on printk's on the</span><br><span style="color: hsl(0, 100%, 40%);">-# same line do not need a level, so we use the current block context</span><br><span style="color: hsl(0, 100%, 40%);">-# to try and find and validate the current printk.  In summary the current</span><br><span style="color: hsl(0, 100%, 40%);">-# printk includes all preceding printk's which have no newline on the end.</span><br><span style="color: hsl(0, 100%, 40%);">-# we assume the first bad printk is the one to report.</span><br><span style="color: hsl(0, 100%, 40%);">-              if ($line =~ /\bprintk\((?!KERN_)\s*"/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  my $ok = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                     for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              #print "CHECK<$lines[$ln - 1]\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                          # we have a preceding printk if it ends</span><br><span style="color: hsl(0, 100%, 40%);">-                         # with "\n" ignore it, else it is to blame</span><br><span style="color: hsl(0, 100%, 40%);">-                            if ($lines[$ln - 1] =~ m{\bprintk\(}) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 if ($rawlines[$ln - 1] !~ m{\\n"}) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                               $ok = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                        }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       last;</span><br><span style="color: hsl(0, 100%, 40%);">-                           }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if ($ok == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         WARN("PRINTK_WITHOUT_KERN_LEVEL",</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "printk() should include KERN_ facility level\n" . $herecurr);</span><br><span style="color: hsl(0, 100%, 40%);">-                   }</span><br><span style="color: hsl(120, 100%, 40%);">+# printk should use KERN_* levels</span><br><span style="color: hsl(120, 100%, 40%);">+          if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   WARN("PRINTK_WITHOUT_KERN_LEVEL",</span><br><span style="color: hsl(120, 100%, 40%);">+                        "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);</span><br><span>           }</span><br><span> </span><br><span>                if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {</span><br><span>@@ -3922,12 +3998,12 @@</span><br><span> </span><br><span> # function brace can't be on same line, except for #defines of do while,</span><br><span> # or if closed on same line</span><br><span style="color: hsl(0, 100%, 40%);">-            if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and</span><br><span style="color: hsl(0, 100%, 40%);">-               #coreboot - Ignore struct lines with attributes - they're not functions</span><br><span style="color: hsl(0, 100%, 40%);">-             ($line!~/struct.*__attribute__\(\(.*\)\)/) and</span><br><span style="color: hsl(0, 100%, 40%);">-                  !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if ($^V && $^V ge 5.10.0 &&</span><br><span style="color: hsl(120, 100%, 40%);">+               $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                 $sline !~ /\#\s*define\b.*do\s*\{/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                 $sline !~ /}/) {</span><br><span>                         if (ERROR("OPEN_BRACE",</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "open brace '{' following function declarations go on the next line\n" . $herecurr) &&</span><br><span style="color: hsl(120, 100%, 40%);">+                              "open brace '{' following function definitions go on the next line\n" . $herecurr) &&</span><br><span>                        $fix) {</span><br><span>                          fix_delete_line($fixlinenr, $rawline);</span><br><span>                               my $fixed_line = $rawline;</span><br><span>@@ -4533,7 +4609,9 @@</span><br><span>           }</span><br><span> </span><br><span> # check for unnecessary parentheses around comparisons in if uses</span><br><span style="color: hsl(0, 100%, 40%);">-              if ($^V && $^V ge 5.10.0 && defined($stat) &&</span><br><span style="color: hsl(120, 100%, 40%);">+# when !drivers/staging or command-line uses --strict</span><br><span style="color: hsl(120, 100%, 40%);">+          if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&</span><br><span style="color: hsl(120, 100%, 40%);">+             $^V && $^V ge 5.10.0 && defined($stat) &&</span><br><span>                    $stat =~ /(^.\s*if\s*($balanced_parens))/) {</span><br><span>                     my $if_stat = $1;</span><br><span>                    my $test = substr($2, 1, -1);</span><br><span>@@ -4944,12 +5022,8 @@</span><br><span>                       #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";</span><br><span> </span><br><span>                      $ctx =~ s/\n*$//;</span><br><span style="color: hsl(0, 100%, 40%);">-                       my $herectx = $here . "\n";</span><br><span>                        my $stmt_cnt = statement_rawlines($ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                        for (my $n = 0; $n < $stmt_cnt; $n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                     my $herectx = get_stat_here($linenr, $stmt_cnt, $here);</span><br><span> </span><br><span>                  if ($dstat ne '' &&</span><br><span>                      $dstat !~ /^(?:$Ident|-?$Constant),$/ &&                    # 10, // foo(),</span><br><span>@@ -5004,7 +5078,7 @@</span><br><span>                              $tmp_stmt =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;</span><br><span>                            $tmp_stmt =~ s/\#+\s*$arg\b//g;</span><br><span>                              $tmp_stmt =~ s/\b$arg\s*\#\#//g;</span><br><span style="color: hsl(0, 100%, 40%);">-                                my $use_cnt = $tmp_stmt =~ s/\b$arg\b//g;</span><br><span style="color: hsl(120, 100%, 40%);">+                             my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;</span><br><span>                                 if ($use_cnt > 1) {</span><br><span>                                       CHK("MACRO_ARG_REUSE",</span><br><span>                                         "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");</span><br><span>@@ -5021,12 +5095,9 @@</span><br><span> # check for macros with flow control, but without ## concatenation</span><br><span> # ## concatenation is commonly a macro that defines a function so ignore those</span><br><span>                     if ($has_flow_statement && !$has_arg_concat) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          my $herectx = $here . "\n";</span><br><span>                                my $cnt = statement_rawlines($ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+                           my $herectx = get_stat_here($linenr, $cnt, $here);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                          for (my $n = 0; $n < $cnt; $n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span>                            WARN("MACRO_WITH_FLOW_CONTROL",</span><br><span>                                 "Macros with flow control statements should be avoided\n" . "$herectx");</span><br><span>                    }</span><br><span>@@ -5066,11 +5137,7 @@</span><br><span> </span><br><span>                               $ctx =~ s/\n*$//;</span><br><span>                            my $cnt = statement_rawlines($ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-                             my $herectx = $here . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                           for (my $n = 0; $n < $cnt; $n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                             my $herectx = get_stat_here($linenr, $cnt, $here);</span><br><span> </span><br><span>                               if (($stmts =~ tr/;/;/) == 1 &&</span><br><span>                                  $stmts !~ /^\s*(if|while|for|switch)\b/) {</span><br><span>@@ -5084,27 +5151,13 @@</span><br><span>                     } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {</span><br><span>                             $ctx =~ s/\n*$//;</span><br><span>                            my $cnt = statement_rawlines($ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-                             my $herectx = $here . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                           for (my $n = 0; $n < $cnt; $n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                             my $herectx = get_stat_here($linenr, $cnt, $here);</span><br><span> </span><br><span>                               WARN("TRAILING_SEMICOLON",</span><br><span>                                      "macros should not use a trailing semicolon\n" . "$herectx");</span><br><span>                       }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...</span><br><span style="color: hsl(0, 100%, 40%);">-# all assignments may have only one of the following with an assignment:</span><br><span style="color: hsl(0, 100%, 40%);">-#  .</span><br><span style="color: hsl(0, 100%, 40%);">-#      ALIGN(...)</span><br><span style="color: hsl(0, 100%, 40%);">-#     VMLINUX_SYMBOL(...)</span><br><span style="color: hsl(0, 100%, 40%);">-             if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     WARN("MISSING_VMLINUX_SYMBOL",</span><br><span style="color: hsl(0, 100%, 40%);">-                             "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # check for redundant bracing round if etc</span><br><span>              if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {</span><br><span>                    my ($level, $endln, @chunks) =</span><br><span>@@ -5211,12 +5264,8 @@</span><br><span>                              }</span><br><span>                    }</span><br><span>                    if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           my $herectx = $here . "\n";</span><br><span>                                my $cnt = statement_rawlines($block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                           for (my $n = 0; $n < $cnt; $n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                             my $herectx = get_stat_here($linenr, $cnt, $here);</span><br><span> </span><br><span>                               WARN("BRACES",</span><br><span>                                  "braces {} are not necessary for single statement blocks\n" . $herectx);</span><br><span>@@ -5351,7 +5400,7 @@</span><br><span>              }</span><br><span> </span><br><span> # check for line continuations in quoted strings with odd counts of "</span><br><span style="color: hsl(0, 100%, 40%);">-             if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {</span><br><span>                  WARN("LINE_CONTINUATIONS",</span><br><span>                              "Avoid line continuations in quoted strings\n" . $herecurr);</span><br><span>          }</span><br><span>@@ -5630,6 +5679,12 @@</span><br><span>                   }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# check for smp_read_barrier_depends and read_barrier_depends</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!$file && $line =~ /\b(smp_|)read_barrier_depends\s*\(/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        WARN("READ_BARRIER_DEPENDS",</span><br><span style="color: hsl(120, 100%, 40%);">+                             "$1read_barrier_depends should only be used in READ_ONCE or DEC Alpha code\n" . $herecurr);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # check of hardware specific defines</span><br><span>          if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {</span><br><span>                      CHK("ARCH_DEFINES",</span><br><span>@@ -5786,29 +5841,50 @@</span><br><span>                      }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           # check for vsprintf extension %p<foo> misuses</span><br><span style="color: hsl(120, 100%, 40%);">+# check for vsprintf extension %p<foo> misuses</span><br><span>           if ($^V && $^V ge 5.10.0 &&</span><br><span>              defined $stat &&</span><br><span>                     $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&</span><br><span>                 $1 !~ /^_*volatile_*$/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   my $bad_extension = "";</span><br><span style="color: hsl(120, 100%, 40%);">+                     my $stat_real;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                     my $lc = $stat =~ tr@\n@@;</span><br><span>                   $lc = $lc + $linenr;</span><br><span>                         for (my $count = $linenr; $count <= $lc; $count++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               my $specifier;</span><br><span style="color: hsl(120, 100%, 40%);">+                                my $extension;</span><br><span style="color: hsl(120, 100%, 40%);">+                                my $bad_specifier = "";</span><br><span>                            my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));</span><br><span>                                $fmt =~ s/%%//g;</span><br><span style="color: hsl(0, 100%, 40%);">-                                if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGNO]).)/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                       $bad_extension = $1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                    last;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                               while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                       $specifier = $1;</span><br><span style="color: hsl(120, 100%, 40%);">+                                      $extension = $2;</span><br><span style="color: hsl(120, 100%, 40%);">+                                      if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOx]/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                             $bad_specifier = $specifier;</span><br><span style="color: hsl(120, 100%, 40%);">+                                          last;</span><br><span style="color: hsl(120, 100%, 40%);">+                                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     if ($extension eq "x" && !defined($stat_real)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                            if (!defined($stat_real)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   $stat_real = get_stat_real($linenr, $lc);</span><br><span style="color: hsl(120, 100%, 40%);">+                                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                                             WARN("VSPRINTF_SPECIFIER_PX",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                    }</span><br><span>                            }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if ($bad_extension ne "") {</span><br><span style="color: hsl(0, 100%, 40%);">-                           my $stat_real = raw_line($linenr, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                           for (my $count = $linenr + 1; $count <= $lc; $count++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     $stat_real = $stat_real . "\n" . raw_line($count, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                               if ($bad_specifier ne "") {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 my $stat_real = get_stat_real($linenr, $lc);</span><br><span style="color: hsl(120, 100%, 40%);">+                                  my $ext_type = "Invalid";</span><br><span style="color: hsl(120, 100%, 40%);">+                                   my $use = "";</span><br><span style="color: hsl(120, 100%, 40%);">+                                       if ($bad_specifier =~ /p[Ff]/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                              $ext_type = "Deprecated";</span><br><span style="color: hsl(120, 100%, 40%);">+                                           $use = " - use %pS instead";</span><br><span style="color: hsl(120, 100%, 40%);">+                                                $use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);</span><br><span style="color: hsl(120, 100%, 40%);">+                                 }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                   WARN("VSPRINTF_POINTER_EXTENSION",</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");</span><br><span>                             }</span><br><span style="color: hsl(0, 100%, 40%);">-                               WARN("VSPRINTF_POINTER_EXTENSION",</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "Invalid vsprintf pointer extension '$bad_extension'\n" . "$here\n$stat_real\n");</span><br><span>                   }</span><br><span>            }</span><br><span> </span><br><span>@@ -5921,10 +5997,7 @@</span><br><span>                    $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {</span><br><span>                       my $lc = $stat =~ tr@\n@@;</span><br><span>                   $lc = $lc + $linenr;</span><br><span style="color: hsl(0, 100%, 40%);">-                    my $stat_real = raw_line($linenr, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                   for (my $count = $linenr + 1; $count <= $lc; $count++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             $stat_real = $stat_real . "\n" . raw_line($count, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     my $stat_real = get_stat_real($linenr, $lc);</span><br><span>                         WARN("NAKED_SSCANF",</span><br><span>                            "unchecked sscanf return value\n" . "$here\n$stat_real\n");</span><br><span>                 }</span><br><span>@@ -5935,10 +6008,7 @@</span><br><span>               $line =~ /\bsscanf\b/) {</span><br><span>                         my $lc = $stat =~ tr@\n@@;</span><br><span>                   $lc = $lc + $linenr;</span><br><span style="color: hsl(0, 100%, 40%);">-                    my $stat_real = raw_line($linenr, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                   for (my $count = $linenr + 1; $count <= $lc; $count++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             $stat_real = $stat_real . "\n" . raw_line($count, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     my $stat_real = get_stat_real($linenr, $lc);</span><br><span>                         if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {</span><br><span>                             my $format = $6;</span><br><span>                             my $count = $format =~ tr@%@%@;</span><br><span>@@ -5992,7 +6062,7 @@</span><br><span> </span><br><span> # check for function declarations that have arguments without identifier names</span><br><span>                if (defined $stat &&</span><br><span style="color: hsl(0, 100%, 40%);">-                $stat =~ /^.\s*(?:extern\s+)?$Type\s*$Ident\s*\(\s*([^{]+)\s*\)\s*;/s &&</span><br><span style="color: hsl(120, 100%, 40%);">+              $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&</span><br><span>                   $1 ne "void") {</span><br><span>                        my $args = trim($1);</span><br><span>                         while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {</span><br><span>@@ -6068,12 +6138,9 @@</span><br><span>                   }</span><br><span>                    if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&</span><br><span>                       !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           my $ctx = '';</span><br><span style="color: hsl(0, 100%, 40%);">-                           my $herectx = $here . "\n";</span><br><span>                                my $cnt = statement_rawlines($stat);</span><br><span style="color: hsl(0, 100%, 40%);">-                            for (my $n = 0; $n < $cnt; $n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                   $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                             my $herectx = get_stat_here($linenr, $cnt, $here);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                                 if (WARN("ALLOC_WITH_MULTIPLY",</span><br><span>                                     "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&</span><br><span>                                $cnt == 1 &&</span><br><span>@@ -6144,7 +6211,7 @@</span><br><span>                             next if ($fline =~ /^.[\s$;]*$/);</span><br><span>                            $has_statement = 1;</span><br><span>                          $count++;</span><br><span style="color: hsl(0, 100%, 40%);">-                               $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);</span><br><span style="color: hsl(120, 100%, 40%);">+                                $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|exit\s*\(\b|return\b|goto\b|continue\b)/);</span><br><span>                   }</span><br><span>                    if (!$has_break && $has_statement) {</span><br><span>                                 WARN("MISSING_BREAK",</span><br><span>@@ -6156,12 +6223,9 @@</span><br><span>             if ($^V && $^V ge 5.10.0 &&</span><br><span>              defined $stat &&</span><br><span>                     $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        my $ctx = '';</span><br><span style="color: hsl(0, 100%, 40%);">-                   my $herectx = $here . "\n";</span><br><span>                        my $cnt = statement_rawlines($stat);</span><br><span style="color: hsl(0, 100%, 40%);">-                    for (my $n = 0; $n < $cnt; $n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           $herectx .= raw_line($linenr, $n) . "\n";</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                     my $herectx = get_stat_here($linenr, $cnt, $here);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                         WARN("DEFAULT_NO_BREAK",</span><br><span>                        "switch default: should use break\n" . $herectx);</span><br><span>             }</span><br><span>@@ -6214,6 +6278,12 @@</span><br><span>                   }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# check for bool bitfields</span><br><span style="color: hsl(120, 100%, 40%);">+             if ($sline =~ /^.\s+bool\s*$Ident\s*:\s*\d+\s*;/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   WARN("BOOL_BITFIELD",</span><br><span style="color: hsl(120, 100%, 40%);">+                            "Avoid using bool as bitfield.  Prefer bool bitfields as unsigned int or u<8|16|32>\n" . $herecurr);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # check for semaphores initialized locked</span><br><span>             if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {</span><br><span>                         WARN("CONSIDER_COMPLETION",</span><br><span>@@ -6277,28 +6347,6 @@</span><br><span>                       }</span><br><span>            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# whine about ACCESS_ONCE</span><br><span style="color: hsl(0, 100%, 40%);">-          if ($^V && $^V ge 5.10.0 &&</span><br><span style="color: hsl(0, 100%, 40%);">-                 $line =~ /\bACCESS_ONCE\s*$balanced_parens\s*(=(?!=))?\s*($FuncArg)?/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    my $par = $1;</span><br><span style="color: hsl(0, 100%, 40%);">-                   my $eq = $2;</span><br><span style="color: hsl(0, 100%, 40%);">-                    my $fun = $3;</span><br><span style="color: hsl(0, 100%, 40%);">-                   $par =~ s/^\(\s*(.*)\s*\)$/$1/;</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (defined($eq)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             if (WARN("PREFER_WRITE_ONCE",</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "Prefer WRITE_ONCE(<FOO>, <BAR>) over ACCESS_ONCE(<FOO>) = <BAR>\n" . $herecurr) &&</span><br><span style="color: hsl(0, 100%, 40%);">-                              $fix) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)\s*$eq\s*\Q$fun\E/WRITE_ONCE($par, $fun)/;</span><br><span style="color: hsl(0, 100%, 40%);">-                            }</span><br><span style="color: hsl(0, 100%, 40%);">-                       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                if (WARN("PREFER_READ_ONCE",</span><br><span style="color: hsl(0, 100%, 40%);">-                                   "Prefer READ_ONCE(<FOO>) over ACCESS_ONCE(<FOO>)\n" . $herecurr) &&</span><br><span style="color: hsl(0, 100%, 40%);">-                                  $fix) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)/READ_ONCE($par)/;</span><br><span style="color: hsl(0, 100%, 40%);">-                            }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> # check for mutex_trylock_recursive usage</span><br><span>               if ($line =~ /mutex_trylock_recursive/) {</span><br><span>                    ERROR("LOCKING",</span><br><span>@@ -6322,8 +6370,69 @@</span><br><span>                       "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);</span><br><span>          }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO></span><br><span style="color: hsl(120, 100%, 40%);">+# and whether or not function naming is typical and if</span><br><span style="color: hsl(120, 100%, 40%);">+# DEVICE_ATTR permissions uses are unusual too</span><br><span style="color: hsl(120, 100%, 40%);">+             if ($^V && $^V ge 5.10.0 &&</span><br><span style="color: hsl(120, 100%, 40%);">+               defined $stat &&</span><br><span style="color: hsl(120, 100%, 40%);">+              $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 my $var = $1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 my $perms = $2;</span><br><span style="color: hsl(120, 100%, 40%);">+                       my $show = $3;</span><br><span style="color: hsl(120, 100%, 40%);">+                        my $store = $4;</span><br><span style="color: hsl(120, 100%, 40%);">+                       my $octal_perms = perms_to_octal($perms);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if ($show =~ /^${var}_show$/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                           $store =~ /^${var}_store$/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                         $octal_perms eq "0644") {</span><br><span style="color: hsl(120, 100%, 40%);">+                               if (WARN("DEVICE_ATTR_RW",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "Use DEVICE_ATTR_RW\n" . $herecurr) &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                 $fix) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     } elsif ($show =~ /^${var}_show$/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                           $store =~ /^NULL$/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                 $octal_perms eq "0444") {</span><br><span style="color: hsl(120, 100%, 40%);">+                          if (WARN("DEVICE_ATTR_RO",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "Use DEVICE_ATTR_RO\n" . $herecurr) &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                 $fix) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;</span><br><span style="color: hsl(120, 100%, 40%);">+                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                     } elsif ($show =~ /^NULL$/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                          $store =~ /^${var}_store$/ &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                 $octal_perms eq "0200") {</span><br><span style="color: hsl(120, 100%, 40%);">+                          if (WARN("DEVICE_ATTR_WO",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "Use DEVICE_ATTR_WO\n" . $herecurr) &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                 $fix) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;</span><br><span style="color: hsl(120, 100%, 40%);">+                              }</span><br><span style="color: hsl(120, 100%, 40%);">+                     } elsif ($octal_perms eq "0644" ||</span><br><span style="color: hsl(120, 100%, 40%);">+                           $octal_perms eq "0444" ||</span><br><span style="color: hsl(120, 100%, 40%);">+                           $octal_perms eq "0200") {</span><br><span style="color: hsl(120, 100%, 40%);">+                          my $newshow = "$show";</span><br><span style="color: hsl(120, 100%, 40%);">+                              $newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");</span><br><span style="color: hsl(120, 100%, 40%);">+                                my $newstore = $store;</span><br><span style="color: hsl(120, 100%, 40%);">+                                $newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");</span><br><span style="color: hsl(120, 100%, 40%);">+                           my $rename = "";</span><br><span style="color: hsl(120, 100%, 40%);">+                            if ($show ne $newshow) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      $rename .= " '$show' to '$newshow'";</span><br><span style="color: hsl(120, 100%, 40%);">+                                }</span><br><span style="color: hsl(120, 100%, 40%);">+                             if ($store ne $newstore) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    $rename .= " '$store' to '$newstore'";</span><br><span style="color: hsl(120, 100%, 40%);">+                              }</span><br><span style="color: hsl(120, 100%, 40%);">+                             WARN("DEVICE_ATTR_FUNCTIONS",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "Consider renaming function(s)$rename\n" . $herecurr);</span><br><span style="color: hsl(120, 100%, 40%);">+                 } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              WARN("DEVICE_ATTR_PERMS",</span><br><span style="color: hsl(120, 100%, 40%);">+                                "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # Mode permission misuses where it seems decimal should be octal</span><br><span> # This uses a shortcut match to avoid unnecessary uses of a slow foreach loop</span><br><span style="color: hsl(120, 100%, 40%);">+# o Ignore module_param*(...) uses with a decimal 0 permission as that has a</span><br><span style="color: hsl(120, 100%, 40%);">+#   specific definition of not visible in sysfs.</span><br><span style="color: hsl(120, 100%, 40%);">+# o Ignore proc_create*(...) uses with a decimal 0 permission as that means</span><br><span style="color: hsl(120, 100%, 40%);">+#   use the default permissions</span><br><span>               if ($^V && $^V ge 5.10.0 &&</span><br><span>              defined $stat &&</span><br><span>                     $line =~ /$mode_perms_search/) {</span><br><span>@@ -6333,10 +6442,7 @@</span><br><span> </span><br><span>                            my $lc = $stat =~ tr@\n@@;</span><br><span>                           $lc = $lc + $linenr;</span><br><span style="color: hsl(0, 100%, 40%);">-                            my $stat_real = raw_line($linenr, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                           for (my $count = $linenr + 1; $count <= $lc; $count++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                     $stat_real = $stat_real . "\n" . raw_line($count, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                         }</span><br><span style="color: hsl(120, 100%, 40%);">+                             my $stat_real = get_stat_real($linenr, $lc);</span><br><span> </span><br><span>                             my $skip_args = "";</span><br><span>                                if ($arg_pos > 1) {</span><br><span>@@ -6347,8 +6453,9 @@</span><br><span>                               if ($stat =~ /$test/) {</span><br><span>                                      my $val = $1;</span><br><span>                                        $val = $6 if ($skip_args ne "");</span><br><span style="color: hsl(0, 100%, 40%);">-                                      if (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||</span><br><span style="color: hsl(0, 100%, 40%);">-                                     ($val =~ /^$Octal$/ && length($val) ne 4)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&</span><br><span style="color: hsl(120, 100%, 40%);">+                                       (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                                           ($val =~ /^$Octal$/ && length($val) ne 4))) {</span><br><span>                                           ERROR("NON_OCTAL_PERMISSIONS",</span><br><span>                                                   "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);</span><br><span>                                    }</span><br><span>@@ -6361,30 +6468,13 @@</span><br><span>          }</span><br><span> </span><br><span> # check for uses of S_<PERMS> that could be octal for readability</span><br><span style="color: hsl(0, 100%, 40%);">-                if ($line =~ /\b$mode_perms_string_search\b/) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 my $val = "";</span><br><span style="color: hsl(0, 100%, 40%);">-                 my $oval = "";</span><br><span style="color: hsl(0, 100%, 40%);">-                        my $to = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                     my $curpos = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                 my $lastpos = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                        while ($line =~ /\b(($mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         $curpos = pos($line);</span><br><span style="color: hsl(0, 100%, 40%);">-                           my $match = $2;</span><br><span style="color: hsl(0, 100%, 40%);">-                         my $omatch = $1;</span><br><span style="color: hsl(0, 100%, 40%);">-                                last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));</span><br><span style="color: hsl(0, 100%, 40%);">-                           $lastpos = $curpos;</span><br><span style="color: hsl(0, 100%, 40%);">-                             $to |= $mode_permission_string_types{$match};</span><br><span style="color: hsl(0, 100%, 40%);">-                           $val .= '\s*\|\s*' if ($val ne "");</span><br><span style="color: hsl(0, 100%, 40%);">-                           $val .= $match;</span><br><span style="color: hsl(0, 100%, 40%);">-                         $oval .= $omatch;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       $oval =~ s/^\s*\|\s*//;</span><br><span style="color: hsl(0, 100%, 40%);">-                 $oval =~ s/\s*\|\s*$//;</span><br><span style="color: hsl(0, 100%, 40%);">-                 my $octal = sprintf("%04o", $to);</span><br><span style="color: hsl(120, 100%, 40%);">+           while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  my $oval = $1;</span><br><span style="color: hsl(120, 100%, 40%);">+                        my $octal = perms_to_octal($oval);</span><br><span>                   if (WARN("SYMBOLIC_PERMS",</span><br><span>                                  "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&</span><br><span>                        $fix) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             $fixed[$fixlinenr] =~ s/$val/$octal/;</span><br><span style="color: hsl(120, 100%, 40%);">+                         $fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;</span><br><span>                   }</span><br><span>            }</span><br><span> </span><br><span>@@ -6425,7 +6515,7 @@</span><br><span>                exit(0);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!$is_patch && $file !~ /cover-letter\.patch$/) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!$is_patch && $filename !~ /cover-letter\.patch$/) {</span><br><span>             ERROR("NOT_UNIFIED_DIFF",</span><br><span>                "Does not appear to be a unified-diff format patch\n");</span><br><span>      }</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/28046">change 28046</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/28046"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I43d09a912fafe896c045df080c0f75fe6d908087 </div>
<div style="display:none"> Gerrit-Change-Number: 28046 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Martin Roth <martinroth@google.com> </div>