diff options
| author | Philippe Guibert <philippe.guibert@6wind.com> | 2018-03-28 14:35:56 +0200 | 
|---|---|---|
| committer | Philippe Guibert <philippe.guibert@6wind.com> | 2018-03-30 14:01:06 +0200 | 
| commit | 362a06e37d82eae495b386f85aa5106b8dc7dffc (patch) | |
| tree | 0079a5322e76596781f6147e2a7c3874fb43a44f /bgpd/bgp_flowspec_vty.c | |
| parent | a83da8e19cdc0d74f0589f8644dbe5b79943498c (diff) | |
bgpd: Flowspec display handlers uses snprintf
snprintf routine is used widely, when the handler routine in charge of
displaying the output is called.
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'bgpd/bgp_flowspec_vty.c')
| -rw-r--r-- | bgpd/bgp_flowspec_vty.c | 92 | 
1 files changed, 62 insertions, 30 deletions
diff --git a/bgpd/bgp_flowspec_vty.c b/bgpd/bgp_flowspec_vty.c index eae9bedcbd..247da5d183 100644 --- a/bgpd/bgp_flowspec_vty.c +++ b/bgpd/bgp_flowspec_vty.c @@ -68,16 +68,28 @@ static const struct message bgp_flowspec_display_min[] = {  	{0}  }; -#define	FS_STRING_UPDATE(count, ptr, format) do {			      \ -		if (((format) == NLRI_STRING_FORMAT_DEBUG) && (count)) {      \ -			(ptr) += sprintf((ptr), ", ");                        \ -		} else if (((format) == NLRI_STRING_FORMAT_MIN) && (count)) { \ -			(ptr) += sprintf((ptr), " ");                         \ -		}                                                             \ -		count++;			                              \ +#define	FS_STRING_UPDATE(count, ptr, format, remaining_len) do {	\ +		int _len_written;					\ +									\ +		if (((format) == NLRI_STRING_FORMAT_DEBUG) && (count)) {\ +			_len_written = snprintf((ptr), (remaining_len),	\ +						", ");			\ +			(remaining_len) -= _len_written;		\ +			(ptr) += _len_written;				\ +		} else if (((format) == NLRI_STRING_FORMAT_MIN) 	\ +			   && (count)) {				\ +			_len_written = snprintf((ptr), (remaining_len),	\ +						" ");			\ +			(remaining_len) -= _len_written;		\ +			(ptr) += _len_written;				\ +		}							\ +		count++;						\  	} while (0) -/* Parse FLOWSPEC NLRI*/ +/* Parse FLOWSPEC NLRI + * passed return_string string has assumed length + * BGP_FLOWSPEC_STRING_DISPLAY_MAX + */  void bgp_fs_nlri_get_string(unsigned char *nlri_content, size_t len,  			    char *return_string, int format,  			    json_object *json_path) @@ -92,6 +104,8 @@ void bgp_fs_nlri_get_string(unsigned char *nlri_content, size_t len,  	char pre_extra[2] = "";  	const struct message *bgp_flowspec_display;  	enum bgp_flowspec_util_nlri_t type_util; +	int len_string = BGP_FLOWSPEC_STRING_DISPLAY_MAX; +	int len_written;  	if (format == NLRI_STRING_FORMAT_LARGE) {  		snprintf(pre_extra, sizeof(pre_extra), "\t"); @@ -121,10 +135,14 @@ void bgp_fs_nlri_get_string(unsigned char *nlri_content, size_t len,  				     local_string);  				break;  			} -			FS_STRING_UPDATE(count, ptr, format); -			ptr += sprintf(ptr, "%s%s %s%s", pre_extra, -				     lookup_msg(bgp_flowspec_display, type, ""), -				     local_string, extra); +			FS_STRING_UPDATE(count, ptr, format, len_string); +			len_written = snprintf(ptr, len_string, "%s%s %s%s", +					pre_extra, +					lookup_msg(bgp_flowspec_display, +						   type, ""), +					local_string, extra); +			len_string -= len_written; +			ptr += len_written;  			break;  		case FLOWSPEC_IP_PROTOCOL:  		case FLOWSPEC_PORT: @@ -144,11 +162,14 @@ void bgp_fs_nlri_get_string(unsigned char *nlri_content, size_t len,  				     local_string);  				break;  			} -			FS_STRING_UPDATE(count, ptr, format); -			ptr += sprintf(ptr, "%s%s %s%s", pre_extra, -				     lookup_msg(bgp_flowspec_display, -						type, ""), +			FS_STRING_UPDATE(count, ptr, format, len_string); +			len_written = snprintf(ptr, len_string, "%s%s %s%s", +					pre_extra, +					lookup_msg(bgp_flowspec_display, +					type, ""),  				     local_string, extra); +			len_string -= len_written; +			ptr += len_written;  			break;  		case FLOWSPEC_TCP_FLAGS:  			ret = bgp_flowspec_tcpflags_decode( @@ -160,14 +181,19 @@ void bgp_fs_nlri_get_string(unsigned char *nlri_content, size_t len,  				break;  			if (json_path) {  				json_object_string_add(json_path, -				     lookup_msg(bgp_flowspec_display, type, ""), +				     lookup_msg(bgp_flowspec_display, +						type, ""),  				     local_string);  				break;  			} -			FS_STRING_UPDATE(count, ptr, format); -			ptr += sprintf(ptr, "%s%s %s%s", pre_extra, -				     lookup_msg(bgp_flowspec_display, type, ""), -				     local_string, extra); +			FS_STRING_UPDATE(count, ptr, format, len_string); +			len_written = snprintf(ptr, len_string, "%s%s %s%s", +					pre_extra, +					lookup_msg(bgp_flowspec_display, +						   type, ""), +					local_string, extra); +			len_string -= len_written; +			ptr += len_written;  			break;  		case FLOWSPEC_PKT_LEN:  		case FLOWSPEC_DSCP: @@ -184,11 +210,14 @@ void bgp_fs_nlri_get_string(unsigned char *nlri_content, size_t len,  				    local_string);  				break;  			} -			FS_STRING_UPDATE(count, ptr, format); -			ptr += sprintf(ptr, "%s%s %s%s", pre_extra, -				     lookup_msg(bgp_flowspec_display, -						type, ""), +			FS_STRING_UPDATE(count, ptr, format, len_string); +			len_written = snprintf(ptr, len_string, "%s%s %s%s", +					pre_extra, +					lookup_msg(bgp_flowspec_display, +					type, ""),  				     local_string, extra); +			len_string -= len_written; +			ptr += len_written;  			break;  		case FLOWSPEC_FRAGMENT:  			ret = bgp_flowspec_fragment_type_decode( @@ -205,11 +234,14 @@ void bgp_fs_nlri_get_string(unsigned char *nlri_content, size_t len,  				    local_string);  				break;  			} -			FS_STRING_UPDATE(count, ptr, format); -			ptr += sprintf(ptr, "%s%s %s%s", pre_extra, -				     lookup_msg(bgp_flowspec_display, -						type, ""), -				     local_string, extra); +			FS_STRING_UPDATE(count, ptr, format, len_string); +			len_written = snprintf(ptr, len_string, "%s%s %s%s", +					pre_extra, +					lookup_msg(bgp_flowspec_display, +					type, ""), +					local_string, extra); +			len_string -= len_written; +			ptr += len_written;  			break;  		default:  			error = -1;  | 
