Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

10 messages, 6 authors, 2011-02-15 · open the first message on its own page

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: Andrew Morton <akpm@linux-foundation.org>
Date: 2011-01-20 20:26:56

(switched to email.  Please respond via emailed reply-to-all, not via the
bugzilla web interface).

On Thu, 20 Jan 2011 20:08:32 GMT
bugzilla-daemon@bugzilla.kernel.org wrote:
https://bugzilla.kernel.org/show_bug.cgi?id=27212

           Summary: Warning kmemcheck: Caught 64-bit read from
                    uninitialized memory in netlink_broadcast_filtered
           Product: Other
           Version: 2.5
    Kernel Version: 2.6.38-rc1
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Other
        AssignedTo: other_other@kernel-bugs.osdl.org
        ReportedBy: casteyde.christian@free.fr
        Regression: Yes


Athlon 64 X2 3000 in 64bits
Slackware64 13.1
Kernel compiled with kmemcheck and other debug options

At boot I got the following warning:

PCI: Using ACPI for IRQ routing
PCI: pci_cache_line_size set to 64 bytes
pci 0000:00:00.0: address space collision: [mem 0xe0000000-0xefffffff pref]
conflicts with GART [mem 0x
e0000000-0xefffffff]
reserve RAM buffer: 000000000009fc00 - 000000000009ffff 
reserve RAM buffer: 000000003ffb0000 - 000000003fffffff
WARNING: kmemcheck: Caught 64-bit read from uninitialized memory
(ffff88003e170eb0)
0000000000000000010000000000000000000000000000000000000000000000
 i i i i i i i i i i i i u u u u u u u u u u u u u u u u u u u u
                                 ^

