Skip to content

Commit b445d5b

Browse files
committed
sync ttrpc: Add size checks where packets are created
server: check before send to client client: check before send to server Signed-off-by: Tim Zhang <[email protected]>
1 parent b66144b commit b445d5b

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

src/error.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
//! Error and Result of ttrpc and relevant functions, macros.
1616
17-
use crate::proto::{Code, Status};
17+
use crate::proto::{Code, Response, Status};
1818
use std::result;
1919
use thiserror::Error;
2020

@@ -48,6 +48,20 @@ pub enum Error {
4848
Others(String),
4949
}
5050

51+
impl From<Error> for Response {
52+
fn from(e: Error) -> Self {
53+
let status = if let Error::RpcStatus(stat) = e {
54+
stat
55+
} else {
56+
get_status(Code::UNKNOWN, e)
57+
};
58+
59+
let mut res = Response::new();
60+
res.set_status(status);
61+
res
62+
}
63+
}
64+
5165
/// A specialized Result type for ttrpc.
5266
pub type Result<T> = result::Result<T, Error>;
5367

src/sync/client.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
#[cfg(unix)]
1818
use std::os::unix::io::RawFd;
1919

20+
use protobuf::Message;
2021
use std::collections::HashMap;
2122
use std::sync::mpsc;
2223
use std::sync::{Arc, Mutex};
2324
use std::thread;
2425
use std::time::Duration;
2526

27+
use crate::common::check_oversize;
2628
use crate::error::{Error, Result};
2729
use crate::proto::{Code, Codec, MessageHeader, Request, Response, MESSAGE_TYPE_RESPONSE};
2830
use crate::sync::channel::{read_message, write_message};
@@ -150,7 +152,10 @@ impl Client {
150152
})
151153
}
152154
pub fn request(&self, req: Request) -> Result<Response> {
155+
check_oversize(req.compute_size() as usize, false)?;
156+
153157
let buf = req.encode().map_err(err_to_others_err!(e, ""))?;
158+
// Notice: pure client problem can't be rpc error
154159

155160
let (tx, rx) = mpsc::sync_channel(0);
156161

src/sync/utils.rs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
// SPDX-License-Identifier: Apache-2.0
44
//
55

6-
use crate::error::{get_status, Error, Result};
7-
use crate::proto::{Code, MessageHeader, Request, Response, MESSAGE_TYPE_RESPONSE};
8-
use protobuf::Message;
6+
use crate::common::check_oversize;
7+
use crate::error::{Error, Result};
8+
use crate::proto::{Codec, MessageHeader, Request, Response, MESSAGE_TYPE_RESPONSE};
99
use std::collections::HashMap;
1010

1111
/// Response message through a channel.
@@ -15,19 +15,20 @@ pub fn response_to_channel(
1515
res: Response,
1616
tx: std::sync::mpsc::Sender<(MessageHeader, Vec<u8>)>,
1717
) -> Result<()> {
18-
let mut buf = Vec::with_capacity(res.compute_size() as usize);
19-
let mut s = protobuf::CodedOutputStream::vec(&mut buf);
20-
res.write_to(&mut s).map_err(err_to_others_err!(e, ""))?;
21-
s.flush().map_err(err_to_others_err!(e, ""))?;
18+
let mut buf = res.encode().map_err(err_to_others_err!(e, ""))?;
2219

23-
drop(s);
20+
if let Err(e) = check_oversize(buf.len(), true) {
21+
let resp: Response = e.into();
22+
buf = resp.encode().map_err(err_to_others_err!(e, ""))?;
23+
};
2424

2525
let mh = MessageHeader {
2626
length: buf.len() as u32,
2727
stream_id,
2828
type_: MESSAGE_TYPE_RESPONSE,
2929
flags: 0,
3030
};
31+
3132
tx.send((mh, buf)).map_err(err_to_others_err!(e, ""))?;
3233

3334
Ok(())
@@ -38,16 +39,7 @@ pub fn response_error_to_channel(
3839
e: Error,
3940
tx: std::sync::mpsc::Sender<(MessageHeader, Vec<u8>)>,
4041
) -> Result<()> {
41-
let status = if let Error::RpcStatus(stat) = e {
42-
stat
43-
} else {
44-
get_status(Code::UNKNOWN, e)
45-
};
46-
47-
let mut res = Response::new();
48-
res.set_status(status);
49-
50-
response_to_channel(stream_id, res, tx)
42+
response_to_channel(stream_id, e.into(), tx)
5143
}
5244

5345
/// Handle request in sync mode.

0 commit comments

Comments
 (0)