version 1.23, 2000/09/07 21:13:37 |
version 1.24, 2000/10/10 20:20:45 |
|
|
#include "packet.h" |
#include "packet.h" |
#include "xmalloc.h" |
#include "xmalloc.h" |
#include "compat.h" |
#include "compat.h" |
|
#include <regex.h> |
|
|
int compat13 = 0; |
int compat13 = 0; |
int compat20 = 0; |
int compat20 = 0; |
|
|
void |
void |
compat_datafellows(const char *version) |
compat_datafellows(const char *version) |
{ |
{ |
int i; |
int i, ret; |
size_t len; |
char ebuf[1024]; |
struct { |
regex_t reg; |
char *version; |
static struct { |
|
char *pat; |
int bugs; |
int bugs; |
} check[] = { |
} check[] = { |
{"2.1.0", SSH_BUG_SIGBLOB|SSH_BUG_HMAC}, |
{"^.*MindTerm", 0}, |
{"2.0.1", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD}, |
{"^2\\.1\\.0 ", SSH_BUG_SIGBLOB|SSH_BUG_HMAC}, |
{"2.", SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING}, |
{"^2\\.0\\.", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD}, |
{NULL, 0} |
{"^2\\.[23]\\.0 ", SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING}, |
|
{"^2\\.[2-9]\\.", SSH_COMPAT_SESSIONID_ENCODING}, |
|
{"^2\\.", SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING}, |
|
{NULL, 0} |
}; |
}; |
/* process table, return first match */ |
/* process table, return first match */ |
for (i = 0; check[i].version; i++) { |
for (i = 0; check[i].pat; i++) { |
len = strlen(check[i].version); |
ret = regcomp(®, check[i].pat, REG_EXTENDED|REG_NOSUB); |
if (strlen(version) >= len && |
if (ret != 0) { |
(strncmp(version, check[i].version, len) == 0)) { |
regerror(ret, ®, ebuf, sizeof(ebuf)); |
verbose("datafellows: %.200s", version); |
ebuf[sizeof(ebuf)-1] = '\0'; |
|
error("regerror: %s", ebuf); |
|
continue; |
|
} |
|
ret = regexec(®, version, 0, NULL, 0); |
|
regfree(®); |
|
if (ret == 0) { |
|
debug("match: %s pat %s\n", version, check[i].pat); |
datafellows = check[i].bugs; |
datafellows = check[i].bugs; |
return; |
return; |
} |
} |
} |
} |
|
debug("no match: %s", version); |
} |
} |
|
|
#define SEP "," |
#define SEP "," |