Arnavion / k8s-openapi

Rust definitions of the resource types in the Kubernetes client API
Apache License 2.0
379 stars 41 forks source link

serializer crash on 0.10 when turning CRD into yaml #83

Closed clux closed 3 years ago

clux commented 3 years ago

When creating a v1 CustomResourcDefinition, and using k8s-openapi's serialize impls to create yaml via serde_yaml, we get a crash.

toml:

k8s-openapi = { version = "0.10.0", features = ["v1_19"], default-features = false }

code:

use k8s_openapi::apiextensions_apiserver::pkg::apis::apiextensions::v1::{CustomResourceDefinition, CustomResourceDefinitionSpec, CustomResourceDefinitionNames};
use k8s_openapi::apimachinery::pkg::apis::meta::v1::ObjectMeta;

fn main() {
    let crd = CustomResourceDefinition {
        metadata: ObjectMeta {
            name: Some("hello".to_string()),
            ..ObjectMeta::default()
        },
        spec: CustomResourceDefinitionSpec {
            group: "clux.dev".to_string(),
            scope: "Cluster".to_string(),
            names: CustomResourceDefinitionNames {
                plural: "foos".to_string(),
                kind: "Foo".to_string(),
                ..CustomResourceDefinitionNames::default()
            },
            ..CustomResourceDefinitionSpec::default()
        },
        ..CustomResourceDefinition::default()
    };
    let crd = serde_yaml::to_string(&crd).unwrap();
    println!("Foo CRD: \n{}", crd);
}
Backtrace
thread 'main' panicked at 'attempted to leave type `linked_hash_map::Node` uninitialized, which is invalid', /home/clux/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/mem/mod.rs:658:9
stack backtrace:
   0:     0x55a891293650 - std::backtrace_rs::backtrace::libunwind::trace::h72c2fb8038f1bbee
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/../../backtrace/src/backtrace/libunwind.rs:96
   1:     0x55a891293650 - std::backtrace_rs::backtrace::trace_unsynchronized::h1e3b084883f1e78c
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/../../backtrace/src/backtrace/mod.rs:66
   2:     0x55a891293650 - std::sys_common::backtrace::_print_fmt::h3bf6a7ebf7f0394a
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:79
   3:     0x55a891293650 - ::fmt::h2e8cb764b7fe02e7
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:58
   4:     0x55a8912ad19c - core::fmt::write::h7a1184eaee6a8644
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/fmt/mod.rs:1080
   5:     0x55a891291842 - std::io::Write::write_fmt::haeeb374d93a67eac
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/io/mod.rs:1516
   6:     0x55a89129577d - std::sys_common::backtrace::_print::h1d14a7f6ad632dc8
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:61
   7:     0x55a89129577d - std::sys_common::backtrace::print::h301abac8bb2e3e81
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:48
   8:     0x55a89129577d - std::panicking::default_hook::{{closure}}::hde0cb80358a6920a
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:208
   9:     0x55a891295428 - std::panicking::default_hook::h9b1a691049a0ec8f
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:227
  10:     0x55a891295e01 - std::panicking::rust_panic_with_hook::h2bdec87b60580584
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:577
  11:     0x55a8912959a9 - std::panicking::begin_panic_handler::{{closure}}::h101ca09d9df5db47
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:484
  12:     0x55a891293abc - std::sys_common::backtrace::__rust_end_short_backtrace::h3bb85654c20113ca
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:153
  13:     0x55a891295969 - rust_begin_unwind
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:483
  14:     0x55a8912ac4b1 - core::panicking::panic_fmt::h48c31e1e3d550146
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/panicking.rs:85
  15:     0x55a8912ac3fd - core::panicking::panic::h184ede6dd822ffb4
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/panicking.rs:50
  16:     0x55a8912474a3 - core::mem::uninitialized::h5f2b63577f62a0dd
                               at /home/clux/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/mem/mod.rs:658
  17:     0x55a8912474a3 - linked_hash_map::LinkedHashMap::ensure_guard_node::h7328050d771d9df6
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/linked-hash-map-0.5.2/src/lib.rs:174
  18:     0x55a8912476f7 - linked_hash_map::LinkedHashMap::insert::h474b19d3f4c7cb31
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/linked-hash-map-0.5.2/src/lib.rs:304
  19:     0x55a89122927a - ::serialize_field::h2bc58a0a8f568fff
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_yaml-0.8.13/src/ser.rs:359
  20:     0x55a89120ffad - ::serialize::hc80af770d6e47616
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/k8s-openapi-0.10.0/src/v1_19/apiextensions_apiserver/pkg/apis/apiextensions/v1/custom_resource_definition.rs:838
  21:     0x55a891210558 - serde::ser::impls::::serialize::hd11f36e6a7a31a4a
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.115/src/ser/impls.rs:390
  22:     0x55a89122081a - serde_yaml::ser::to_yaml::h94673e8e69683c55
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_yaml-0.8.13/src/ser.rs:448
  23:     0x55a891220fdc - serde_yaml::ser::to_writer::hcc9763e41058443b
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_yaml-0.8.13/src/ser.rs:394
  24:     0x55a891220034 - serde_yaml::ser::to_vec::h40f28607b62d05b1
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_yaml-0.8.13/src/ser.rs:411
  25:     0x55a891220dac - serde_yaml::ser::to_string::h3241a8a3c32f7eb8
                               at /home/clux/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_yaml-0.8.13/src/ser.rs:423
  26:     0x55a8912014b6 - openapi::main::hfe72204671af6ff6
                               at /home/clux/repos/kube-rs/examples/openapi.rs:22
  27:     0x55a8912027cb - core::ops::function::FnOnce::call_once::h97f994f89f043124
                               at /home/clux/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227
  28:     0x55a89121cf3e - std::sys_common::backtrace::__rust_begin_short_backtrace::h16d85b677a33148c
                               at /home/clux/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/backtrace.rs:137
  29:     0x55a8912016b1 - std::rt::lang_start::{{closure}}::h32ebf4008fdafed4
                               at /home/clux/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:66
  30:     0x55a891296227 - core::ops::function::impls:: for &F>::call_once::he179d32a5d10d957
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/ops/function.rs:259
  31:     0x55a891296227 - std::panicking::try::do_call::hcb3d5e7be089b2b4
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:381
  32:     0x55a891296227 - std::panicking::try::h7ac93b0cd56fb701
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:345
  33:     0x55a891296227 - std::panic::catch_unwind::h7b40e396c93a4fcd
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panic.rs:382
  34:     0x55a891296227 - std::rt::lang_start_internal::h142b9cc66267fea1
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/rt.rs:51
  35:     0x55a891201687 - std::rt::lang_start::h4f169b83c30ad4d4
                               at /home/clux/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:65
  36:     0x55a89120163a - main
  37:     0x7fdff4ab9152 - __libc_start_main
  38:     0x55a8911ff09e - _start
  39:                0x0 - 

