Skip to content

Commit 5002c63

Browse files
v2.1: Clean up rpc filter verification (backport of #5305) (#5306)
Clean up rpc filter verification (#5305) Co-authored-by: Kirill Fomichev <[email protected]> (cherry picked from commit 22a98ce) Co-authored-by: Will Hickey <[email protected]>
1 parent a5744e7 commit 5002c63

File tree

3 files changed

+29
-12
lines changed

3 files changed

+29
-12
lines changed

rpc/src/rpc.rs

+14-9
Original file line numberDiff line numberDiff line change
@@ -2412,7 +2412,7 @@ impl JsonRpcRequestProcessor {
24122412
}
24132413
}
24142414

2415-
fn optimize_filters(filters: &mut [RpcFilterType]) {
2415+
pub(crate) fn optimize_filters(filters: &mut [RpcFilterType]) {
24162416
filters.iter_mut().for_each(|filter_type| {
24172417
if let RpcFilterType::Memcmp(compare) = filter_type {
24182418
if let Err(err) = compare.convert_to_raw_bytes() {
@@ -2443,6 +2443,18 @@ fn verify_transaction(
24432443
Ok(())
24442444
}
24452445

2446+
pub(crate) fn verify_filters(filters: &[RpcFilterType]) -> Result<()> {
2447+
if filters.len() > MAX_GET_PROGRAM_ACCOUNT_FILTERS {
2448+
return Err(Error::invalid_params(format!(
2449+
"Too many filters provided; max {MAX_GET_PROGRAM_ACCOUNT_FILTERS}"
2450+
)));
2451+
}
2452+
for filter in filters {
2453+
verify_filter(filter)?;
2454+
}
2455+
Ok(())
2456+
}
2457+
24462458
fn verify_filter(input: &RpcFilterType) -> Result<()> {
24472459
input
24482460
.verify()
@@ -3391,14 +3403,7 @@ pub mod rpc_accounts_scan {
33913403
} else {
33923404
(None, vec![], false, true)
33933405
};
3394-
if filters.len() > MAX_GET_PROGRAM_ACCOUNT_FILTERS {
3395-
return Err(Error::invalid_params(format!(
3396-
"Too many filters provided; max {MAX_GET_PROGRAM_ACCOUNT_FILTERS}"
3397-
)));
3398-
}
3399-
for filter in &filters {
3400-
verify_filter(filter)?;
3401-
}
3406+
verify_filters(&filters)?;
34023407
meta.get_program_accounts(program_id, config, filters, with_context, sort_results)
34033408
.await
34043409
}

rpc/src/rpc_pubsub.rs

+11-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::{rpc_pubsub_service, rpc_subscriptions::RpcSubscriptions};
44
use {
55
crate::{
6-
rpc::check_is_at_least_confirmed,
6+
rpc::{check_is_at_least_confirmed, optimize_filters, verify_filters},
77
rpc_pubsub_service::PubSubConfig,
88
rpc_subscription_tracker::{
99
AccountSubscriptionParams, BlockSubscriptionKind, BlockSubscriptionParams,
@@ -450,9 +450,18 @@ impl RpcSolPubSubInternal for RpcSolPubSubImpl {
450450
config: Option<RpcProgramAccountsConfig>,
451451
) -> Result<SubscriptionId> {
452452
let config = config.unwrap_or_default();
453+
let mut filters = config.filters.unwrap_or_default();
454+
if let Err(error) = verify_filters(&filters) {
455+
return Err(Error {
456+
code: ErrorCode::InvalidParams,
457+
message: error.to_string(),
458+
data: None,
459+
});
460+
}
461+
optimize_filters(&mut filters);
453462
let params = ProgramSubscriptionParams {
454463
pubkey: param::<Pubkey>(&pubkey_str, "pubkey")?,
455-
filters: config.filters.unwrap_or_default(),
464+
filters,
456465
encoding: config
457466
.account_config
458467
.encoding

rpc/src/rpc_pubsub_service.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,10 @@ async fn handle_connection(
375375
protocol: None,
376376
};
377377
server.send_response(&accept).await?;
378-
let (mut sender, mut receiver) = server.into_builder().finish();
378+
let mut builder = server.into_builder();
379+
builder.set_max_message_size(4_096);
380+
builder.set_max_frame_size(4_096);
381+
let (mut sender, mut receiver) = builder.finish();
379382

380383
let mut broadcast_receiver = subscription_control.broadcast_receiver();
381384
let mut data = Vec::new();

0 commit comments

Comments
 (0)