Pid: 1, comm: swapper Not tainted 2.6.38-rc1 #2 K8 Combo-Z/K8 Combo-Z
RIP: 0010:[<ffffffff8127ad72>]  [<ffffffff8127ad72>] memmove+0x122/0x1a0
RSP: 0018:ffff88003e0b3c60  EFLAGS: 00010202
RAX: ffff88003e170080 RBX: ffff88003e27b500 RCX: 0000000000000020
RDX: 0000000000000018 RSI: ffff88003e170ea0 RDI: ffff88003e1700a0
RBP: ffff88003e0b3c60 R08: 0000000000000001 R09: 0000000000000001
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
R13: 0000000000000080 R14: 0000000000000000 R15: 0000000000000001
FS:  0000000000000000(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: ffff88003e018abc CR3: 0000000001a1c000 CR4: 00000000000006f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff4ff0 DR7: 0000000000000400
 [<ffffffff814741c2>] pskb_expand_head+0xc2/0x2a0
 [<ffffffff81498fa7>] netlink_broadcast_filtered+0xa7/0x4a0
 [<ffffffff814993b8>] netlink_broadcast+0x18/0x20
 [<ffffffff8149b884>] genlmsg_mcast+0x144/0x180
 [<ffffffff8149bc4a>] genl_ctrl_event+0xca/0x450
 [<ffffffff8149c75d>] genl_register_mc_group+0x10d/0x2a0
 [<ffffffff81ad9da4>] genl_init+0x6c/0x84
 [<ffffffff810001de>] do_one_initcall+0x3e/0x170
 [<ffffffff81aae6ea>] kernel_init+0x197/0x21b
 [<ffffffff81003254>] kernel_thread_helper+0x4/0x10
 [<ffffffffffffffff>] 0xffffffffffffffff
pnp: PnP ACPI init
ACPI: bus type pnp registered
pnp 00:00: [bus 00-ff]
pnp 00:00: [io  0x0cf8-0x0cff]

This is specific to 2.6.38-rc1.

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: Eric Dumazet <hidden>
Date: 2011-01-20 20:41:32

Le jeudi 20 janvier 2011 à 12:25 -0800, Andrew Morton a écrit :
(switched to email.  Please respond via emailed reply-to-all, not via the
bugzilla web interface).

On Thu, 20 Jan 2011 20:08:32 GMT
bugzilla-daemon@bugzilla.kernel.org wrote:
quoted
https://bugzilla.kernel.org/show_bug.cgi?id=27212

           Summary: Warning kmemcheck: Caught 64-bit read from
                    uninitialized memory in netlink_broadcast_filtered
           Product: Other
           Version: 2.5
    Kernel Version: 2.6.38-rc1
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Other
        AssignedTo: other_other@kernel-bugs.osdl.org
        ReportedBy: casteyde.christian@free.fr
        Regression: Yes


Athlon 64 X2 3000 in 64bits
Slackware64 13.1
Kernel compiled with kmemcheck and other debug options

At boot I got the following warning:

PCI: Using ACPI for IRQ routing
PCI: pci_cache_line_size set to 64 bytes
pci 0000:00:00.0: address space collision: [mem 0xe0000000-0xefffffff pref]
conflicts with GART [mem 0x
e0000000-0xefffffff]
reserve RAM buffer: 000000000009fc00 - 000000000009ffff 
reserve RAM buffer: 000000003ffb0000 - 000000003fffffff
WARNING: kmemcheck: Caught 64-bit read from uninitialized memory
(ffff88003e170eb0)
0000000000000000010000000000000000000000000000000000000000000000
 i i i i i i i i i i i i u u u u u u u u u u u u u u u u u u u u
                                 ^

Pid: 1, comm: swapper Not tainted 2.6.38-rc1 #2 K8 Combo-Z/K8 Combo-Z
RIP: 0010:[<ffffffff8127ad72>]  [<ffffffff8127ad72>] memmove+0x122/0x1a0
RSP: 0018:ffff88003e0b3c60  EFLAGS: 00010202
RAX: ffff88003e170080 RBX: ffff88003e27b500 RCX: 0000000000000020
RDX: 0000000000000018 RSI: ffff88003e170ea0 RDI: ffff88003e1700a0
RBP: ffff88003e0b3c60 R08: 0000000000000001 R09: 0000000000000001
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
R13: 0000000000000080 R14: 0000000000000000 R15: 0000000000000001
FS:  0000000000000000(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: ffff88003e018abc CR3: 0000000001a1c000 CR4: 00000000000006f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff4ff0 DR7: 0000000000000400
 [<ffffffff814741c2>] pskb_expand_head+0xc2/0x2a0
 [<ffffffff81498fa7>] netlink_broadcast_filtered+0xa7/0x4a0
 [<ffffffff814993b8>] netlink_broadcast+0x18/0x20
 [<ffffffff8149b884>] genlmsg_mcast+0x144/0x180
 [<ffffffff8149bc4a>] genl_ctrl_event+0xca/0x450
 [<ffffffff8149c75d>] genl_register_mc_group+0x10d/0x2a0
 [<ffffffff81ad9da4>] genl_init+0x6c/0x84
 [<ffffffff810001de>] do_one_initcall+0x3e/0x170
 [<ffffffff81aae6ea>] kernel_init+0x197/0x21b
 [<ffffffff81003254>] kernel_thread_helper+0x4/0x10
 [<ffffffffffffffff>] 0xffffffffffffffff
pnp: PnP ACPI init
ACPI: bus type pnp registered
pnp 00:00: [bus 00-ff]
pnp 00:00: [io  0x0cf8-0x0cff]

This is specific to 2.6.38-rc1.
Likely a false positive after commit ca44ac38
(net: don't reallocate skb->head unless the current one hasn't the
needed extra size or is shared)

ksize() allows us to use a bit more than what was asked at kmalloc()
time, because of discrete kmem caches sizes.

We probably need to instruct kmemcheck of this.

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: Pekka Enberg <penberg@kernel.org>
Date: 2011-01-21 07:49:47

On 1/20/11 10:41 PM, Eric Dumazet wrote:
Le jeudi 20 janvier 2011 à 12:25 -0800, Andrew Morton a écrit :
quoted
(switched to email.  Please respond via emailed reply-to-all, not via the
bugzilla web interface).

On Thu, 20 Jan 2011 20:08:32 GMT
bugzilla-daemon@bugzilla.kernel.org wrote:
quoted
https://bugzilla.kernel.org/show_bug.cgi?id=27212

            Summary: Warning kmemcheck: Caught 64-bit read from
                     uninitialized memory in netlink_broadcast_filtered
            Product: Other
            Version: 2.5
     Kernel Version: 2.6.38-rc1
           Platform: All
         OS/Version: Linux
               Tree: Mainline
             Status: NEW
           Severity: normal
           Priority: P1
          Component: Other
         AssignedTo: other_other@kernel-bugs.osdl.org
         ReportedBy: casteyde.christian@free.fr
         Regression: Yes


Athlon 64 X2 3000 in 64bits
Slackware64 13.1
Kernel compiled with kmemcheck and other debug options

At boot I got the following warning:

PCI: Using ACPI for IRQ routing
PCI: pci_cache_line_size set to 64 bytes
pci 0000:00:00.0: address space collision: [mem 0xe0000000-0xefffffff pref]
conflicts with GART [mem 0x
e0000000-0xefffffff]
reserve RAM buffer: 000000000009fc00 - 000000000009ffff
reserve RAM buffer: 000000003ffb0000 - 000000003fffffff
WARNING: kmemcheck: Caught 64-bit read from uninitialized memory
(ffff88003e170eb0)
0000000000000000010000000000000000000000000000000000000000000000
  i i i i i i i i i i i i u u u u u u u u u u u u u u u u u u u u
                                  ^

Pid: 1, comm: swapper Not tainted 2.6.38-rc1 #2 K8 Combo-Z/K8 Combo-Z
RIP: 0010:[<ffffffff8127ad72>]  [<ffffffff8127ad72>] memmove+0x122/0x1a0
RSP: 0018:ffff88003e0b3c60  EFLAGS: 00010202
RAX: ffff88003e170080 RBX: ffff88003e27b500 RCX: 0000000000000020
RDX: 0000000000000018 RSI: ffff88003e170ea0 RDI: ffff88003e1700a0
RBP: ffff88003e0b3c60 R08: 0000000000000001 R09: 0000000000000001
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
R13: 0000000000000080 R14: 0000000000000000 R15: 0000000000000001
FS:  0000000000000000(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: ffff88003e018abc CR3: 0000000001a1c000 CR4: 00000000000006f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff4ff0 DR7: 0000000000000400
  [<ffffffff814741c2>] pskb_expand_head+0xc2/0x2a0
  [<ffffffff81498fa7>] netlink_broadcast_filtered+0xa7/0x4a0
  [<ffffffff814993b8>] netlink_broadcast+0x18/0x20
  [<ffffffff8149b884>] genlmsg_mcast+0x144/0x180
  [<ffffffff8149bc4a>] genl_ctrl_event+0xca/0x450
  [<ffffffff8149c75d>] genl_register_mc_group+0x10d/0x2a0
  [<ffffffff81ad9da4>] genl_init+0x6c/0x84
  [<ffffffff810001de>] do_one_initcall+0x3e/0x170
  [<ffffffff81aae6ea>] kernel_init+0x197/0x21b
  [<ffffffff81003254>] kernel_thread_helper+0x4/0x10
  [<ffffffffffffffff>] 0xffffffffffffffff
pnp: PnP ACPI init
ACPI: bus type pnp registered
pnp 00:00: [bus 00-ff]
pnp 00:00: [io  0x0cf8-0x0cff]

This is specific to 2.6.38-rc1.
Likely a false positive after commit ca44ac38
(net: don't reallocate skb->head unless the current one hasn't the
needed extra size or is shared)

ksize() allows us to use a bit more than what was asked at kmalloc()
time, because of discrete kmem caches sizes.

We probably need to instruct kmemcheck of this.
It actually looks like a bug in SLUB+kmemcheck. The kmemcheck_slab_alloc() call in slab_post_alloc_hook() should use ksize() instead of s->objsize. SLAB seems to do the right thing already. Anyone care to send a patch my way?

            Pekka

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: Eric Dumazet <hidden>
Date: 2011-01-26 09:18:44

Le jeudi 20 janvier 2011 à 12:25 -0800, Andrew Morton a écrit :
(switched to email.  Please respond via emailed reply-to-all, not via the
bugzilla web interface).

On Thu, 20 Jan 2011 20:08:32 GMT
bugzilla-daemon@bugzilla.kernel.org wrote:
quoted
https://bugzilla.kernel.org/show_bug.cgi?id=27212

           Summary: Warning kmemcheck: Caught 64-bit read from
                    uninitialized memory in netlink_broadcast_filtered
           Product: Other
           Version: 2.5
    Kernel Version: 2.6.38-rc1
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Other
        AssignedTo: other_other@kernel-bugs.osdl.org
        ReportedBy: casteyde.christian@free.fr
        Regression: Yes


Athlon 64 X2 3000 in 64bits
Slackware64 13.1
Kernel compiled with kmemcheck and other debug options

At boot I got the following warning:

PCI: Using ACPI for IRQ routing
PCI: pci_cache_line_size set to 64 bytes
pci 0000:00:00.0: address space collision: [mem 0xe0000000-0xefffffff pref]
conflicts with GART [mem 0x
e0000000-0xefffffff]
reserve RAM buffer: 000000000009fc00 - 000000000009ffff 
reserve RAM buffer: 000000003ffb0000 - 000000003fffffff
WARNING: kmemcheck: Caught 64-bit read from uninitialized memory
(ffff88003e170eb0)
0000000000000000010000000000000000000000000000000000000000000000
 i i i i i i i i i i i i u u u u u u u u u u u u u u u u u u u u
                                 ^

Pid: 1, comm: swapper Not tainted 2.6.38-rc1 #2 K8 Combo-Z/K8 Combo-Z
RIP: 0010:[<ffffffff8127ad72>]  [<ffffffff8127ad72>] memmove+0x122/0x1a0
RSP: 0018:ffff88003e0b3c60  EFLAGS: 00010202
RAX: ffff88003e170080 RBX: ffff88003e27b500 RCX: 0000000000000020
RDX: 0000000000000018 RSI: ffff88003e170ea0 RDI: ffff88003e1700a0
RBP: ffff88003e0b3c60 R08: 0000000000000001 R09: 0000000000000001
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
R13: 0000000000000080 R14: 0000000000000000 R15: 0000000000000001
FS:  0000000000000000(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: ffff88003e018abc CR3: 0000000001a1c000 CR4: 00000000000006f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff4ff0 DR7: 0000000000000400
 [<ffffffff814741c2>] pskb_expand_head+0xc2/0x2a0
 [<ffffffff81498fa7>] netlink_broadcast_filtered+0xa7/0x4a0
 [<ffffffff814993b8>] netlink_broadcast+0x18/0x20
 [<ffffffff8149b884>] genlmsg_mcast+0x144/0x180
 [<ffffffff8149bc4a>] genl_ctrl_event+0xca/0x450
 [<ffffffff8149c75d>] genl_register_mc_group+0x10d/0x2a0
 [<ffffffff81ad9da4>] genl_init+0x6c/0x84
 [<ffffffff810001de>] do_one_initcall+0x3e/0x170
 [<ffffffff81aae6ea>] kernel_init+0x197/0x21b
 [<ffffffff81003254>] kernel_thread_helper+0x4/0x10
 [<ffffffffffffffff>] 0xffffffffffffffff
pnp: PnP ACPI init
ACPI: bus type pnp registered
pnp 00:00: [bus 00-ff]
pnp 00:00: [io  0x0cf8-0x0cff]

This is specific to 2.6.38-rc1.
[PATCH] net: add kmemcheck annotation in __alloc_skb()

pskb_expand_head() triggers a kmemcheck warning when copy of
skb_shared_info is done in pskb_expand_head()

This is because destructor_arg field is not necessarily initialized at
this point. Add kmemcheck_annotate_variable() call in __alloc_skb() to
instruct kmemcheck this is a normal situation.

Resolves bugzilla.kernel.org 27212

Reference: https://bugzilla.kernel.org/show_bug.cgi?id=27212
Reported-by: Christian Casteyde <redacted>
Signed-off-by: Eric Dumazet <redacted>
CC: Andrew Morton <akpm@linux-foundation.org>
---
 net/core/skbuff.c |    1 +
 1 files changed, 1 insertion(+)
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index d31bb36..1762e97 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -210,6 +210,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask,
 	shinfo = skb_shinfo(skb);
 	memset(shinfo, 0, offsetof(struct skb_shared_info, dataref));
 	atomic_set(&shinfo->dataref, 1);
+	kmemcheck_annotate_variable(shinfo->destructor_arg);
 
 	if (fclone) {
 		struct sk_buff *child = skb + 1;

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: David Miller <davem@davemloft.net>
Date: 2011-01-27 22:40:54

From: Eric Dumazet <redacted>
Date: Wed, 26 Jan 2011 10:18:38 +0100
[PATCH] net: add kmemcheck annotation in __alloc_skb()

pskb_expand_head() triggers a kmemcheck warning when copy of
skb_shared_info is done in pskb_expand_head()

This is because destructor_arg field is not necessarily initialized at
this point. Add kmemcheck_annotate_variable() call in __alloc_skb() to
instruct kmemcheck this is a normal situation.

Resolves bugzilla.kernel.org 27212

Reference: https://bugzilla.kernel.org/show_bug.cgi?id=27212
Reported-by: Christian Casteyde <redacted>
Signed-off-by: Eric Dumazet <redacted>
CC: Andrew Morton <akpm@linux-foundation.org>
Applied, thanks Eric.

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: Eric Dumazet <hidden>
Date: 2011-02-14 17:35:33

Le vendredi 21 janvier 2011 à 09:49 +0200, Pekka Enberg a écrit :
It actually looks like a bug in SLUB+kmemcheck. The 
kmemcheck_slab_alloc() call in slab_post_alloc_hook() should use ksize() 
instead of s->objsize. SLAB seems to do the right thing already. Anyone 
care to send a patch my way?
Hmm, what do you think of following patch ?

Thanks, and sorry for the delay.

[PATCH] slub: fix kmemcheck calls to match ksize() hints

Recent use of ksize() in network stack (commit ca44ac38 : net: don't
reallocate skb->head unless the current one hasn't the needed extra size
or is shared) triggers kmemcheck warnings, because ksize() can return
more space than kmemcheck is aware of.

Pekka Enberg noticed SLAB+kmemcheck is doing the right thing, while SLUB
+kmemcheck doesnt.

Bugzilla reference #27212

Reported-by: Christian Casteyde <redacted>
Suggested-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Eric Dumazet <redacted>
CC: David Miller <davem@davemloft.net>
CC: Changli Gao <redacted>
CC: Andrew Morton <akpm@linux-foundation.org>
---
 mm/slub.c |   49 ++++++++++++++++++++++++++-----------------------
 1 file changed, 26 insertions(+), 23 deletions(-)
diff --git a/mm/slub.c b/mm/slub.c
index e15aa7f..ee0aeb8 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -797,10 +797,34 @@ static inline int slab_pre_alloc_hook(struct kmem_cache *s, gfp_t flags)
 	return should_failslab(s->objsize, flags, s->flags);
 }
 
+static inline size_t slab_ksize(const struct kmem_cache *s)
+{
+#ifdef CONFIG_SLUB_DEBUG
+	/*
+	 * Debugging requires use of the padding between object
+	 * and whatever may come after it.
+	 */
+	if (s->flags & (SLAB_RED_ZONE | SLAB_POISON))
+		return s->objsize;
+
+#endif
+	/*
+	 * If we have the need to store the freelist pointer
+	 * back there or track user information then we can
+	 * only use the space before that information.
+	 */
+	if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER))
+		return s->inuse;
+	/*
+	 * Else we can use all the padding etc for the allocation
+	 */
+	return s->size;
+}
+
 static inline void slab_post_alloc_hook(struct kmem_cache *s, gfp_t flags, void *object)
 {
 	flags &= gfp_allowed_mask;
-	kmemcheck_slab_alloc(s, flags, object, s->objsize);
+	kmemcheck_slab_alloc(s, flags, object, slab_ksize(s));
 	kmemleak_alloc_recursive(object, s->objsize, 1, s->flags, flags);
 }
 
@@ -2696,7 +2720,6 @@ EXPORT_SYMBOL(__kmalloc_node);
 size_t ksize(const void *object)
 {
 	struct page *page;
-	struct kmem_cache *s;
 
 	if (unlikely(object == ZERO_SIZE_PTR))
 		return 0;
@@ -2707,28 +2730,8 @@ size_t ksize(const void *object)
 		WARN_ON(!PageCompound(page));
 		return PAGE_SIZE << compound_order(page);
 	}
-	s = page->slab;
 
-#ifdef CONFIG_SLUB_DEBUG
-	/*
-	 * Debugging requires use of the padding between object
-	 * and whatever may come after it.
-	 */
-	if (s->flags & (SLAB_RED_ZONE | SLAB_POISON))
-		return s->objsize;
-
-#endif
-	/*
-	 * If we have the need to store the freelist pointer
-	 * back there or track user information then we can
-	 * only use the space before that information.
-	 */
-	if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER))
-		return s->inuse;
-	/*
-	 * Else we can use all the padding etc for the allocation
-	 */
-	return s->size;
+	return slab_ksize(page->slab);
 }
 EXPORT_SYMBOL(ksize);
 

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: David Miller <davem@davemloft.net>
Date: 2011-02-14 19:42:45

