{"record":{"id":"057042471850c8e8","repo":"cloudflare/quiche","slug":"the-provided-buffer-is-too-large","errorCode":null,"errorMessage":"The provided buffer is too large","messagePattern":"The provided buffer is too large","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"quiche/src/ffi.rs","lineNumber":855,"sourceCode":"    to: &'a sockaddr,\n    to_len: socklen_t,\n}\n\nimpl From<&RecvInfo<'_>> for crate::RecvInfo {\n    fn from(info: &RecvInfo) -> crate::RecvInfo {\n        crate::RecvInfo {\n            from: std_addr_from_c(info.from, info.from_len),\n            to: std_addr_from_c(info.to, info.to_len),\n        }\n    }\n}\n\n#[no_mangle]\npub extern \"C\" fn quiche_conn_recv(\n    conn: &mut Connection, buf: *mut u8, buf_len: size_t, info: &RecvInfo,\n) -> ssize_t {\n    if buf_len > <ssize_t>::MAX as usize {\n        panic!(\"The provided buffer is too large\");\n    }\n\n    let buf = unsafe { slice::from_raw_parts_mut(buf, buf_len) };\n\n    match conn.recv(buf, info.into()) {\n        Ok(v) => v as ssize_t,\n\n        Err(e) => e.to_c(),\n    }\n}\n\n#[repr(C)]\npub struct SendInfo {\n    from: sockaddr_storage,\n    from_len: socklen_t,\n    to: sockaddr_storage,\n    to_len: socklen_t,\n","sourceCodeStart":837,"sourceCodeEnd":873,"githubUrl":"https://github.com/cloudflare/quiche/blob/9f96daa2c22a4468b0036fb0a0a3894eee6498b8/quiche/src/ffi.rs#L837-L873","documentation":"The C FFI entry point quiche_conn_recv panics if the caller passes a receive buffer whose length exceeds ssize_t::MAX. Such a length is impossible for a real datagram and would make the function's ssize_t return convention ambiguous (a successful byte count could alias an error code). The check is a defensive guard on the raw FFI boundary.","triggerScenarios":"Calling quiche_conn_recv from C/C++ (or any FFI caller) with buf_len larger than SSIZE_MAX — typically from an uninitialized, corrupted, or wrongly sized length variable.","commonSituations":"Uninitialized size_t passed as buf_len; integer overflow when computing the buffer length; passing a negative int that was cast to size_t (wrapping to a huge value).","solutions":["Fix the caller to pass the true buffer size (must be <= SSIZE_MAX and realistically <= 65527 for QUIC datagrams).","Initialize buf_len properly and check the computation that produced it for overflow or sign errors.","Add a caller-side assert(buf_len <= SSIZE_MAX) before invoking quiche_conn_recv."],"exampleFix":"// before\nssize_t n = quiche_conn_recv(conn, buf, (size_t)-1, &info);\n// after\nsize_t buf_len = 65527;\nassert(buf_len <= SSIZE_MAX);\nssize_t n = quiche_conn_recv(conn, buf, buf_len, &info);","handlingStrategy":"validation","validationCode":"if (buf_len > (size_t)SSIZE_MAX) { /* reject before calling */ abort(); }\nssize_t n = quiche_conn_recv(conn, buf, buf_len, &info);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass an initialized, correctly computed buffer length.","Cap buffer size at the QUIC datagram limit (65527) in callers."],"tags":["quiche","ffi","buffer","c-api"],"backgroundTag":"invalid-argument-value","analyzedSha":"9f96daa2c22a4468b0036fb0a0a3894eee6498b8","analyzedAt":"2026-09-08T11:27:09.536Z","contentChangedAt":"2026-09-08T11:27:09.536Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}