From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755449AbeDTOea (ORCPT ); Fri, 20 Apr 2018 10:34:30 -0400 Received: from mail-oi0-f41.google.com ([209.85.218.41]:39866 "EHLO mail-oi0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755421AbeDTOe1 (ORCPT ); Fri, 20 Apr 2018 10:34:27 -0400 X-Google-Smtp-Source: AIpwx4+ZsgFiQgXKKNjeP/034I2Xju/zOoP9gk921cachdI/XbVjdVna6nzJAB0W/0By7j3DIj33xLGf2K3RNzMfTBA= MIME-Version: 1.0 X-Originating-IP: [176.63.54.97] In-Reply-To: References: <20180418174014.1592871-1-songliubraving@fb.com> From: Miklos Szeredi Date: Fri, 20 Apr 2018 16:34:25 +0200 Message-ID: Subject: Re: [PATCH v2] tracing: fix bad use of igrab in trace_uprobe.c To: Song Liu Cc: LKML , Kernel Team , Steven Rostedt , Ingo Molnar , Howard McLauchlan , Josef Bacik , Srikar Dronamraju Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 19, 2018 at 6:37 PM, Song Liu wrote: > > >> On Apr 19, 2018, at 7:44 AM, Miklos Szeredi wrote: >> >> On Thu, Apr 19, 2018 at 10:58 AM, Miklos Szeredi wrote: >>> On Wed, Apr 18, 2018 at 7:40 PM, Song Liu wrote: >>>> *arg++ = '\0'; >>>> filename = argv[1]; >>>> ret = kern_path(filename, LOOKUP_FOLLOW, &path); >>>> if (ret) >>>> - goto fail_address_parse; >>>> - >>>> - inode = igrab(d_real_inode(path.dentry)); >> >> Also, where has the d_real_inode() gone? >> >> Looks like we need tu->inode back, since the return value of >> d_real_inode() may change over time. I'd do the "tu->inode = >> d_real_inode(tu->path.dentry)" just before first use (i.e. when >> enabling the tracepoint). >> > > Do we need mechanism to prevent the return value of d_real_inode() > to change? Would the following sequence happen? > > create trace_uprobe > enable trace_uprobe (uprobe_register) > d_real changes > disable trace_uprobe (uprobe_unregister get wrong inode?) Yes. > > Another case might be: > > create trace_uprobe > enable trace_uprobe (uprobe_register) > disable trace_uprobe (uprobe_unregister) > d_real changes > enable trace_uprobe (do we need new inode for uprobe_register) Probably a good idea to use the new one, but doesn't really matter. Do the one that's simpler. This corner case is simply not interesting (modifying a binary while it is being debugged with uprobe). Let's just concentrate on making this crash and leak free. Thanks, Miklos