From: Eric Dumazet <redacted>
Date: Mon, 14 Feb 2011 18:35:22 +0100
Le vendredi 21 janvier 2011 à 09:49 +0200, Pekka Enberg a écrit :
quoted
It actually looks like a bug in SLUB+kmemcheck. The 
kmemcheck_slab_alloc() call in slab_post_alloc_hook() should use ksize() 
instead of s->objsize. SLAB seems to do the right thing already. Anyone 
care to send a patch my way?
Hmm, what do you think of following patch ?

Thanks, and sorry for the delay.

[PATCH] slub: fix kmemcheck calls to match ksize() hints

Recent use of ksize() in network stack (commit ca44ac38 : net: don't
reallocate skb->head unless the current one hasn't the needed extra size
or is shared) triggers kmemcheck warnings, because ksize() can return
more space than kmemcheck is aware of.

Pekka Enberg noticed SLAB+kmemcheck is doing the right thing, while SLUB
+kmemcheck doesnt.

Bugzilla reference #27212

Reported-by: Christian Casteyde <redacted>
Suggested-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Eric Dumazet <redacted>
Acked-by: David S. Miller <davem@davemloft.net>

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: Pekka Enberg <penberg@kernel.org>
Date: 2011-02-15 05:48:28

On Mon, Feb 14, 2011 at 7:35 PM, Eric Dumazet [off-list ref] wrote:
Le vendredi 21 janvier 2011 à 09:49 +0200, Pekka Enberg a écrit :
quoted
It actually looks like a bug in SLUB+kmemcheck. The
kmemcheck_slab_alloc() call in slab_post_alloc_hook() should use ksize()
instead of s->objsize. SLAB seems to do the right thing already. Anyone
care to send a patch my way?
Hmm, what do you think of following patch ?

