Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a4a9e56 authored by Runmin Wang's avatar Runmin Wang
Browse files

Merge remote-tracking branch '4.4/tmp-187016ef' into msm-next



* 4.4/tmp-187016ef:
  checkpatch: Excuse reverts from "summary line over 75 characters" check
  checkpatch: recognize only specific tags when ending commit text
  checkpatch: require commit text
  Don't complain about MIME headers.
  checkpatch: warn on subject line not followed by blank line
  checkpatch: warn on long summary, commit text lines
  checkpatch: Add exceptions for "dsb" keyword usage
  Revert "checkpatch.pl: add check for Change-Id"
  checkpatch: add support for --noauthor
  scripts: checkpatch.pl: warn on invalid credentials
  checkpatch: Add check for vreg_xxx api in opensource drivers
  checkpatch: Add check for gpiomux usage in msm board files
  checkpatch: complain about the use of dsb().
  checkpatch: close filp_open loophole.
  checkpatch: Handle long multi-line macros better.
  checkpatch: deprecate unbounded string functions.
  checkpatch: forbid implied-barrier I/O functions.
  checkpatch: Merge continuation-header handling from .38.
  checkpatch: forbid filesystem accesses from within the kernel.
  Checkpatch: Print location when catching return code error
  checkpatch: Check for illegal return codes
  checkpatch: remove column limit for checkpatch patches
  checkpatch: Add warnings for use of mdelay()
  checkpatch: Exceptions for CLK_* macros and some spaces in macros
  checkpatch: check for #if 0/#if 1

Change-Id: Ibf6b88a21a4df4fe91d2d9f71ace2540a10b0cce
Signed-off-by: default avatarRunmin Wang <runminw@codeaurora.org>
parents 603e8f2a 187016ef
Loading
Loading
Loading
Loading
+264 −14
Original line number Original line Diff line number Diff line
@@ -11,6 +11,13 @@ use File::Basename;
use Cwd 'abs_path';
use Cwd 'abs_path';
use Term::ANSIColor qw(:constants);
use Term::ANSIColor qw(:constants);


use constant BEFORE_SHORTTEXT => 0;
use constant IN_SHORTTEXT_BLANKLINE => 1;
use constant IN_SHORTTEXT => 2;
use constant AFTER_SHORTTEXT => 3;
use constant CHECK_NEXT_SHORTTEXT => 4;
use constant SHORTTEXT_LIMIT => 75;

my $P = $0;
my $P = $0;
my $D = dirname(abs_path($P));
my $D = dirname(abs_path($P));


@@ -22,6 +29,7 @@ my $quiet = 0;
my $tree = 1;
my $tree = 1;
my $chk_signoff = 1;
my $chk_signoff = 1;
my $chk_patch = 1;
my $chk_patch = 1;
my $chk_author = 1;
my $tst_only;
my $tst_only;
my $emacs = 0;
my $emacs = 0;
my $terse = 0;
my $terse = 0;
@@ -70,6 +78,7 @@ Options:
  -q, --quiet                quiet
  -q, --quiet                quiet
  --no-tree                  run without a kernel tree
  --no-tree                  run without a kernel tree
  --no-signoff               do not check for 'Signed-off-by' line
  --no-signoff               do not check for 'Signed-off-by' line
  --no-author                do not check for unexpected authors
  --patch                    treat FILE as patchfile (default)
  --patch                    treat FILE as patchfile (default)
  --emacs                    emacs compile window format
  --emacs                    emacs compile window format
  --terse                    one line per report
  --terse                    one line per report
@@ -186,6 +195,7 @@ GetOptions(
	'tree!'		=> \$tree,
	'tree!'		=> \$tree,
	'signoff!'	=> \$chk_signoff,
	'signoff!'	=> \$chk_signoff,
	'patch!'	=> \$chk_patch,
	'patch!'	=> \$chk_patch,
	'author!'	=> \$chk_author,
	'emacs!'	=> \$emacs,
	'emacs!'	=> \$emacs,
	'terse!'	=> \$terse,
	'terse!'	=> \$terse,
	'showfile!'	=> \$showfile,
	'showfile!'	=> \$showfile,
@@ -2104,6 +2114,33 @@ sub tabify {
	return "$leading";
	return "$leading";
}
}


