From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752046AbdJZBXG (ORCPT ); Wed, 25 Oct 2017 21:23:06 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:9427 "EHLO szxga04-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751902AbdJZBXD (ORCPT ); Wed, 25 Oct 2017 21:23:03 -0400 Subject: Re: [PATCH] kernel/kprobes: add check to avoid kprobe memory leak To: Masami Hiramatsu CC: , , , , , References: <1508847422-63641-1-git-send-email-chenjiankang1@huawei.com> <20171026015453.ba08699319ffaa9a18bbd8e3@kernel.org> From: chenjiankang Message-ID: Date: Thu, 26 Oct 2017 09:22:23 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <20171026015453.ba08699319ffaa9a18bbd8e3@kernel.org> Content-Type: text/plain; charset="gbk" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.219.158] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090204.59F138E7.0068,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 6f19568ca687497915ef37cf544d68d7 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > On Tue, 24 Oct 2017 20:17:02 +0800 > JianKang Chen wrote: > >> The function register_kretprobe is used to initialize a struct >> kretprobe and allocate a list table for kprobe instance. >> However,in this function, there is a memory leak. >> >> The test case: >> >> static struct kretprobe rp; >> struct kretprobe *rps[10]={&rp ,&rp ,&rp , >> &rp ,&rp ,&rp ,&rp ,&rp ,&rp,&rp}; > > What ? this is buggy code. you must not list same kretprobe. > But, year, since register_kprobe() already has similar protection against > reusing, register_kretprobe() should do so. > > [..] >> raw_spin_lock_init(&rp->lock); >> + >> + if (!hlist_empty(&rp->free_instances)) >> + return -EBUSY; >> + > > Hmm, but can you use check_kprobe_rereg() before raw_spin_lock_init()? > If user reuses rp after it starts, rp->lock can already be used. Hmm, your advice is very good, we can use check_kprobe_rereg() at the beginning of the register_kretprobe(); For example: int register_kretprobe(struct kretprobe *rp) { int ret = 0; struct kretprobe_instance *inst; int i; void *addr; ret = check_kprobe_rereg(&rp->kp); if (ret) return ret; Thank you!