|  | @@ -40,8 +40,9 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "src/core/lib/channel/channel_args.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define DEFAULT_MAX_SEND_MESSAGE_LENGTH -1  // Unlimited.
 | 
	
		
			
				|  |  |  // The protobuf library will (by default) start warning at 100 megs.
 | 
	
		
			
				|  |  | -#define DEFAULT_MAX_MESSAGE_LENGTH (4 * 1024 * 1024)
 | 
	
		
			
				|  |  | +#define DEFAULT_MAX_RECV_MESSAGE_LENGTH (4 * 1024 * 1024)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  typedef struct call_data {
 | 
	
		
			
				|  |  |    // Receive closures are chained: we inject this closure as the
 | 
	
	
		
			
				|  | @@ -55,8 +56,8 @@ typedef struct call_data {
 | 
	
		
			
				|  |  |  } call_data;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  typedef struct channel_data {
 | 
	
		
			
				|  |  | -  size_t max_send_size;
 | 
	
		
			
				|  |  | -  size_t max_recv_size;
 | 
	
		
			
				|  |  | +  long max_send_size;
 | 
	
		
			
				|  |  | +  long max_recv_size;
 | 
	
		
			
				|  |  |  } channel_data;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Callback invoked when we receive a message.  Here we check the max
 | 
	
	
		
			
				|  | @@ -66,7 +67,7 @@ static void recv_message_ready(grpc_exec_ctx* exec_ctx, void* user_data,
 | 
	
		
			
				|  |  |    grpc_call_element* elem = user_data;
 | 
	
		
			
				|  |  |    call_data* calld = elem->call_data;
 | 
	
		
			
				|  |  |    channel_data* chand = elem->channel_data;
 | 
	
		
			
				|  |  | -  if (*calld->recv_message != NULL &&
 | 
	
		
			
				|  |  | +  if (*calld->recv_message != NULL && chand->max_recv_size >= 0 &&
 | 
	
		
			
				|  |  |        (*calld->recv_message)->length > chand->max_recv_size) {
 | 
	
		
			
				|  |  |      char* message_string;
 | 
	
		
			
				|  |  |      gpr_asprintf(
 | 
	
	
		
			
				|  | @@ -88,7 +89,7 @@ static void start_transport_stream_op(grpc_exec_ctx* exec_ctx,
 | 
	
		
			
				|  |  |    call_data* calld = elem->call_data;
 | 
	
		
			
				|  |  |    channel_data* chand = elem->channel_data;
 | 
	
		
			
				|  |  |    // Check max send message size.
 | 
	
		
			
				|  |  | -  if (op->send_message != NULL &&
 | 
	
		
			
				|  |  | +  if (op->send_message != NULL && chand->max_send_size >= 0 &&
 | 
	
		
			
				|  |  |        op->send_message->length > chand->max_send_size) {
 | 
	
		
			
				|  |  |      char* message_string;
 | 
	
		
			
				|  |  |      gpr_asprintf(&message_string, "Sent message larger than max (%u vs. %lu)",
 | 
	
	
		
			
				|  | @@ -130,17 +131,20 @@ static void init_channel_elem(grpc_exec_ctx* exec_ctx,
 | 
	
		
			
				|  |  |    GPR_ASSERT(!args->is_last);
 | 
	
		
			
				|  |  |    channel_data* chand = elem->channel_data;
 | 
	
		
			
				|  |  |    memset(chand, 0, sizeof(*chand));
 | 
	
		
			
				|  |  | -  chand->max_send_size = DEFAULT_MAX_MESSAGE_LENGTH;
 | 
	
		
			
				|  |  | -  chand->max_recv_size = DEFAULT_MAX_MESSAGE_LENGTH;
 | 
	
		
			
				|  |  | -  const grpc_integer_options options = {DEFAULT_MAX_MESSAGE_LENGTH, 0, INT_MAX};
 | 
	
		
			
				|  |  | +  chand->max_send_size = DEFAULT_MAX_SEND_MESSAGE_LENGTH;
 | 
	
		
			
				|  |  | +  chand->max_recv_size = DEFAULT_MAX_RECV_MESSAGE_LENGTH;
 | 
	
		
			
				|  |  |    for (size_t i = 0; i < args->channel_args->num_args; ++i) {
 | 
	
		
			
				|  |  |      if (strcmp(args->channel_args->args[i].key,
 | 
	
		
			
				|  |  |                 GRPC_ARG_MAX_SEND_MESSAGE_LENGTH) == 0) {
 | 
	
		
			
				|  |  | +      const grpc_integer_options options = {DEFAULT_MAX_SEND_MESSAGE_LENGTH, 0,
 | 
	
		
			
				|  |  | +                                            INT_MAX};
 | 
	
		
			
				|  |  |        chand->max_send_size = (size_t)grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  |            &args->channel_args->args[i], options);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      if (strcmp(args->channel_args->args[i].key,
 | 
	
		
			
				|  |  |                 GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH) == 0) {
 | 
	
		
			
				|  |  | +      const grpc_integer_options options = {DEFAULT_MAX_RECV_MESSAGE_LENGTH, 0,
 | 
	
		
			
				|  |  | +                                            INT_MAX};
 | 
	
		
			
				|  |  |        chand->max_recv_size = (size_t)grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  |            &args->channel_args->args[i], options);
 | 
	
		
			
				|  |  |      }
 |