diff options
| author | Ben Hutchings <ben@decadent.org.uk> | 2011-03-20 02:48:05 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-03-27 20:59:04 -0400 |
| commit | e0bccd315db0c2f919e7fcf9cb60db21d9986f52 (patch) | |
| tree | 8cf512f43221087f964c0f55c7665e293e96921b /include | |
| parent | be20250c13f88375345ad99950190685eda51eb8 (diff) | |
rose: Add length checks to CALL_REQUEST parsing
Define some constant offsets for CALL_REQUEST based on the description
at <http://www.techfest.com/networking/wan/x25plp.htm> and the
definition of ROSE as using 10-digit (5-byte) addresses. Use them
consistently. Validate all implicit and explicit facilities lengths.
Validate the address length byte rather than either trusting or
assuming its value.
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/rose.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/include/net/rose.h b/include/net/rose.h index 5ba9f02731eb..555dd198aab7 100644 --- a/include/net/rose.h +++ b/include/net/rose.h | |||
| @@ -14,6 +14,12 @@ | |||
| 14 | 14 | ||
| 15 | #define ROSE_MIN_LEN 3 | 15 | #define ROSE_MIN_LEN 3 |
| 16 | 16 | ||
| 17 | #define ROSE_CALL_REQ_ADDR_LEN_OFF 3 | ||
| 18 | #define ROSE_CALL_REQ_ADDR_LEN_VAL 0xAA /* each address is 10 digits */ | ||
| 19 | #define ROSE_CALL_REQ_DEST_ADDR_OFF 4 | ||
| 20 | #define ROSE_CALL_REQ_SRC_ADDR_OFF 9 | ||
| 21 | #define ROSE_CALL_REQ_FACILITIES_OFF 14 | ||
| 22 | |||
| 17 | #define ROSE_GFI 0x10 | 23 | #define ROSE_GFI 0x10 |
| 18 | #define ROSE_Q_BIT 0x80 | 24 | #define ROSE_Q_BIT 0x80 |
| 19 | #define ROSE_D_BIT 0x40 | 25 | #define ROSE_D_BIT 0x40 |
| @@ -214,7 +220,7 @@ extern void rose_requeue_frames(struct sock *); | |||
| 214 | extern int rose_validate_nr(struct sock *, unsigned short); | 220 | extern int rose_validate_nr(struct sock *, unsigned short); |
| 215 | extern void rose_write_internal(struct sock *, int); | 221 | extern void rose_write_internal(struct sock *, int); |
| 216 | extern int rose_decode(struct sk_buff *, int *, int *, int *, int *, int *); | 222 | extern int rose_decode(struct sk_buff *, int *, int *, int *, int *, int *); |
| 217 | extern int rose_parse_facilities(unsigned char *, struct rose_facilities_struct *); | 223 | extern int rose_parse_facilities(unsigned char *, unsigned int, struct rose_facilities_struct *); |
| 218 | extern void rose_disconnect(struct sock *, int, int, int); | 224 | extern void rose_disconnect(struct sock *, int, int, int); |
| 219 | 225 | ||
| 220 | /* rose_timer.c */ | 226 | /* rose_timer.c */ |
