lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJ-ks9=UwOz=-NR0MJ3pjKZNGjb7+3R-shFqYKQF206s5Tp6ew@mail.gmail.com>
Date: Mon, 12 Jan 2026 12:48:52 -0500
From: Tamir Duberstein <tamird@...il.com>
To: Gary Guo <gary@...yguo.net>
Cc: Miguel Ojeda <ojeda@...nel.org>, Boqun Feng <boqun.feng@...il.com>, 
	Björn Roy Baron <bjorn3_gh@...tonmail.com>, 
	Benno Lossin <lossin@...nel.org>, Andreas Hindborg <a.hindborg@...nel.org>, 
	Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>, 
	Danilo Krummrich <dakr@...nel.org>, rust-for-linux@...r.kernel.org, 
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH v3 12/12] rust: macros: support `#[cfg]` properly in
 `#[vtable]` macro.

On Mon, Jan 12, 2026 at 12:12 PM Gary Guo <gary@...nel.org> wrote:
>
> From: Gary Guo <gary@...yguo.net>
>
> Currently, we generate `HAS_` constants as long as the definition exists in
> the source, regardless if it is cfg-ed out or not.
>
> Currently, uses of `#[cfg]` present in both trait and impl, so it is not a
> problem; however if only the impl side uses `#[cfg]` then `HAS_` constants
> will incorrectly be true while it shouldnt't.
>
> With `syn` support, we can now implement `#[cfg]` handling properly by
> propagating the `#[cfg]` attributes to the constants.
>
> Signed-off-by: Gary Guo <gary@...yguo.net>
> ---
>  rust/macros/helpers.rs |  9 +++++++++
>  rust/macros/vtable.rs  | 13 ++++---------
>  2 files changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/rust/macros/helpers.rs b/rust/macros/helpers.rs
> index adfa60d8f42d8..c17287da801dd 100644
> --- a/rust/macros/helpers.rs
> +++ b/rust/macros/helpers.rs
> @@ -7,6 +7,7 @@
>          Parse,
>          ParseStream, //
>      },
> +    Attribute,
>      Error,
>      LitStr,
>      Result, //
> @@ -53,3 +54,11 @@ pub(crate) fn file() -> String {
>          proc_macro::Span::call_site().file()
>      }
>  }
> +
> +/// Obtain all `#[cfg]` attributes.
> +pub(crate) fn gather_cfg_attrs(attr: &[Attribute]) -> Vec<Attribute> {
> +    attr.iter()
> +        .filter(|a| a.path().is_ident("cfg"))
> +        .cloned()
> +        .collect()
> +}

I believe there's no need to collect this into a vector, `quote`
supports iterators.

https://docs.rs/quote/latest/quote/macro.quote.html#interpolation

> diff --git a/rust/macros/vtable.rs b/rust/macros/vtable.rs
> index 72ae0a1816a04..c6510b0c4ea1d 100644
> --- a/rust/macros/vtable.rs
> +++ b/rust/macros/vtable.rs
> @@ -23,7 +23,6 @@
>
>  fn handle_trait(mut item: ItemTrait) -> Result<ItemTrait> {
>      let mut gen_items = Vec::new();
> -    let mut gen_consts = HashSet::new();
>
>      gen_items.push(parse_quote! {
>           /// A marker to prevent implementors from forgetting to use [`#[vtable]`](vtable)
> @@ -38,22 +37,17 @@ fn handle_trait(mut item: ItemTrait) -> Result<ItemTrait> {
>                  &format!("HAS_{}", name.to_string().to_uppercase()),
>                  name.span(),
>              );
> -            // Skip if it's declared already -- this can happen if `#[cfg]` is used to selectively
> -            // define functions.
> -            // FIXME: `#[cfg]` should be copied and propagated to the generated consts.
> -            if gen_consts.contains(&gen_const_name) {
> -                continue;
> -            }
>
>              // We don't know on the implementation-site whether a method is required or provided
>              // so we have to generate a const for all methods.
> +            let cfg_attrs = crate::helpers::gather_cfg_attrs(&fn_item.attrs);
>              let comment =
>                  format!("Indicates if the `{name}` method is overridden by the implementor.");
>              gen_items.push(parse_quote! {
> +                #(#cfg_attrs)*
>                  #[doc = #comment]
>                  const #gen_const_name: bool = false;
>              });
> -            gen_consts.insert(gen_const_name);
>          }
>      }
>
> @@ -87,10 +81,11 @@ fn handle_impl(mut item: ItemImpl) -> Result<ItemImpl> {
>              if defined_consts.contains(&gen_const_name) {
>                  continue;
>              }
> +            let cfg_attrs = crate::helpers::gather_cfg_attrs(&fn_item.attrs);
>              gen_items.push(parse_quote! {
> +                #(#cfg_attrs)*
>                  const #gen_const_name: bool = true;
>              });
> -            defined_consts.insert(gen_const_name);
>          }
>      }
>
> --
> 2.51.2
>

Reviewed-by: Tamir Duberstein <tamird@...il.com>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