From a1f13329e8ca51e46fc57e28e0d34a2485e2f7b3 Mon Sep 17 00:00:00 2001 From: Trevor Elliott Date: Tue, 11 Jun 2024 16:39:05 -0700 Subject: [PATCH] Fix buffer-len handling in the component adapter (#381) * Add a single test that uses the component adapter * Fix the adapter's handling of BufferLen errors * Fix the response test to not use invalid buffers for long headers --- cli/tests/integration/common.rs | 12 +- cli/tests/integration/response.rs | 10 ++ crates/adapter/src/fastly/cache.rs | 2 +- crates/adapter/src/fastly/config_store.rs | 27 ++-- crates/adapter/src/fastly/core.rs | 156 +++++++--------------- crates/adapter/src/fastly/error.rs | 2 +- crates/adapter/src/fastly/macros.rs | 38 +++++- lib/data/viceroy-component-adapter.wasm | Bin 135993 -> 179589 bytes lib/src/component/error.rs | 2 +- lib/src/component/http_req.rs | 6 +- lib/src/component/http_resp.rs | 36 +++-- lib/wit/deps/fastly/compute.wit | 7 +- test-fixtures/src/bin/response.rs | 18 ++- 13 files changed, 156 insertions(+), 160 deletions(-) diff --git a/cli/tests/integration/common.rs b/cli/tests/integration/common.rs index e4849316..9888a7b3 100644 --- a/cli/tests/integration/common.rs +++ b/cli/tests/integration/common.rs @@ -60,6 +60,7 @@ pub struct Test { log_stderr: bool, via_hyper: bool, unknown_import_behavior: UnknownImportBehavior, + adapt_component: bool, } impl Test { @@ -80,6 +81,7 @@ impl Test { log_stderr: false, via_hyper: false, unknown_import_behavior: Default::default(), + adapt_component: false, } } @@ -100,6 +102,7 @@ impl Test { log_stderr: false, via_hyper: false, unknown_import_behavior: Default::default(), + adapt_component: false, } } @@ -234,6 +237,12 @@ impl Test { } } + /// Automatically adapt the wasm to a component before running. + pub fn adapt_component(mut self) -> Self { + self.adapt_component = true; + self + } + /// Pass the given requests through this test, returning the associated responses. /// /// A `Test` can be used repeatedly against different requests, either individually (as with @@ -276,14 +285,13 @@ impl Test { self.backends.start_servers().await; } - let adapt_core_wasm = false; let ctx = ExecuteCtx::new( &self.module_path, ProfilingStrategy::None, HashSet::new(), None, self.unknown_import_behavior, - adapt_core_wasm, + self.adapt_component, )? .with_backends(self.backends.backend_configs().await) .with_dictionaries(self.dictionaries.clone()) diff --git a/cli/tests/integration/response.rs b/cli/tests/integration/response.rs index a2f044da..f2457c71 100644 --- a/cli/tests/integration/response.rs +++ b/cli/tests/integration/response.rs @@ -9,3 +9,13 @@ async fn response_works() -> TestResult { assert_eq!(resp.status(), StatusCode::OK); Ok(()) } + +#[tokio::test(flavor = "multi_thread")] +async fn response_works_component() -> TestResult { + let resp = Test::using_fixture("response.wasm") + .adapt_component() + .against_empty() + .await?; + assert_eq!(resp.status(), StatusCode::OK); + Ok(()) +} diff --git a/crates/adapter/src/fastly/cache.rs b/crates/adapter/src/fastly/cache.rs index 16d86488..d493fa0a 100644 --- a/crates/adapter/src/fastly/cache.rs +++ b/crates/adapter/src/fastly/cache.rs @@ -1,5 +1,5 @@ use super::{convert_result, BodyHandle, FastlyStatus, RequestHandle}; -use crate::{alloc_result, with_buffer, TrappingUnwrap}; +use crate::{alloc_result, TrappingUnwrap}; pub type CacheHandle = u32; diff --git a/crates/adapter/src/fastly/config_store.rs b/crates/adapter/src/fastly/config_store.rs index 5db9ddbc..6193416a 100644 --- a/crates/adapter/src/fastly/config_store.rs +++ b/crates/adapter/src/fastly/config_store.rs @@ -1,5 +1,5 @@ use super::FastlyStatus; -use crate::{bindings::fastly::api::config_store, with_buffer, TrappingUnwrap}; +use crate::{alloc_result_opt, bindings::fastly::api::config_store, TrappingUnwrap}; use core::slice; pub type ConfigStoreHandle = u32; @@ -32,22 +32,11 @@ pub fn get( nwritten: *mut usize, ) -> FastlyStatus { let key = unsafe { slice::from_raw_parts(key, key_len) }; - with_buffer!( - value, - value_max_len, - { - config_store::get( - store_handle, - key, - u64::try_from(value_max_len).trapping_unwrap(), - ) - }, - |res| { - let res = res.ok_or(FastlyStatus::NONE)?; - unsafe { - *nwritten = res.len(); - } - std::mem::forget(res) - } - ) + alloc_result_opt!(value, value_max_len, nwritten, { + config_store::get( + store_handle, + key, + u64::try_from(value_max_len).trapping_unwrap(), + ) + }) } diff --git a/crates/adapter/src/fastly/core.rs b/crates/adapter/src/fastly/core.rs index 375529e4..28124247 100644 --- a/crates/adapter/src/fastly/core.rs +++ b/crates/adapter/src/fastly/core.rs @@ -3,7 +3,7 @@ // wrappers around these definitions. use super::{convert_result, FastlyStatus}; -use crate::{alloc_result, with_buffer, TrappingUnwrap}; +use crate::{alloc_result, alloc_result_opt, handle_buffer_len, with_buffer, TrappingUnwrap}; impl From for u32 { fn from(value: crate::bindings::fastly::api::http_types::HttpVersion) -> Self { @@ -420,7 +420,7 @@ pub mod fastly_http_body { ) }, |res| { - let (written, end) = match res { + let (written, end) = match handle_buffer_len!(res, nwritten) { Some((bytes, next)) => { let written = bytes.len(); let end = match next { @@ -453,24 +453,13 @@ pub mod fastly_http_body { nwritten: *mut usize, ) -> FastlyStatus { let name = unsafe { slice::from_raw_parts(name, name_len) }; - with_buffer!( - value, - value_max_len, - { - http_body::trailer_value_get( - body_handle, - name, - u64::try_from(value_max_len).trapping_unwrap(), - ) - }, - |res| { - let res = res.ok_or(FastlyStatus::NONE)?; - unsafe { - *nwritten = res.len(); - } - std::mem::forget(res); - } - ) + alloc_result_opt!(value, value_max_len, nwritten, { + http_body::trailer_value_get( + body_handle, + name, + u64::try_from(value_max_len).trapping_unwrap(), + ) + }) } #[export_name = "fastly_http_body#trailer_values_get"] @@ -497,7 +486,7 @@ pub mod fastly_http_body { ) }, |res| { - let (written, end) = match res { + let (written, end) = match handle_buffer_len!(res, nwritten) { Some((bytes, next)) => { let written = bytes.len(); let end = match next { @@ -1093,7 +1082,7 @@ pub mod fastly_http_req { ) }, |res| { - let (written, end) = match res { + let (written, end) = match handle_buffer_len!(res, nwritten) { Some((bytes, next)) => { let written = bytes.len(); let end = match next { @@ -1149,7 +1138,7 @@ pub mod fastly_http_req { ) }, |res| { - let (written, end) = match res { + let (written, end) = match handle_buffer_len!(res, nwritten) { Some((bytes, next)) => { let written = bytes.len(); let end = match next { @@ -1195,7 +1184,7 @@ pub mod fastly_http_req { ) }, |res| { - let (written, end) = match res { + let (written, end) = match handle_buffer_len!(res, nwritten) { Some((bytes, next)) => { let written = bytes.len(); let end = match next { @@ -1243,24 +1232,13 @@ pub mod fastly_http_req { nwritten: *mut usize, ) -> FastlyStatus { let name = unsafe { slice::from_raw_parts(name, name_len) }; - with_buffer!( - value, - value_max_len, - { - fastly::api::http_req::header_value_get( - req_handle, - name, - u64::try_from(value_max_len).trapping_unwrap(), - ) - }, - |res| { - let res = res.ok_or(FastlyStatus::NONE)?; - unsafe { - *nwritten = res.len(); - } - std::mem::forget(res); - } - ) + alloc_result_opt!(value, value_max_len, nwritten, { + fastly::api::http_req::header_value_get( + req_handle, + name, + u64::try_from(value_max_len).trapping_unwrap(), + ) + }) } #[export_name = "fastly_http_req#header_remove"] @@ -1748,7 +1726,7 @@ pub mod fastly_http_resp { ) }, |res| { - let (written, end) = match res { + let (written, end) = match handle_buffer_len!(res, nwritten) { Some((bytes, next)) => { let written = bytes.len(); let end = match next { @@ -1781,24 +1759,13 @@ pub mod fastly_http_resp { nwritten: *mut usize, ) -> FastlyStatus { let name = unsafe { slice::from_raw_parts(name, name_len) }; - with_buffer!( - value, - value_max_len, - { - http_resp::header_value_get( - resp_handle, - name, - u64::try_from(value_max_len).trapping_unwrap(), - ) - }, - |res| { - let res = res.ok_or(FastlyStatus::NONE)?; - unsafe { - *nwritten = res.len(); - } - std::mem::forget(res); - } - ) + alloc_result_opt!(value, value_max_len, nwritten, { + http_resp::header_value_get( + resp_handle, + name, + u64::try_from(value_max_len).trapping_unwrap(), + ) + }) } #[export_name = "fastly_http_resp#header_values_get"] @@ -1825,7 +1792,7 @@ pub mod fastly_http_resp { ) }, |res| { - let (written, end) = match res { + let (written, end) = match handle_buffer_len!(res, nwritten) { Some((bytes, next)) => { let written = bytes.len(); let end = match next { @@ -2017,24 +1984,13 @@ pub mod fastly_dictionary { nwritten: *mut usize, ) -> FastlyStatus { let key = unsafe { slice::from_raw_parts(key, key_len) }; - with_buffer!( - value, - value_max_len, - { - dictionary::get( - dict_handle, - key, - u64::try_from(value_max_len).trapping_unwrap(), - ) - }, - |res| { - let res = res.ok_or(FastlyStatus::NONE)?; - unsafe { - *nwritten = res.len(); - } - std::mem::forget(res) - } - ) + alloc_result_opt!(value, value_max_len, nwritten, { + dictionary::get( + dict_handle, + key, + u64::try_from(value_max_len).trapping_unwrap(), + ) + }) } } @@ -2405,23 +2361,12 @@ pub mod fastly_secret_store { plaintext_max_len: usize, nwritten_out: *mut usize, ) -> FastlyStatus { - with_buffer!( - plaintext_buf, - plaintext_max_len, - { - secret_store::plaintext( - secret_handle, - u64::try_from(plaintext_max_len).trapping_unwrap(), - ) - }, - |res| { - let res = res.ok_or(FastlyStatus::NONE)?; - unsafe { - *nwritten_out = res.len(); - } - std::mem::forget(res); - } - ) + alloc_result_opt!(plaintext_buf, plaintext_max_len, nwritten_out, { + secret_store::plaintext( + secret_handle, + u64::try_from(plaintext_max_len).trapping_unwrap(), + ) + }) } #[export_name = "fastly_secret_store#from_bytes"] @@ -2564,18 +2509,9 @@ pub mod fastly_backend { nwritten: *mut usize, ) -> FastlyStatus { let backend = unsafe { slice::from_raw_parts(backend_ptr, backend_len) }; - with_buffer!( - value, - value_max_len, - { backend::get_override_host(backend, u64::try_from(value_max_len).trapping_unwrap()) }, - |res| { - let res = res.ok_or(FastlyStatus::NONE)?; - unsafe { - *nwritten = res.len(); - } - std::mem::forget(res); - } - ) + alloc_result_opt!(value, value_max_len, nwritten, { + backend::get_override_host(backend, u64::try_from(value_max_len).trapping_unwrap()) + }) } #[export_name = "fastly_backend#get_port"] @@ -2796,7 +2732,7 @@ pub mod fastly_purge { ) }, |res| { - if let Some(res) = res { + if let Some(res) = res? { unsafe { *(*options).ret_buf_nwritten_out = res.len(); } diff --git a/crates/adapter/src/fastly/error.rs b/crates/adapter/src/fastly/error.rs index 0c7fecf3..66cb860a 100644 --- a/crates/adapter/src/fastly/error.rs +++ b/crates/adapter/src/fastly/error.rs @@ -24,7 +24,7 @@ impl From for FastlyStatus { Error::GenericError => 1, Error::InvalidArgument => Self::INVALID_ARGUMENT.0, Error::BadHandle => 3, - Error::BufferLen => 4, + Error::BufferLen(_) => 4, Error::Unsupported => 5, Error::BadAlign => 6, Error::HttpInvalid => 7, diff --git a/crates/adapter/src/fastly/macros.rs b/crates/adapter/src/fastly/macros.rs index 8047f992..fd7c6502 100644 --- a/crates/adapter/src/fastly/macros.rs +++ b/crates/adapter/src/fastly/macros.rs @@ -2,7 +2,7 @@ macro_rules! with_buffer { ($buf:expr, $len:expr, $alloc:block, |$res:ident| $free:block) => { crate::State::with::(|state| { - let $res = state.import_alloc.with_buffer($buf, $len, || $alloc)?; + let $res = state.import_alloc.with_buffer($buf, $len, || $alloc); $free; Ok(()) }) @@ -12,7 +12,8 @@ macro_rules! with_buffer { #[macro_export] macro_rules! alloc_result { ($buf:expr, $len:expr, $nwritten:expr, $block:block) => { - with_buffer!($buf, $len, $block, |res| { + crate::with_buffer!($buf, $len, $block, |res| { + let res = crate::handle_buffer_len!(res, $nwritten); unsafe { *$nwritten = res.len(); } @@ -21,3 +22,36 @@ macro_rules! alloc_result { }) }; } + +#[macro_export] +macro_rules! alloc_result_opt { + ($buf:expr, $len:expr, $nwritten:expr, $block:block) => { + crate::with_buffer!($buf, $len, $block, |res| { + let res = crate::handle_buffer_len!(res, $nwritten).ok_or(FastlyStatus::NONE)?; + unsafe { + *$nwritten = res.len(); + } + + std::mem::forget(res); + }) + }; +} + +#[macro_export] +macro_rules! handle_buffer_len { + ($res:ident, $nwritten:expr) => { + match $res { + Ok(res) => res, + Err(err) => { + if let crate::bindings::fastly::api::types::Error::BufferLen(needed) = err { + unsafe { + *$nwritten = + crate::TrappingUnwrap::trapping_unwrap(usize::try_from(needed)); + } + } + + return Err(err.into()); + } + } + }; +} diff --git a/lib/data/viceroy-component-adapter.wasm b/lib/data/viceroy-component-adapter.wasm index 5cf314de9ac3cb436d44df31b8c14a6fd7ef7e80..f1e12673f137d13621d9efe243f94031970a387a 100755 GIT binary patch literal 179589 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 QtDduW^ze!E%#F|df26d$1ONa4 literal 135993 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 for types::Error { fn from(err: error::Error) -> Self { use error::Error; match err { - Error::BufferLengthError { .. } => types::Error::BufferLen, + Error::BufferLengthError { .. } => types::Error::BufferLen(0), Error::InvalidArgument => types::Error::InvalidArgument, Error::Unsupported { .. } => types::Error::Unsupported, Error::HandleError { .. } => types::Error::BadHandle, diff --git a/lib/src/component/http_req.rs b/lib/src/component/http_req.rs index bcf5b46c..16c2f7ad 100644 --- a/lib/src/component/http_req.rs +++ b/lib/src/component/http_req.rs @@ -211,11 +211,7 @@ impl http_req::Host for Session { }; if value.len() > usize::try_from(max_len).unwrap() { - return Err(Error::BufferLengthError { - buf: "value", - len: "value_max_len", - } - .into()); + return Err(types::Error::BufferLen(u64::try_from(value.len()).unwrap())); } Ok(Some(value.as_bytes().to_owned())) diff --git a/lib/src/component/http_resp.rs b/lib/src/component/http_resp.rs index ef086ba5..12d7c7f6 100644 --- a/lib/src/component/http_resp.rs +++ b/lib/src/component/http_resp.rs @@ -88,8 +88,17 @@ impl http_resp::Host for Session { cursor, ); - if buf.is_empty() && next.is_none() { - return Ok(None); + if buf.is_empty() { + if next.is_none() { + return Ok(None); + } else { + // It's an error if we couldn't write even a single value. + return Err(Error::BufferLengthError { + buf: "buf", + len: "buf.len()", + } + .into()); + } } Ok(Some((buf, next))) @@ -113,11 +122,7 @@ impl http_resp::Host for Session { }; if value.len() > usize::try_from(max_len).unwrap() { - return Err(Error::BufferLengthError { - buf: "value", - len: "value_max_len", - } - .into()); + return Err(types::Error::BufferLen(u64::try_from(value.len()).unwrap())); } Ok(Some(value.as_bytes().to_owned())) @@ -130,6 +135,10 @@ impl http_resp::Host for Session { max_len: u64, cursor: u32, ) -> Result, Option)>, types::Error> { + if name.len() > MAX_HEADER_NAME_LEN { + return Err(Error::InvalidArgument.into()); + } + let headers = &self.response_parts(h.into())?.headers; let values = headers.get_all(HeaderName::from_str(&name)?); @@ -141,8 +150,17 @@ impl http_resp::Host for Session { cursor, ); - if buf.is_empty() && next.is_none() { - return Ok(None); + if buf.is_empty() { + if next.is_none() { + return Ok(None); + } else { + // It's an error if we couldn't write even a single value. + return Err(Error::BufferLengthError { + buf: "buf", + len: "buf.len()", + } + .into()); + } } Ok(Some((buf, next))) diff --git a/lib/wit/deps/fastly/compute.wit b/lib/wit/deps/fastly/compute.wit index dc5066cf..a5243038 100644 --- a/lib/wit/deps/fastly/compute.wit +++ b/lib/wit/deps/fastly/compute.wit @@ -2,7 +2,7 @@ package fastly:api; interface types { // TODO: split this up into function-specific error enums - enum error { + variant error { /// Unknown error value. /// It should be an internal error if this is returned. unknown-error, @@ -15,8 +15,9 @@ interface types { /// Thrown when a handle is not valid. E.G. No dictionary exists with the given name. bad-handle, /// Buffer length error. - /// Thrown when a buffer is too long. - buffer-len, + /// Thrown when a buffer is the wrong size. + /// Includes the buffer length that would allow the operation to succeed. + buffer-len(u64), /// Unsupported operation error. /// This error is thrown when some operation cannot be performed, because it is not supported. unsupported, diff --git a/test-fixtures/src/bin/response.rs b/test-fixtures/src/bin/response.rs index 851e2af3..2ae3b082 100644 --- a/test-fixtures/src/bin/response.rs +++ b/test-fixtures/src/bin/response.rs @@ -151,11 +151,13 @@ fn test_header_value_get_and_insert() { // Test that an attempt to get a too-long header name fails. nwritten = 0; + let long_header = + Vec::from_iter(hdr_name.iter().cycle().take(HEADER_LEN_TOO_LONG).copied()); assert_eq!( header_value_get( resp, - hdr_name.as_ptr(), - HEADER_LEN_TOO_LONG, + long_header.as_ptr(), + long_header.len(), good_buffer.as_mut_ptr(), good_max, &mut nwritten @@ -168,8 +170,8 @@ fn test_header_value_get_and_insert() { assert_eq!( header_insert( resp, - hdr_name.as_ptr(), - HEADER_LEN_TOO_LONG, + long_header.as_ptr(), + long_header.len(), hdr_val.as_ptr(), hdr_val.len(), ), @@ -215,11 +217,13 @@ fn test_header_append_and_remove() { ); // Test that an attempt to append a too-long header name fails. + let long_header = + Vec::from_iter(hdr_name.iter().cycle().take(HEADER_LEN_TOO_LONG).copied()); assert_eq!( header_append( resp, - hdr_name.as_ptr(), - HEADER_LEN_TOO_LONG, + long_header.as_ptr(), + long_header.len(), hdr_val.as_ptr(), hdr_val.len(), ), @@ -228,7 +232,7 @@ fn test_header_append_and_remove() { // Test that an attempt to remove a too-long header name fails. assert_eq!( - header_remove(resp, hdr_name.as_ptr(), HEADER_LEN_TOO_LONG,), + header_remove(resp, long_header.as_ptr(), long_header.len()), FastlyStatus::INVAL );