Commit 9a7c9337 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[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: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a163148c
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
#include <linux/types.h> #include <linux/types.h>
extern __be32 in_aton(const char *str); extern __be32 in_aton(const char *str);
extern int in4_pton(const char *src, int srclen, u8 *dst, char delim, const char **end); extern int in4_pton(const char *src, int srclen, u8 *dst, int delim, const char **end);
extern int in6_pton(const char *src, int srclen, u8 *dst, char delim, const char **end); extern int in6_pton(const char *src, int srclen, u8 *dst, int delim, const char **end);
#endif #endif
#endif /* _LINUX_INET_H */ #endif /* _LINUX_INET_H */
...@@ -88,7 +88,7 @@ EXPORT_SYMBOL(in_aton); ...@@ -88,7 +88,7 @@ EXPORT_SYMBOL(in_aton);
#define IN6PTON_NULL 0x20000000 /* first/tail */ #define IN6PTON_NULL 0x20000000 /* first/tail */
#define IN6PTON_UNKNOWN 0x40000000 #define IN6PTON_UNKNOWN 0x40000000
static inline int digit2bin(char c, char delim) static inline int digit2bin(char c, int delim)
{ {
if (c == delim || c == '\0') if (c == delim || c == '\0')
return IN6PTON_DELIM; return IN6PTON_DELIM;
...@@ -99,7 +99,7 @@ static inline int digit2bin(char c, char delim) ...@@ -99,7 +99,7 @@ static inline int digit2bin(char c, char delim)
return IN6PTON_UNKNOWN; return IN6PTON_UNKNOWN;
} }
static inline int xdigit2bin(char c, char delim) static inline int xdigit2bin(char c, int delim)
{ {
if (c == delim || c == '\0') if (c == delim || c == '\0')
return IN6PTON_DELIM; return IN6PTON_DELIM;
...@@ -113,12 +113,14 @@ static inline int xdigit2bin(char c, char delim) ...@@ -113,12 +113,14 @@ static inline int xdigit2bin(char c, char delim)
return (IN6PTON_XDIGIT | (c - 'a' + 10)); return (IN6PTON_XDIGIT | (c - 'a' + 10));
if (c >= 'A' && c <= 'F') if (c >= 'A' && c <= 'F')
return (IN6PTON_XDIGIT | (c - 'A' + 10)); return (IN6PTON_XDIGIT | (c - 'A' + 10));
if (delim == -1)
return IN6PTON_DELIM;
return IN6PTON_UNKNOWN; return IN6PTON_UNKNOWN;
} }
int in4_pton(const char *src, int srclen, int in4_pton(const char *src, int srclen,
u8 *dst, u8 *dst,
char delim, const char **end) int delim, const char **end)
{ {
const char *s; const char *s;
u8 *d; u8 *d;
...@@ -173,7 +175,7 @@ EXPORT_SYMBOL(in4_pton); ...@@ -173,7 +175,7 @@ EXPORT_SYMBOL(in4_pton);
int in6_pton(const char *src, int srclen, int in6_pton(const char *src, int srclen,
u8 *dst, u8 *dst,
char delim, const char **end) int delim, const char **end)
{ {
const char *s, *tok = NULL; const char *s, *tok = NULL;
u8 *d, *dc = NULL; u8 *d, *dc = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment