diff options
Diffstat (limited to 'net/tipc/config.c')
| -rw-r--r-- | net/tipc/config.c | 41 | 
1 files changed, 23 insertions, 18 deletions
diff --git a/net/tipc/config.c b/net/tipc/config.c index c5712a343810..a056a3852f71 100644 --- a/net/tipc/config.c +++ b/net/tipc/config.c @@ -39,6 +39,8 @@  #include "name_table.h"  #include "config.h" +#define REPLY_TRUNCATED "<truncated>\n" +  static u32 config_port_ref;  static DEFINE_SPINLOCK(config_lock); @@ -104,13 +106,12 @@ struct sk_buff *tipc_cfg_reply_string_type(u16 tlv_type, char *string)  	return buf;  } -#define MAX_STATS_INFO 2000 -  static struct sk_buff *tipc_show_stats(void)  {  	struct sk_buff *buf;  	struct tlv_desc *rep_tlv; -	struct print_buf pb; +	char *pb; +	int pb_len;  	int str_len;  	u32 value; @@ -121,17 +122,16 @@ static struct sk_buff *tipc_show_stats(void)  	if (value != 0)  		return tipc_cfg_reply_error_string("unsupported argument"); -	buf = tipc_cfg_reply_alloc(TLV_SPACE(MAX_STATS_INFO)); +	buf = tipc_cfg_reply_alloc(TLV_SPACE(ULTRA_STRING_MAX_LEN));  	if (buf == NULL)  		return NULL;  	rep_tlv = (struct tlv_desc *)buf->data; -	tipc_printbuf_init(&pb, (char *)TLV_DATA(rep_tlv), MAX_STATS_INFO); - -	tipc_printf(&pb, "TIPC version " TIPC_MOD_VER "\n"); +	pb = TLV_DATA(rep_tlv); +	pb_len = ULTRA_STRING_MAX_LEN; -	/* Use additional tipc_printf()'s to return more info ... */ -	str_len = tipc_printbuf_validate(&pb); +	str_len = tipc_snprintf(pb, pb_len, "TIPC version " TIPC_MOD_VER "\n"); +	str_len += 1;	/* for "\0" */  	skb_put(buf, TLV_SPACE(str_len));  	TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len); @@ -334,12 +334,6 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area  	case TIPC_CMD_SHOW_PORTS:  		rep_tlv_buf = tipc_port_get_ports();  		break; -	case TIPC_CMD_SET_LOG_SIZE: -		rep_tlv_buf = tipc_log_resize_cmd(req_tlv_area, req_tlv_space); -		break; -	case TIPC_CMD_DUMP_LOG: -		rep_tlv_buf = tipc_log_dump(); -		break;  	case TIPC_CMD_SHOW_STATS:  		rep_tlv_buf = tipc_show_stats();  		break; @@ -399,6 +393,8 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area  	case TIPC_CMD_GET_MAX_CLUSTERS:  	case TIPC_CMD_SET_MAX_NODES:  	case TIPC_CMD_GET_MAX_NODES: +	case TIPC_CMD_SET_LOG_SIZE: +	case TIPC_CMD_DUMP_LOG:  		rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED  							  " (obsolete command)");  		break; @@ -408,6 +404,15 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area  		break;  	} +	WARN_ON(rep_tlv_buf->len > TLV_SPACE(ULTRA_STRING_MAX_LEN)); + +	/* Append an error message if we cannot return all requested data */ +	if (rep_tlv_buf->len == TLV_SPACE(ULTRA_STRING_MAX_LEN)) { +		if (*(rep_tlv_buf->data + ULTRA_STRING_MAX_LEN) != '\0') +			sprintf(rep_tlv_buf->data + rep_tlv_buf->len - +				sizeof(REPLY_TRUNCATED) - 1, REPLY_TRUNCATED); +	} +  	/* Return reply buffer */  exit:  	spin_unlock_bh(&config_lock); @@ -432,7 +437,7 @@ static void cfg_named_msg_event(void *userdata,  	if ((size < sizeof(*req_hdr)) ||  	    (size != TCM_ALIGN(ntohl(req_hdr->tcm_len))) ||  	    (ntohs(req_hdr->tcm_flags) != TCM_F_REQUEST)) { -		warn("Invalid configuration message discarded\n"); +		pr_warn("Invalid configuration message discarded\n");  		return;  	} @@ -478,7 +483,7 @@ int tipc_cfg_init(void)  	return 0;  failed: -	err("Unable to create configuration service\n"); +	pr_err("Unable to create configuration service\n");  	return res;  } @@ -494,7 +499,7 @@ void tipc_cfg_reinit(void)  	seq.lower = seq.upper = tipc_own_addr;  	res = tipc_publish(config_port_ref, TIPC_ZONE_SCOPE, &seq);  	if (res) -		err("Unable to reinitialize configuration service\n"); +		pr_err("Unable to reinitialize configuration service\n");  }  void tipc_cfg_stop(void)  | 
