diff options
Diffstat (limited to 'compat.c')
-rw-r--r-- | compat.c | 41 |
1 files changed, 27 insertions, 14 deletions
@@ -23,12 +23,13 @@ | |||
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include "includes.h" | 25 | #include "includes.h" |
26 | RCSID("$OpenBSD: compat.c,v 1.23 2000/09/07 21:13:37 markus Exp $"); | 26 | RCSID("$OpenBSD: compat.c,v 1.24 2000/10/10 20:20:45 markus Exp $"); |
27 | 27 | ||
28 | #include "ssh.h" | 28 | #include "ssh.h" |
29 | #include "packet.h" | 29 | #include "packet.h" |
30 | #include "xmalloc.h" | 30 | #include "xmalloc.h" |
31 | #include "compat.h" | 31 | #include "compat.h" |
32 | #include <regex.h> | ||
32 | 33 | ||
33 | int compat13 = 0; | 34 | int compat13 = 0; |
34 | int compat20 = 0; | 35 | int compat20 = 0; |
@@ -50,27 +51,39 @@ enable_compat13(void) | |||
50 | void | 51 | void |
51 | compat_datafellows(const char *version) | 52 | compat_datafellows(const char *version) |
52 | { | 53 | { |
53 | int i; | 54 | int i, ret; |
54 | size_t len; | 55 | char ebuf[1024]; |
55 | struct { | 56 | regex_t reg; |
56 | char *version; | 57 | static struct { |
58 | char *pat; | ||
57 | int bugs; | 59 | int bugs; |
58 | } check[] = { | 60 | } check[] = { |
59 | {"2.1.0", SSH_BUG_SIGBLOB|SSH_BUG_HMAC}, | 61 | {"^.*MindTerm", 0}, |
60 | {"2.0.1", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD}, | 62 | {"^2\\.1\\.0 ", SSH_BUG_SIGBLOB|SSH_BUG_HMAC}, |
61 | {"2.", SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING}, | 63 | {"^2\\.0\\.", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD}, |
62 | {NULL, 0} | 64 | {"^2\\.[23]\\.0 ", SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING}, |
65 | {"^2\\.[2-9]\\.", SSH_COMPAT_SESSIONID_ENCODING}, | ||
66 | {"^2\\.", SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING}, | ||
67 | {NULL, 0} | ||
63 | }; | 68 | }; |
64 | /* process table, return first match */ | 69 | /* process table, return first match */ |
65 | for (i = 0; check[i].version; i++) { | 70 | for (i = 0; check[i].pat; i++) { |
66 | len = strlen(check[i].version); | 71 | ret = regcomp(®, check[i].pat, REG_EXTENDED|REG_NOSUB); |
67 | if (strlen(version) >= len && | 72 | if (ret != 0) { |
68 | (strncmp(version, check[i].version, len) == 0)) { | 73 | regerror(ret, ®, ebuf, sizeof(ebuf)); |
69 | verbose("datafellows: %.200s", version); | 74 | ebuf[sizeof(ebuf)-1] = '\0'; |
75 | error("regerror: %s", ebuf); | ||
76 | continue; | ||
77 | } | ||
78 | ret = regexec(®, version, 0, NULL, 0); | ||
79 | regfree(®); | ||
80 | if (ret == 0) { | ||
81 | debug("match: %s pat %s\n", version, check[i].pat); | ||
70 | datafellows = check[i].bugs; | 82 | datafellows = check[i].bugs; |
71 | return; | 83 | return; |
72 | } | 84 | } |
73 | } | 85 | } |
86 | debug("no match: %s", version); | ||
74 | } | 87 | } |
75 | 88 | ||
76 | #define SEP "," | 89 | #define SEP "," |