From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,FSL_HELO_FAKE, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EFC07C282DD for ; Thu, 23 May 2019 12:46:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B59B521019 for ; Thu, 23 May 2019 12:46:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Qkh1d5JH" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730679AbfEWMqY (ORCPT ); Thu, 23 May 2019 08:46:24 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:52088 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729361AbfEWMqY (ORCPT ); Thu, 23 May 2019 08:46:24 -0400 Received: by mail-wm1-f66.google.com with SMTP id c77so5696459wmd.1 for ; Thu, 23 May 2019 05:46:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :user-agent; bh=uvF3GlPlKtGBn9YznlUCUGXArBicbpHv7ixx+/z7vSQ=; b=Qkh1d5JH80ZnSbykF11Qca3fnwKTdC7BlZRhQ9IgI9HRCcMezi90ITm7Hd8cKcvw4+ ElRrs5O7AwPsFqY7491zhzdliiUfuzfl9ZfUQgKbtqxyDvX170KtMrWg3LQX9PlP8/FG YfOGv6t0YAjPrn7RtUHxPgNpPikYKelCjCueI0jUHEc5TRdLMRx2WI2LHUZZZKB3yzWB EBLDdkfRO1yexk6GzVkwuf0J74BFsY7csRNhnluHS6pOCC/DaAtE6JvSkP8ru6heH79t HR3ZlFsqFkN+V4PMkOykakLyRFKj9YlFy6/qdkgVUPa650a+diqRYnWj1YWab9l6cESI SIUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=uvF3GlPlKtGBn9YznlUCUGXArBicbpHv7ixx+/z7vSQ=; b=otEAVWb4RwjF+I1F5hLBlgBBg/JgbPQJd8JsD7hTdodF8s/Z83Qsk/Sayo4OttbPsV OwVPcDozL/Iu/1ALAlzgcsaS95R3AAPglI8Uy54EU03QXwZ0Kf2erZ8pWUGhfyTsKYOQ nSTqHtxGifll7XLRRz5jzETETe6fQsHMCBrZEsJF8Zk2tRr9Ztx8Jl6ul464FUosUQF2 wt61vMB37EL+btIRj/l67LwnBh2MDAUBTRJnjkzdpQmfw+MyKz09XkIy2smzMFsbgEM4 bKxy9CigH9CtjELbYdbsqdXnhZj5T606uKHIdTwtulJUq4t3gbqFQJ6q5mLYmiogHOQi rFOg== X-Gm-Message-State: APjAAAXMO8DL6I8ZvRXHKHkLI7absT5I8UV3CpIP5zX/xTA2Ho+foO/N ppvBarnqYphnZBm9v67nYrQ= X-Google-Smtp-Source: APXvYqxKrHRviNqoUYQk5mhGfRINyg7WM3J8HX4lYcUurj2CoHz6ttz/fYD467N3adAy6TkyWsE2EA== X-Received: by 2002:a1c:cb0e:: with SMTP id b14mr11125680wmg.61.1558615582184; Thu, 23 May 2019 05:46:22 -0700 (PDT) Received: from gmail.com (79.108.96.12.dyn.user.ono.com. [79.108.96.12]) by smtp.gmail.com with ESMTPSA id t19sm8106213wmi.42.2019.05.23.05.46.21 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 23 May 2019 05:46:21 -0700 (PDT) Date: Thu, 23 May 2019 14:45:35 +0200 From: Miguel Ojeda To: Steven Rostedt , Ingo Molnar Cc: Linus Torvalds , linux-kernel@vger.kernel.org Subject: [PATCH] tracing: silence GCC 9 array bounds warning Message-ID: <20190523124535.GA12931@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: elm/2 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Starting with GCC 9, -Warray-bounds detects cases when memset is called starting on a member of a struct but the size to be cleared ends up writing over further members. Such a call happens in the trace code to clear, at once, all members after and including `seq` on struct trace_iterator: In function 'memset', inlined from 'ftrace_dump' at kernel/trace/trace.c:8914:3: ./include/linux/string.h:344:9: warning: '__builtin_memset' offset [8505, 8560] from the object at 'iter' is out of the bounds of referenced subobject 'seq' with type 'struct trace_seq' at offset 4368 [-Warray-bounds] 344 | return __builtin_memset(p, c, size); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ In order to avoid GCC complaining about it, we compute the address ourselves by adding the offsetof distance instead of referring directly to the member. Since there are two places doing this clear (trace.c and trace_kdb.c), take the chance to move the workaround into a single place in the internal header. Signed-off-by: Miguel Ojeda --- kernel/trace/trace.c | 6 +----- kernel/trace/trace.h | 18 ++++++++++++++++++ kernel/trace/trace_kdb.c | 6 +----- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 2c92b3d9ea30..1c80521fd436 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -8910,12 +8910,8 @@ void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) cnt++; - /* reset all but tr, trace, and overruns */ - memset(&iter.seq, 0, - sizeof(struct trace_iterator) - - offsetof(struct trace_iterator, seq)); + trace_iterator_reset(&iter); iter.iter_flags |= TRACE_FILE_LAT_FMT; - iter.pos = -1; if (trace_find_next_entry_inc(&iter) != NULL) { int ret; diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 1974ce818ddb..ac63ad5acb93 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1967,4 +1967,22 @@ static inline void tracer_hardirqs_off(unsigned long a0, unsigned long a1) { } extern struct trace_iterator *tracepoint_print_iter; +/* + * Reset the state of the trace_iterator so that it can read consumed data. + * Normally, the trace_iterator is used for reading the data when it is not + * consumed, and must retain state. + */ +static __always_inline void trace_iterator_reset(struct trace_iterator *iter) +{ + const size_t offset = offsetof(struct trace_iterator, seq); + + /* + * Keep gcc from complaining about overwriting more than just one + * member in the structure. + */ + memset((char *)(iter) + offset, 0, sizeof(struct trace_iterator) - offset); + + iter->pos = -1; +} + #endif /* _LINUX_KERNEL_TRACE_H */ diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c index 6c1ae6b752d1..cca65044c14c 100644 --- a/kernel/trace/trace_kdb.c +++ b/kernel/trace/trace_kdb.c @@ -37,12 +37,8 @@ static void ftrace_dump_buf(int skip_entries, long cpu_file) if (skip_entries) kdb_printf("(skipping %d entries)\n", skip_entries); - /* reset all but tr, trace, and overruns */ - memset(&iter.seq, 0, - sizeof(struct trace_iterator) - - offsetof(struct trace_iterator, seq)); + trace_iterator_reset(&iter); iter.iter_flags |= TRACE_FILE_LAT_FMT; - iter.pos = -1; if (cpu_file == RING_BUFFER_ALL_CPUS) { for_each_tracing_cpu(cpu) { -- 2.17.1