mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	kprobes: fix a memory leak in function pre_handler_kretprobe()
In function pre_handler_kretprobe(), the allocated kretprobe_instance object will get leaked if the entry_handler callback returns non-zero. This may cause all the preallocated kretprobe_instance objects exhausted. This issue can be reproduced by changing samples/kprobes/kretprobe_example.c to probe "mutex_unlock". And the fix is straightforward: just put the allocated kretprobe_instance object back onto the free_instances list. [akpm@linux-foundation.org: use raw_spin_lock/unlock] Signed-off-by: Jiang Liu <jiang.liu@huawei.com> Acked-by: Jim Keniston <jkenisto@us.ibm.com> Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									cbcb834605
								
							
						
					
					
						commit
						55ca6140e9
					
				
					 1 changed files with 5 additions and 1 deletions
				
			
		| 
						 | 
					@ -1673,8 +1673,12 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p,
 | 
				
			||||||
		ri->rp = rp;
 | 
							ri->rp = rp;
 | 
				
			||||||
		ri->task = current;
 | 
							ri->task = current;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (rp->entry_handler && rp->entry_handler(ri, regs))
 | 
							if (rp->entry_handler && rp->entry_handler(ri, regs)) {
 | 
				
			||||||
 | 
								raw_spin_lock_irqsave(&rp->lock, flags);
 | 
				
			||||||
 | 
								hlist_add_head(&ri->hlist, &rp->free_instances);
 | 
				
			||||||
 | 
								raw_spin_unlock_irqrestore(&rp->lock, flags);
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		arch_prepare_kretprobe(ri, regs);
 | 
							arch_prepare_kretprobe(ri, regs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue