diff options
author | Patrick McHardy <kaber@trash.net> | 2006-12-03 01:04:04 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-12-03 01:04:04 -0500 |
commit | 9a7c9337a09b1ef07e55f95a4309957a2328a01f (patch) | |
tree | 9d382a443d82ece7246fe83d297865b66ace713f /net/core/utils.c | |
parent | a163148c1bec895c1332ea5be497bcda8ce110df (diff) |
[NET]: Accept wildcard delimiters in in[46]_pton
Accept -1 as delimiter to abort parsing without an error at the first
unknown character. This is needed by the upcoming nf_conntrack SIP
helper, where addresses are delimited by either '\r' or '\n' characters.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/utils.c')
-rw-r--r-- | net/core/utils.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/core/utils.c b/net/core/utils.c index d93fe64f6693..61556065f07e 100644 --- a/net/core/utils.c +++ b/net/core/utils.c | |||
@@ -88,7 +88,7 @@ EXPORT_SYMBOL(in_aton); | |||
88 | #define IN6PTON_NULL 0x20000000 /* first/tail */ | 88 | #define IN6PTON_NULL 0x20000000 /* first/tail */ |
89 | #define IN6PTON_UNKNOWN 0x40000000 | 89 | #define IN6PTON_UNKNOWN 0x40000000 |
90 | 90 | ||
91 | static inline int digit2bin(char c, char delim) | 91 | static inline int digit2bin(char c, int delim) |
92 | { | 92 | { |
93 | if (c == delim || c == '\0') | 93 | if (c == delim || c == '\0') |
94 | return IN6PTON_DELIM; | 94 | return IN6PTON_DELIM; |
@@ -99,7 +99,7 @@ static inline int digit2bin(char c, char delim) | |||
99 | return IN6PTON_UNKNOWN; | 99 | return IN6PTON_UNKNOWN; |
100 | } | 100 | } |
101 | 101 | ||
102 | static inline int xdigit2bin(char c, char delim) | 102 | static inline int xdigit2bin(char c, int delim) |
103 | { | 103 | { |
104 | if (c == delim || c == '\0') | 104 | if (c == delim || c == '\0') |
105 | return IN6PTON_DELIM; | 105 | return IN6PTON_DELIM; |
@@ -113,12 +113,14 @@ static inline int xdigit2bin(char c, char delim) | |||
113 | return (IN6PTON_XDIGIT | (c - 'a' + 10)); | 113 | return (IN6PTON_XDIGIT | (c - 'a' + 10)); |
114 | if (c >= 'A' && c <= 'F') | 114 | if (c >= 'A' && c <= 'F') |
115 | return (IN6PTON_XDIGIT | (c - 'A' + 10)); | 115 | return (IN6PTON_XDIGIT | (c - 'A' + 10)); |
116 | if (delim == -1) | ||
117 | return IN6PTON_DELIM; | ||
116 | return IN6PTON_UNKNOWN; | 118 | return IN6PTON_UNKNOWN; |
117 | } | 119 | } |
118 | 120 | ||
119 | int in4_pton(const char *src, int srclen, | 121 | int in4_pton(const char *src, int srclen, |
120 | u8 *dst, | 122 | u8 *dst, |
121 | char delim, const char **end) | 123 | int delim, const char **end) |
122 | { | 124 | { |
123 | const char *s; | 125 | const char *s; |
124 | u8 *d; | 126 | u8 *d; |
@@ -173,7 +175,7 @@ EXPORT_SYMBOL(in4_pton); | |||
173 | 175 | ||
174 | int in6_pton(const char *src, int srclen, | 176 | int in6_pton(const char *src, int srclen, |
175 | u8 *dst, | 177 | u8 *dst, |
176 | char delim, const char **end) | 178 | int delim, const char **end) |
177 | { | 179 | { |
178 | const char *s, *tok = NULL; | 180 | const char *s, *tok = NULL; |
179 | u8 *d, *dc = NULL; | 181 | u8 *d, *dc = NULL; |