version 1.13.2.2, 2000/09/01 18:23:19 |
version 1.13.2.3, 2000/11/08 21:30:38 |
|
|
/* |
/* |
* Copyright (c) 1999 Markus Friedl. All rights reserved. |
* Copyright (c) 1999,2000 Markus Friedl. All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* modification, are permitted provided that the following conditions |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
|
* must display the following acknowledgement: |
|
* This product includes software developed by Markus Friedl. |
|
* 4. The name of the author may not be used to endorse or promote products |
|
* derived from this software without specific prior written permission. |
|
* |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
|
#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}, |
{ "^OpenSSH[-_]2\\.[012]", SSH_OLD_SESSIONID }, |
{"2.0.1", SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD}, |
{ "MindTerm", 0 }, |
{"2.", SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING}, |
{ "^2\\.1\\.0 ", SSH_BUG_SIGBLOB|SSH_BUG_HMAC| |
{NULL, 0} |
SSH_OLD_SESSIONID }, |
|
{ "^2\\.0\\.", SSH_BUG_SIGBLOB|SSH_BUG_HMAC| |
|
SSH_OLD_SESSIONID| |
|
SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD }, |
|
{ "^2\\.[23]\\.0 ", SSH_BUG_HMAC}, |
|
{ "^2\\.[2-9]\\.", 0 }, |
|
{ "^2\\.4$", SSH_OLD_SESSIONID}, /* Van Dyke */ |
|
{ "^3\\.0 SecureCRT", SSH_OLD_SESSIONID}, |
|
{ "^1\\.7 SecureFX", SSH_OLD_SESSIONID}, |
|
{ "^2\\.", SSH_BUG_HMAC}, /* XXX fallback */ |
|
{ 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 "," |