sub cleanup_continuation_headers {
	# Collapse any header-continuation lines into a single line so they
	# can be parsed meaningfully, as the parser only has one line
	# of context to work with.
	my $again;
	do {
		$again = 0;
		foreach my $n (0 .. scalar(@rawlines) - 2) {
			if ($rawlines[$n]=~/^\s*$/) {
				# A blank line means there's no more chance
				# of finding headers.  Shortcut to done.
				return;
			}
			if ($rawlines[$n]=~/^[\x21-\x39\x3b-\x7e]+:/ &&
			    $rawlines[$n+1]=~/^\s+/) {
				# Continuation header.  Collapse it.
				my $line = splice @rawlines, $n+1, 1;
				$line=~s/^\s+/ /;
				$rawlines[$n] .= $line;
				# We've 'destabilized' the list, so restart.
				$again = 1;
				last;
			}
		}
	} while ($again);
}

sub pos_last_openparen {
sub pos_last_openparen {
	my ($line) = @_;
	my ($line) = @_;


@@ -2142,6 +2179,8 @@ sub process {
	my $prevrawline="";
	my $prevrawline="";
	my $stashline="";
	my $stashline="";
	my $stashrawline="";
	my $stashrawline="";
	my $subjectline="";
	my $sublinenr="";


	my $length;
	my $length;
	my $indent;
	my $indent;
@@ -2197,9 +2236,14 @@ sub process {
	my $setup_docs = 0;
	my $setup_docs = 0;


	my $camelcase_file_seeded = 0;
	my $camelcase_file_seeded = 0;
	my $shorttext = BEFORE_SHORTTEXT;
	my $shorttext_exspc = 0;
	my $commit_text_present = 0;


	sanitise_line_reset();
	sanitise_line_reset();
	cleanup_continuation_headers();
	my $line;
	my $line;

	foreach my $rawline (@rawlines) {
	foreach my $rawline (@rawlines) {
		$linenr++;
		$linenr++;
		$line = $rawline;
		$line = $rawline;
@@ -2391,13 +2435,115 @@ sub process {
			}
			}
			next;
			next;
		}
		}

		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);


		my $hereline = "$here\n$rawline\n";
		my $hereline = "$here\n$rawline\n";
		my $herecurr = "$here\n$rawline\n";
		my $herecurr = "$here\n$rawline\n";
		my $hereprev = "$here\n$prevrawline\n$rawline\n";
		my $hereprev = "$here\n$prevrawline\n$rawline\n";


		if ($shorttext != AFTER_SHORTTEXT) {
			if ($shorttext == IN_SHORTTEXT_BLANKLINE && $line=~/\S/) {
				# the subject line was just processed,
				# a blank line must be next
				WARN("NONBLANK_AFTER_SUMMARY",
				     "non-blank line after summary line\n" . $herecurr);
				$shorttext = IN_SHORTTEXT;
				# this non-blank line may or may not be commit text -
				# a warning has been generated so assume it is commit
				# text and move on
				$commit_text_present = 1;
				# fall through and treat this line as IN_SHORTTEXT
			}
			if ($shorttext == IN_SHORTTEXT) {
				if ($line=~/^---/ || $line=~/^diff.*/) {
					if ($commit_text_present == 0) {
						WARN("NO_COMMIT_TEXT",
						     "please add commit text explaining " .
						     "*why* the change is needed\n" .
						     $herecurr);
					}
					$shorttext = AFTER_SHORTTEXT;
				} elsif (length($line) > (SHORTTEXT_LIMIT +
							  $shorttext_exspc)
					 && $line !~ /^:([0-7]{6}\s){2}
						      ([[:xdigit:]]+\.*
						       \s){2}\w+\s\w+/xms) {
					WARN("LONG_COMMIT_TEXT",
					     "commit text line over " .
					     SHORTTEXT_LIMIT .
					     " characters\n" . $herecurr);
				} elsif ($line=~/^\s*change-id:/i ||
					 $line=~/^\s*signed-off-by:/i ||
					 $line=~/^\s*crs-fixed:/i ||
					 $line=~/^\s*acked-by:/i) {
					# this is a tag, there must be commit
					# text by now
					if ($commit_text_present == 0) {
						WARN("NO_COMMIT_TEXT",
						     "please add commit text explaining " .
						     "*why* the change is needed\n" .
						     $herecurr);
						# prevent duplicate warnings
						$commit_text_present = 1;
					}
				} elsif ($line=~/\S/) {
					$commit_text_present = 1;
				}
			} elsif ($shorttext == IN_SHORTTEXT_BLANKLINE) {
				# case of non-blank line in this state handled above
				$shorttext = IN_SHORTTEXT;
			} elsif ($shorttext == CHECK_NEXT_SHORTTEXT) {
# The Subject line doesn't have to be the last header in the patch.
# Avoid moving to the IN_SHORTTEXT state until clear of all headers.
# Per RFC5322, continuation lines must be folded, so any left-justified
# text which looks like a header is definitely a header.
				if ($line!~/^[\x21-\x39\x3b-\x7e]+:/) {
					$shorttext = IN_SHORTTEXT;
					# Check for Subject line followed by a blank line.
					if (length($line) != 0) {
						WARN("NONBLANK_AFTER_SUMMARY",
						     "non-blank line after " .
						     "summary line\n" .
						     $sublinenr . $here .
						     "\n" . $subjectline .
						     "\n" . $line . "\n");
						# this non-blank line may or may not
						# be commit text - a warning has been
						# generated so assume it is commit
						# text and move on
						$commit_text_present = 1;
					}
				}
			# The next two cases are BEFORE_SHORTTEXT.
			} elsif ($line=~/^Subject: \[[^\]]*\] (.*)/) {
				# This is the subject line. Go to
				# CHECK_NEXT_SHORTTEXT to wait for the commit
				# text to show up.
				$shorttext = CHECK_NEXT_SHORTTEXT;
				$subjectline = $line;
				$sublinenr = "#$linenr & ";
# Check for Subject line less than line limit
				if (length($1) > SHORTTEXT_LIMIT && !($1 =~ m/Revert\ \"/)) {
					WARN("LONG_SUMMARY_LINE",
					     "summary line over " .
					     SHORTTEXT_LIMIT .
					     " characters\n" . $herecurr);
				}
			} elsif ($line=~/^    (.*)/) {
				# Indented format, this must be the summary
				# line (i.e. git show). There will be no more
				# headers so we are now in the shorttext.
				$shorttext = IN_SHORTTEXT_BLANKLINE;
				$shorttext_exspc = 4;
				if (length($1) > SHORTTEXT_LIMIT && !($1 =~ m/Revert\ \"/)) {
					WARN("LONG_SUMMARY_LINE",
					     "summary line over " .
					     SHORTTEXT_LIMIT .
					     " characters\n" . $herecurr);
				}
			}
		}

		$cnt_lines++ if ($realcnt != 0);
		$cnt_lines++ if ($realcnt != 0);


# Check if the commit log has what seems like a diff which can confuse patch
# Check if the commit log has what seems like a diff which can confuse patch
@@ -2490,6 +2636,10 @@ sub process {
					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
				}
				}
			}
			}
			if ($chk_author && $line =~ /^\s*signed-off-by:.*(quicinc|qualcomm)\.com/i) {
				WARN("BAD_SIGN_OFF",
				     "invalid Signed-off-by identity\n" . $line );
			}			