Thanks, and sorry for the delay.
Looks good to me. Christoph, David, any objections to the patch?
quoted hunk
[PATCH] slub: fix kmemcheck calls to match ksize() hints

Recent use of ksize() in network stack (commit ca44ac38 : net: don't
reallocate skb->head unless the current one hasn't the needed extra size
or is shared) triggers kmemcheck warnings, because ksize() can return
more space than kmemcheck is aware of.

Pekka Enberg noticed SLAB+kmemcheck is doing the right thing, while SLUB
+kmemcheck doesnt.

Bugzilla reference #27212

Reported-by: Christian Casteyde <redacted>
Suggested-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Eric Dumazet <redacted>
CC: David Miller <davem@davemloft.net>
CC: Changli Gao <redacted>
CC: Andrew Morton <akpm@linux-foundation.org>
---
 mm/slub.c |   49 ++++++++++++++++++++++++++-----------------------
 1 file changed, 26 insertions(+), 23 deletions(-)
diff --git a/mm/slub.c b/mm/slub.c
index e15aa7f..ee0aeb8 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -797,10 +797,34 @@ static inline int slab_pre_alloc_hook(struct kmem_cache *s, gfp_t flags)
       return should_failslab(s->objsize, flags, s->flags);
 }

+static inline size_t slab_ksize(const struct kmem_cache *s)
+{
+#ifdef CONFIG_SLUB_DEBUG
+       /*
+        * Debugging requires use of the padding between object
+        * and whatever may come after it.
+        */
+       if (s->flags & (SLAB_RED_ZONE | SLAB_POISON))
+               return s->objsize;
+
+#endif
+       /*
+        * If we have the need to store the freelist pointer
+        * back there or track user information then we can
+        * only use the space before that information.
+        */
+       if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER))
+               return s->inuse;
+       /*
+        * Else we can use all the padding etc for the allocation
+        */
+       return s->size;
+}
+
 static inline void slab_post_alloc_hook(struct kmem_cache *s, gfp_t flags, void *object)
 {
       flags &= gfp_allowed_mask;
-       kmemcheck_slab_alloc(s, flags, object, s->objsize);
+       kmemcheck_slab_alloc(s, flags, object, slab_ksize(s));
       kmemleak_alloc_recursive(object, s->objsize, 1, s->flags, flags);
 }
