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

Commit 2435880f authored by Joe Perches's avatar Joe Perches Committed by Linus Torvalds
Browse files

checkpatch: add checks for constant non-octal permissions



umode_t permissions are sometimes mistakenly written with decimal
constants.  Verify that numeric permissions are using octal.

Add a list of the most commonly used functions and macros that have
umode_t permissions and the argument position.

Add a $Octal type to $Constant.
Allow $LvalOrFunc to be a pointer indirection too.

Signed-off-by: default avatarJoe Perches <joe@perches.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 91f72e9c
Loading
Loading
Loading
Loading
+34 −2
Original line number Diff line number Diff line
@@ -289,11 +289,12 @@ our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
our $Binary	= qr{(?i)0b[01]+$Int_type?};
our $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
our $Int	= qr{[0-9]+$Int_type?};
our $Octal	= qr{0[0-7]+$Int_type?};
our $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
our $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
our $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
our $Float	= qr{$Float_hex|$Float_dec|$Float_int};
our $Constant	= qr{$Float|$Binary|$Hex|$Int};
our $Constant	= qr{$Float|$Binary|$Octal|$Hex|$Int};
our $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
our $Compare    = qr{<=|>=|==|!=|<|>};
our $Arithmetic = qr{\+|-|\*|\/|%};
@@ -378,6 +379,15 @@ our @modifierList = (
	qr{fastcall},
);

our @mode_permission_funcs = (
	["module_param", 3],
	["module_param_(?:array|named|string)", 4],
	["module_param_array_named", 5],
	["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
	["proc_create(?:_data|)", 2],
	["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
);

our $allowed_asm_includes = qr{(?x:
	irq|
	memory
@@ -423,7 +433,7 @@ our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
# Any use must be runtime checked with $^V

our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
our $LvalOrFunc	= qr{($Lval)\s*($balanced_parens{0,1})\s*};
our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};

sub deparenthesize {
@@ -4473,6 +4483,28 @@ sub process {
			WARN("EXPORTED_WORLD_WRITABLE",
			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
		}

		foreach my $entry (@mode_permission_funcs) {
			my $func = $entry->[0];
			my $arg_pos = $entry->[1];

			my $skip_args = "";
			if ($arg_pos > 1) {
				$arg_pos--;
				$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
			}
			my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
			if ($^V && $^V ge 5.10.0 &&
			    $line =~ /$test/) {
				my $val = $1;
				$val = $6 if ($skip_args ne "");

				if ($val =~ /^$Int$/ && $val !~ /^$Octal$/) {
					ERROR("NON_OCTAL_PERMISSIONS",
					      "Use octal not decimal permissions\n" . $herecurr);
				}
			}
		}
	}

	# If we have no input at all, then there is nothing to report on