version 1.13, 2000/05/08 17:42:24 |
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 "includes.h" |
#include "includes.h" |
RCSID("$Id$"); |
RCSID("$OpenBSD$"); |
|
|
#include "ssh.h" |
#include "ssh.h" |
#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 }, |
{NULL, 0} |
{ "^2\\.1\\.0 ", SSH_BUG_SIGBLOB|SSH_BUG_HMAC| |
|
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 } |
}; |
}; |
for (i = 0; check[i].version; i++) { |
/* process table, return first match */ |
len = strlen(check[i].version); |
for (i = 0; check[i].pat; i++) { |
if (strlen(version) >= len && |
ret = regcomp(®, check[i].pat, REG_EXTENDED|REG_NOSUB); |
(strncmp(version, check[i].version, len) == 0)) { |
if (ret != 0) { |
verbose("datafellows: %.200s", version); |
regerror(ret, ®, ebuf, sizeof(ebuf)); |
|
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 "," |
int |
int |
proto_spec(const char *spec) |
proto_spec(const char *spec) |
{ |
{ |
char *s = xstrdup(spec); |
char *s, *p, *q; |
char *p; |
|
int ret = SSH_PROTO_UNKNOWN; |
int ret = SSH_PROTO_UNKNOWN; |
|
|
for ((p = strtok(s, SEP)); p; (p = strtok(NULL, SEP))) { |
if (spec == NULL) |
|
return ret; |
|
q = s = xstrdup(spec); |
|
for ((p = strsep(&q, SEP)); p && *p != '\0'; (p = strsep(&q, SEP))) { |
switch(atoi(p)) { |
switch(atoi(p)) { |
case 1: |
case 1: |
if (ret == SSH_PROTO_UNKNOWN) |
if (ret == SSH_PROTO_UNKNOWN) |