scripts: checkpatch: diagnose uses of `%pA` in the C side as errors
authorMiguel Ojeda <ojeda@kernel.org>
Sun, 22 May 2022 01:11:08 +0000 (03:11 +0200)
committerMiguel Ojeda <ojeda@kernel.org>
Wed, 28 Sep 2022 07:00:58 +0000 (09:00 +0200)
The `%pA` format specifier is only intended to be used from Rust.

`checkpatch.pl` already gives a warning for invalid specificers:

    WARNING: Invalid vsprintf pointer extension '%pA'

This makes it an error and introduces an explanatory message:

    ERROR: Invalid vsprintf pointer extension '%pA' - '%pA' is only intended to be used from Rust code

Suggested-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Co-developed-by: Alex Gaynor <alex.gaynor@gmail.com>
Signed-off-by: Alex Gaynor <alex.gaynor@gmail.com>
Co-developed-by: Wedson Almeida Filho <wedsonaf@google.com>
Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com>
Co-developed-by: Joe Perches <joe@perches.com>
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
scripts/checkpatch.pl

index 79e759a..74a7693 100755 (executable)
@@ -6783,15 +6783,19 @@ sub process {
                                }
                                if ($bad_specifier ne "") {
                                        my $stat_real = get_stat_real($linenr, $lc);
+                                       my $msg_level = \&WARN;
                                        my $ext_type = "Invalid";
                                        my $use = "";
                                        if ($bad_specifier =~ /p[Ff]/) {
                                                $use = " - use %pS instead";
                                                $use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
+                                       } elsif ($bad_specifier =~ /pA/) {
+                                               $use =  " - '%pA' is only intended to be used from Rust code";
+                                               $msg_level = \&ERROR;
                                        }
 
-                                       WARN("VSPRINTF_POINTER_EXTENSION",
-                                            "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");
+                                       &{$msg_level}("VSPRINTF_POINTER_EXTENSION",
+                                                     "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");
                                }
                        }
                }