diff options
Diffstat (limited to 'net/sctp/sm_make_chunk.c')
| -rw-r--r-- | net/sctp/sm_make_chunk.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index b599cbba4fbe..d68869f966c3 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
| @@ -1012,6 +1012,29 @@ end: | |||
| 1012 | return retval; | 1012 | return retval; |
| 1013 | } | 1013 | } |
| 1014 | 1014 | ||
| 1015 | struct sctp_chunk *sctp_make_violation_paramlen( | ||
| 1016 | const struct sctp_association *asoc, | ||
| 1017 | const struct sctp_chunk *chunk, | ||
| 1018 | struct sctp_paramhdr *param) | ||
| 1019 | { | ||
| 1020 | struct sctp_chunk *retval; | ||
| 1021 | static const char error[] = "The following parameter had invalid length:"; | ||
| 1022 | size_t payload_len = sizeof(error) + sizeof(sctp_errhdr_t) + | ||
| 1023 | sizeof(sctp_paramhdr_t); | ||
| 1024 | |||
| 1025 | retval = sctp_make_abort(asoc, chunk, payload_len); | ||
| 1026 | if (!retval) | ||
| 1027 | goto nodata; | ||
| 1028 | |||
| 1029 | sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, | ||
| 1030 | sizeof(error) + sizeof(sctp_paramhdr_t)); | ||
| 1031 | sctp_addto_chunk(retval, sizeof(error), error); | ||
| 1032 | sctp_addto_param(retval, sizeof(sctp_paramhdr_t), param); | ||
| 1033 | |||
| 1034 | nodata: | ||
| 1035 | return retval; | ||
| 1036 | } | ||
| 1037 | |||
| 1015 | /* Make a HEARTBEAT chunk. */ | 1038 | /* Make a HEARTBEAT chunk. */ |
| 1016 | struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc, | 1039 | struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc, |
| 1017 | const struct sctp_transport *transport, | 1040 | const struct sctp_transport *transport, |
| @@ -1782,11 +1805,6 @@ static int sctp_process_inv_paramlength(const struct sctp_association *asoc, | |||
| 1782 | const struct sctp_chunk *chunk, | 1805 | const struct sctp_chunk *chunk, |
| 1783 | struct sctp_chunk **errp) | 1806 | struct sctp_chunk **errp) |
| 1784 | { | 1807 | { |
| 1785 | static const char error[] = "The following parameter had invalid length:"; | ||
| 1786 | size_t payload_len = WORD_ROUND(sizeof(error)) + | ||
| 1787 | sizeof(sctp_paramhdr_t); | ||
| 1788 | |||
| 1789 | |||
| 1790 | /* This is a fatal error. Any accumulated non-fatal errors are | 1808 | /* This is a fatal error. Any accumulated non-fatal errors are |
| 1791 | * not reported. | 1809 | * not reported. |
| 1792 | */ | 1810 | */ |
| @@ -1794,14 +1812,7 @@ static int sctp_process_inv_paramlength(const struct sctp_association *asoc, | |||
| 1794 | sctp_chunk_free(*errp); | 1812 | sctp_chunk_free(*errp); |
| 1795 | 1813 | ||
| 1796 | /* Create an error chunk and fill it in with our payload. */ | 1814 | /* Create an error chunk and fill it in with our payload. */ |
| 1797 | *errp = sctp_make_op_error_space(asoc, chunk, payload_len); | 1815 | *errp = sctp_make_violation_paramlen(asoc, chunk, param); |
| 1798 | |||
| 1799 | if (*errp) { | ||
| 1800 | sctp_init_cause(*errp, SCTP_ERROR_PROTO_VIOLATION, | ||
| 1801 | sizeof(error) + sizeof(sctp_paramhdr_t)); | ||
| 1802 | sctp_addto_chunk(*errp, sizeof(error), error); | ||
| 1803 | sctp_addto_param(*errp, sizeof(sctp_paramhdr_t), param); | ||
| 1804 | } | ||
| 1805 | 1816 | ||
| 1806 | return 0; | 1817 | return 0; |
| 1807 | } | 1818 | } |