( Downstream issue https://github.com/clux/kube-rs/issues/349 )

The json serialization is fine, but the yaml one always seem to fail after upgrading to 0.10. This worked in 0.9.

clux commented 3 years ago

As best I can tell, this corresponds to the first invocation of serialize_field in:

impl serde::Serialize for CustomResourceDefinition {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let mut state = serializer.serialize_struct(
            <Self as crate::Resource>::KIND,
            4 + self.status.as_ref().map_or(0, |_| 1),
        )?;
        serde::ser::SerializeStruct::serialize_field(
            &mut state,
            "apiVersion",
            <Self as crate::Resource>::API_VERSION,
        )?;
        serde::ser::SerializeStruct::serialize_field(
            &mut state,
            "kind",
            <Self as crate::Resource>::KIND,
        )?;
        serde::ser::SerializeStruct::serialize_field(&mut state, "metadata", &self.metadata)?;
        serde::ser::SerializeStruct::serialize_field(&mut state, "spec", &self.spec)?;
        if let Some(value) = &self.status {
            serde::ser::SerializeStruct::serialize_field(&mut state, "status", value)?;
        }
        serde::ser::SerializeStruct::end(state)
    }
}
Arnavion commented 3 years ago

It's from a rustc change that cracked done on some misuses of std::mem::uninitialized. Update your linked-hash-map dep to v0.5.3 so that it has https://github.com/contain-rs/linked-hash-map/commit/da9e3fb458d1a0f383b033ea41bdb466e3d96805 and https://github.com/contain-rs/linked-hash-map/commit/df65b33f8a9dbd06b95b0a6af7521f0d47233545 It's not related to k8s-openapi

clux commented 3 years ago

Ah. Sorry! Thank you. cargo upgrade serde_yaml fixed it.