@@ -2696,7 +2720,6 @@ EXPORT_SYMBOL(__kmalloc_node);
 size_t ksize(const void *object)
 {
       struct page *page;
-       struct kmem_cache *s;

       if (unlikely(object == ZERO_SIZE_PTR))
               return 0;
@@ -2707,28 +2730,8 @@ size_t ksize(const void *object)
               WARN_ON(!PageCompound(page));
               return PAGE_SIZE << compound_order(page);
       }
-       s = page->slab;

-#ifdef CONFIG_SLUB_DEBUG
-       /*
-        * Debugging requires use of the padding between object
-        * and whatever may come after it.
-        */
-       if (s->flags & (SLAB_RED_ZONE | SLAB_POISON))
-               return s->objsize;
-
-#endif
-       /*
-        * If we have the need to store the freelist pointer
-        * back there or track user information then we can
-        * only use the space before that information.
-        */
-       if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER))
-               return s->inuse;
-       /*
-        * Else we can use all the padding etc for the allocation
-        */
-       return s->size;
+       return slab_ksize(page->slab);
 }
 EXPORT_SYMBOL(ksize);



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: Christoph Lameter <hidden>
Date: 2011-02-15 16:40:47

On Tue, 15 Feb 2011, Pekka Enberg wrote:
Looks good to me. Christoph, David, any objections to the patch?
My eyes hurt. Is there some way you could use tabs or spaces instead of
these weird symbols?

If the kmemcheck people are fine with checking data beyond the last byte
of the object then its fine with me.

Acked-by: Christoph Lameter <redacted>

Re: [Bugme-new] [Bug 27212] New: Warning kmemcheck: Caught 64-bit read from uninitialized memory in netlink_broadcast_filtered

From: David Rientjes <rientjes@google.com>
Date: 2011-02-15 22:21:21

On Tue, 15 Feb 2011, Pekka Enberg wrote:
quoted
[PATCH] slub: fix kmemcheck calls to match ksize() hints

Recent use of ksize() in network stack (commit ca44ac38 : net: don't
reallocate skb->head unless the current one hasn't the needed extra size
or is shared) triggers kmemcheck warnings, because ksize() can return
more space than kmemcheck is aware of.

Pekka Enberg noticed SLAB+kmemcheck is doing the right thing, while SLUB
+kmemcheck doesnt.

Bugzilla reference #27212

Reported-by: Christian Casteyde <redacted>
Suggested-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Eric Dumazet <redacted>
CC: David Miller <davem@davemloft.net>
CC: Changli Gao <redacted>
CC: Andrew Morton <akpm@linux-foundation.org>
Acked-by: David Rientjes <rientjes@google.com>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help