commit 98dcea0cfd04e083ac74137ceb9a632604740e2d upstream. liblockdep has been broken since commit 75dd602a5198 ("lockdep: Fix lock_chain::base size"), as that adds a check that MAX_LOCK_DEPTH is within the range of lock_chain::depth and in liblockdep it is much too large. That should have resulted in a compiler error, but didn't because: - the check uses ARRAY_SIZE(), which isn't yet defined in liblockdep so is assumed to be an (undeclared) function - putting a function call inside a BUILD_BUG_ON() expression quietly turns it into some nonsense involving a variable-length array It did produce a compiler warning, but I didn't notice because liblockdep already produces too many warnings if -Wall is enabled (which I'll fix shortly). Even before that commit, which reduced lock_chain::depth from 8 bits to 6, MAX_LOCK_DEPTH was too large. Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Sasha Levin <sasha.levin@oracle.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: a.p.zijlstra@chello.nl Link: http://lkml.kernel.org/r/20170525130005.5947-3-alexander.levin@verizon.com Signed-off-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
59 lines
1.1 KiB
C
59 lines
1.1 KiB
C
#ifndef _LIBLOCKDEP_LOCKDEP_H_
|
|
#define _LIBLOCKDEP_LOCKDEP_H_
|
|
|
|
#include <sys/prctl.h>
|
|
#include <sys/syscall.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
#include <linux/utsname.h>
|
|
#include <linux/compiler.h>
|
|
|
|
#define MAX_LOCK_DEPTH 255UL
|
|
|
|
#define asmlinkage
|
|
#define __visible
|
|
|
|
#include "../../../include/linux/lockdep.h"
|
|
|
|
struct task_struct {
|
|
u64 curr_chain_key;
|
|
int lockdep_depth;
|
|
unsigned int lockdep_recursion;
|
|
struct held_lock held_locks[MAX_LOCK_DEPTH];
|
|
gfp_t lockdep_reclaim_gfp;
|
|
int pid;
|
|
char comm[17];
|
|
};
|
|
|
|
extern struct task_struct *__curr(void);
|
|
|
|
#define current (__curr())
|
|
|
|
#define debug_locks_off() 1
|
|
#define task_pid_nr(tsk) ((tsk)->pid)
|
|
|
|
#define KSYM_NAME_LEN 128
|
|
#define printk printf
|
|
|
|
#define list_del_rcu list_del
|
|
|
|
#define atomic_t unsigned long
|
|
#define atomic_inc(x) ((*(x))++)
|
|
|
|
static struct new_utsname *init_utsname(void)
|
|
{
|
|
static struct new_utsname n = (struct new_utsname) {
|
|
.release = "liblockdep",
|
|
.version = LIBLOCKDEP_VERSION,
|
|
};
|
|
|
|
return &n;
|
|
}
|
|
|
|
#define print_tainted() ""
|
|
#define static_obj(x) 1
|
|
|
|
#define debug_show_all_locks()
|
|
extern void debug_check_no_locks_held(void);
|
|
|
|
#endif
|