mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	When building x86 defconfig with Clang-18 I get the following warnings:
  | arch/x86/ia32/audit.c:6:10: warning: no previous extern declaration for non-static variable 'ia32_dir_class' [-Wmissing-variable-declarations]
  |     6 | unsigned ia32_dir_class[] = {
  | arch/x86/ia32/audit.c:11:10: warning: no previous extern declaration for non-static variable 'ia32_chattr_class' [-Wmissing-variable-declarations]
  |    11 | unsigned ia32_chattr_class[] = {
  | arch/x86/ia32/audit.c:16:10: warning: no previous extern declaration for non-static variable 'ia32_write_class' [-Wmissing-variable-declarations]
  |    16 | unsigned ia32_write_class[] = {
  | arch/x86/ia32/audit.c:21:10: warning: no previous extern declaration for non-static variable 'ia32_read_class' [-Wmissing-variable-declarations]
  |    21 | unsigned ia32_read_class[] = {
  | arch/x86/ia32/audit.c:26:10: warning: no previous extern declaration for non-static variable 'ia32_signal_class' [-Wmissing-variable-declarations]
  |    26 | unsigned ia32_signal_class[] = {
These warnings occur due to their respective extern declarations being
scoped inside of audit_classes_init as well as only being enabled with
`CONFIG_IA32_EMULATION=y`:
  | static int __init audit_classes_init(void)
  | {
  | #ifdef CONFIG_IA32_EMULATION
  |	extern __u32 ia32_dir_class[];
  |	extern __u32 ia32_write_class[];
  |	extern __u32 ia32_read_class[];
  |	extern __u32 ia32_chattr_class[];
  |	audit_register_class(AUDIT_CLASS_WRITE_32, ia32_write_class);
  |	audit_register_class(AUDIT_CLASS_READ_32, ia32_read_class);
  |	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
  |	audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
  | #endif
  |	audit_register_class(AUDIT_CLASS_WRITE, write_class);
  |	audit_register_class(AUDIT_CLASS_READ, read_class);
  |	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
  |	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
  |	return 0;
  | }
Lift the extern declarations to their own header and resolve scoping
issues (and thus fix the warnings).
Moreover, change __u32 to unsigned so that we match the definitions:
  | unsigned ia32_dir_class[] = {
  | #include <asm-generic/audit_dir_write.h>
  | ~0U
  | };
  |
  | unsigned ia32_chattr_class[] = {
  | #include <asm-generic/audit_change_attr.h>
  | ~0U
  | };
  | ...
This patch is similar to commit:
  0e5e3d4461 ("x86/audit: Fix a -Wmissing-prototypes warning for ia32_classify_syscall()") [1]
Signed-off-by: Justin Stitt <justinstitt@google.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/all/20200516123816.2680-1-b.thiel@posteo.de/ [1]
Link: https://github.com/ClangBuiltLinux/linux/issues/1920
Link: https://lore.kernel.org/r/20230829-missingvardecl-audit-v1-1-34efeb7f3539@google.com
		
	
			
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
#include <linux/init.h>
 | 
						|
#include <linux/types.h>
 | 
						|
#include <linux/audit.h>
 | 
						|
#include <asm/unistd.h>
 | 
						|
#include <asm/audit.h>
 | 
						|
 | 
						|
static unsigned dir_class[] = {
 | 
						|
#include <asm-generic/audit_dir_write.h>
 | 
						|
~0U
 | 
						|
};
 | 
						|
 | 
						|
static unsigned read_class[] = {
 | 
						|
#include <asm-generic/audit_read.h>
 | 
						|
~0U
 | 
						|
};
 | 
						|
 | 
						|
static unsigned write_class[] = {
 | 
						|
#include <asm-generic/audit_write.h>
 | 
						|
~0U
 | 
						|
};
 | 
						|
 | 
						|
static unsigned chattr_class[] = {
 | 
						|
#include <asm-generic/audit_change_attr.h>
 | 
						|
~0U
 | 
						|
};
 | 
						|
 | 
						|
static unsigned signal_class[] = {
 | 
						|
#include <asm-generic/audit_signal.h>
 | 
						|
~0U
 | 
						|
};
 | 
						|
 | 
						|
int audit_classify_arch(int arch)
 | 
						|
{
 | 
						|
#ifdef CONFIG_IA32_EMULATION
 | 
						|
	if (arch == AUDIT_ARCH_I386)
 | 
						|
		return 1;
 | 
						|
#endif
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
int audit_classify_syscall(int abi, unsigned syscall)
 | 
						|
{
 | 
						|
#ifdef CONFIG_IA32_EMULATION
 | 
						|
	if (abi == AUDIT_ARCH_I386)
 | 
						|
		return ia32_classify_syscall(syscall);
 | 
						|
#endif
 | 
						|
	switch(syscall) {
 | 
						|
	case __NR_open:
 | 
						|
		return AUDITSC_OPEN;
 | 
						|
	case __NR_openat:
 | 
						|
		return AUDITSC_OPENAT;
 | 
						|
	case __NR_execve:
 | 
						|
	case __NR_execveat:
 | 
						|
		return AUDITSC_EXECVE;
 | 
						|
	case __NR_openat2:
 | 
						|
		return AUDITSC_OPENAT2;
 | 
						|
	default:
 | 
						|
		return AUDITSC_NATIVE;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
static int __init audit_classes_init(void)
 | 
						|
{
 | 
						|
#ifdef CONFIG_IA32_EMULATION
 | 
						|
	audit_register_class(AUDIT_CLASS_WRITE_32, ia32_write_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_READ_32, ia32_read_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_SIGNAL_32, ia32_signal_class);
 | 
						|
#endif
 | 
						|
	audit_register_class(AUDIT_CLASS_WRITE, write_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_READ, read_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
 | 
						|
	audit_register_class(AUDIT_CLASS_SIGNAL, signal_class);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
__initcall(audit_classes_init);
 |