# Check for duplicate signatures
# Check for duplicate signatures
			my $sig_nospace = $line;
			my $sig_nospace = $line;
@@ -2516,12 +2666,6 @@ sub process {
			      "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
			      "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
		}
		}


# Check for unwanted Gerrit info
		if ($in_commit_log && $line =~ /^\s*change-id:/i) {
			ERROR("GERRIT_CHANGE_ID",
			      "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
		}

# Check if the commit log is in a possible stack dump
# Check if the commit log is in a possible stack dump
		if ($in_commit_log && !$commit_log_possible_stack_dump &&
		if ($in_commit_log && !$commit_log_possible_stack_dump &&
		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
@@ -2623,6 +2767,11 @@ sub process {
			     "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
			     "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
		}
		}


#check the patch for invalid author credentials
		if ($chk_author && $line =~ /^From:.*(quicinc|qualcomm)\.com/) {
			WARN("BAD_AUTHOR", "invalid author identity\n" . $line );
		}

# Check for wrappage within a valid hunk of the file
# Check for wrappage within a valid hunk of the file
		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
			ERROR("CORRUPTED_PATCH",
			ERROR("CORRUPTED_PATCH",
@@ -2844,8 +2993,7 @@ sub process {
#
#
# if LONG_LINE is ignored, the other 2 types are also ignored
# if LONG_LINE is ignored, the other 2 types are also ignored
#
#

		if ($line =~ /^\+/ && $length > $max_line_length && $realfile ne "scripts/checkpatch.pl") {
		if ($line =~ /^\+/ && $length > $max_line_length) {
			my $msg_type = "LONG_LINE";
			my $msg_type = "LONG_LINE";


			# Check the allowed long line types first
			# Check the allowed long line types first
@@ -4414,7 +4562,7 @@ sub process {


# check spacing on parentheses
# check spacing on parentheses
		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
		    $line !~ /for\s*\(\s+;/) {
		    $line !~ /for\s*\(\s+;/ && $line !~ /^\+\s*[A-Z_][A-Z\d_]*\(\s*\d+(\,.*)?\)\,?$/) {
			if (ERROR("SPACING",
			if (ERROR("SPACING",
				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
			    $fix) {
			    $fix) {
@@ -4785,7 +4933,7 @@ sub process {
		if ($realfile !~ m@/vmlinux.lds.h$@ &&
		if ($realfile !~ m@/vmlinux.lds.h$@ &&
		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
			my $ln = $linenr;
			my $ln = $linenr;
			my $cnt = $realcnt;
			my $cnt = $realcnt - 1;
			my ($off, $dstat, $dcond, $rest);
			my ($off, $dstat, $dcond, $rest);
			my $ctx = '';
			my $ctx = '';
			my $has_flow_statement = 0;
			my $has_flow_statement = 0;
@@ -4822,6 +4970,12 @@ sub process {
			{
			{
			}
			}


			# Extremely long macros may fall off the end of the
			# available context without closing.  Give a dangling
			# backslash the benefit of the doubt and allow it
			# to gobble any hanging open-parens.
			$dstat =~ s/\(.+\\$/1/;

			# Flatten any obvious string concatentation.
			# Flatten any obvious string concatentation.
			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
			       $dstat =~ s/$Ident\s*($String)/$1/)
			       $dstat =~ s/$Ident\s*($String)/$1/)
@@ -4837,6 +4991,7 @@ sub process {
				MODULE_PARM_DESC|
				MODULE_PARM_DESC|
				DECLARE_PER_CPU|
				DECLARE_PER_CPU|
				DEFINE_PER_CPU|
				DEFINE_PER_CPU|
				CLK_[A-Z\d_]+|
				__typeof__\(|
				__typeof__\(|
				union|
				union|
				struct|
				struct|
@@ -5259,11 +5414,94 @@ sub process {
			     "Avoid line continuations in quoted strings\n" . $herecurr);
			     "Avoid line continuations in quoted strings\n" . $herecurr);
		}
		}


# sys_open/read/write/close are not allowed in the kernel
		if ($line =~ /\b(sys_(?:open|read|write|close))\b/) {
			ERROR("FILE_OPS",
			      "$1 is inappropriate in kernel code.\n" .
			      $herecurr);
		}

# filp_open is a backdoor for sys_open
		if ($line =~ /\b(filp_open)\b/) {
			ERROR("FILE_OPS",
			      "$1 is inappropriate in kernel code.\n" .
			      $herecurr);
		}

# read[bwl] & write[bwl] use too many barriers, use the _relaxed variants
		if ($line =~ /\b((?:read|write)[bwl])\b/) {
			ERROR("NON_RELAXED_IO",
			      "Use of $1 is deprecated: use $1_relaxed\n\t" .
			      "with appropriate memory barriers instead.\n" .
			      $herecurr);
		}

# likewise, in/out[bwl] should be __raw_read/write[bwl]...
		if ($line =~ /\b((in|out)([bwl]))\b/) {
			my ($all, $pref, $suf) = ($1, $2, $3);
			$pref =~ s/in/read/;
			$pref =~ s/out/write/;
			ERROR("NON_RELAXED_IO",
			      "Use of $all is deprecated: use " .
			      "__raw_$pref$suf\n\t" .
			      "with appropriate memory barriers instead.\n" .
			      $herecurr);
		}

# dsb is too ARMish, and should usually be mb.
		if ($line =~ /[^-_>*\.]\bdsb\b[^-_\.;]/) {
			WARN("ARM_BARRIER",
			     "Use of dsb is discouranged: prefer mb.\n" .
			     $herecurr);
		}

# MSM - check if a non board-gpiomux file has any gpiomux declarations
	if ($realfile =~ /\/mach-msm\/board-[0-9]+/ &&
	    $realfile !~ /camera/ && $realfile !~ /gpiomux/ &&
	    $line =~ /\s*struct msm_gpiomux_config\s*/ ) {
		WARN("GPIOMUX_IN_BOARD",
		     "Non gpiomux board file cannot have a gpiomux config declarations. Please declare gpiomux configs in board-*-gpiomux.c file.\n" . $herecurr);
	}

# MSM - check if vreg_xxx function are used
	if ($line =~ /\b(vreg_(get|put|set_level|enable|disable))\b/) {
		WARN("DEPRECATED_VREG_APIS",
		     "Use of $1 API is deprecated: " .
			"use regulator APIs\n" . $herecurr);
	}

# unbounded string functions are overflow risks
		my %str_fns = (
			"sprintf" => "snprintf",
			"strcpy"  => "strlcpy",
			"strncpy"  => "strlcpy",
			"strcat"  => "strlcat",
			"strncat"  => "strlcat",
			"vsprintf"  => "vsnprintf",
			"strchr" => "strnchr",
			"strstr" => "strnstr",
		);
		foreach my $k (keys %str_fns) {
			if ($line =~ /\b$k\b/) {
				ERROR("UNBOUNDED_STRING_FNS",
				      "Use of $k is deprecated: " .
				      "use $str_fns{$k} instead.\n" .
				      $herecurr);
			}
		}

# warn about #if 0
# warn about #if 0
		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
			CHK("REDUNDANT_CODE",
			WARN("IF_0",
			    "if this code is redundant consider removing it\n" .
			     "if this code is redundant consider removing it\n"
				$herecurr);
				.  $herecurr);
		}

# warn about #if 1
		if ($line =~ /^.\s*\#\s*if\s+1\b/) {
			WARN("IF_1",
			     "if this code is required consider removing"
				. " #if 1\n" .  $herecurr);
		}
		}


# check for needless "if (<foo>) fn(<foo>)" uses
# check for needless "if (<foo>) fn(<foo>)" uses
@@ -5459,6 +5697,12 @@ sub process {
			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
		}
		}


# check the patch for use of mdelay
		if ($line =~ /\bmdelay\s*\(/) {
			WARN("MDELAY",
			     "use of mdelay() found: msleep() is the preferred API.\n" . $herecurr );
		}

# warn about #ifdefs in C files
# warn about #ifdefs in C files
#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
#			print "#ifdef in C files should be avoided\n";
#			print "#ifdef in C files should be avoided\n";
@@ -6054,6 +6298,12 @@ sub process {
			     "switch default: should use break\n" . $herectx);
			     "switch default: should use break\n" . $herectx);
		}
		}


# check for return codes on error paths
		if ($line =~ /\breturn\s+-\d+/) {
			ERROR("NO_ERROR_CODE",
			      "illegal return value, please use an error code\n" . $herecurr);
		}

# check for gcc specific __FUNCTION__
# check for gcc specific __FUNCTION__
		if ($line =~ /\b__FUNCTION__\b/) {
		if ($line =~ /\b__FUNCTION__\b/) {
			if (WARN("USE_FUNC",
			if (WARN("USE_FUNC",