| https://bugzilla.mindrot.org/show_bug.cgi?id=3548 |
| --- a/openbsd-compat/openssl-compat.c |
| +++ b/openbsd-compat/openssl-compat.c |
| @@ -48,19 +48,25 @@ ssh_compatible_openssl(long headerver, long libver) |
| if (headerver == libver) |
| return 1; |
| |
| - /* for versions < 1.0.0, major,minor,fix,status must match */ |
| - if (headerver < 0x1000000f) { |
| - mask = 0xfffff00fL; /* major,minor,fix,status */ |
| - return (headerver & mask) == (libver & mask); |
| + /* |
| + * For versions < 3.0.0, major,minor,status must match and library |
| + * fix version must be equal to or newer than the header. |
| + */ |
| + if (headerver < 0x3000000f) { |
| + mask = 0xfff0000fL; /* major,minor,status */ |
| + hfix = (headerver & 0x000ff000) >> 12; |
| + lfix = (libver & 0x000ff000) >> 12; |
| + if ( (headerver & mask) == (libver & mask) && lfix >= hfix) |
| + return 1; |
| } |
| |
| /* |
| - * For versions >= 1.0.0, major,minor,status must match and library |
| - * fix version must be equal to or newer than the header. |
| + * For versions >= 3.0.0, major must match and minor,status must be |
| + * equal to or greater than the header. |
| */ |
| - mask = 0xfff00000L; /* major,minor,status */ |
| - hfix = (headerver & 0x000ff000) >> 12; |
| - lfix = (libver & 0x000ff000) >> 12; |
| + mask = 0xf000000fL; /* major, status */ |
| + hfix = (headerver & 0x0ffffff0L) >> 12; |
| + lfix = (libver & 0x0ffffff0L) >> 12; |
| if ( (headerver & mask) == (libver & mask) && lfix >= hfix) |
| return 1; |
| return 0; |
| --- a/openbsd-compat/regress/opensslvertest.c |
| +++ b/openbsd-compat/regress/opensslvertest.c |
| @@ -31,7 +31,7 @@ struct version_test { |
| { 0x0090802fL, 0x0090804fL, 1}, /* newer library fix version: ok */ |
| { 0x0090802fL, 0x0090801fL, 1}, /* older library fix version: ok */ |
| { 0x0090802fL, 0x0090702fL, 0}, /* older library minor version: NO */ |
| - { 0x0090802fL, 0x0090902fL, 0}, /* newer library minor version: NO */ |
| + { 0x0090802fL, 0x0090902fL, 1}, /* newer library minor version: ok */ |
| { 0x0090802fL, 0x0080802fL, 0}, /* older library major version: NO */ |
| { 0x0090802fL, 0x1000100fL, 0}, /* newer library major version: NO */ |
| |
| @@ -41,7 +41,7 @@ struct version_test { |
| { 0x1000101fL, 0x1000100fL, 1}, /* older library patch version: ok */ |
| { 0x1000101fL, 0x1000201fL, 1}, /* newer library fix version: ok */ |
| { 0x1000101fL, 0x1000001fL, 0}, /* older library fix version: NO */ |
| - { 0x1000101fL, 0x1010101fL, 0}, /* newer library minor version: NO */ |
| + { 0x1000101fL, 0x1010101fL, 1}, /* newer library minor version: ok */ |
| { 0x1000101fL, 0x0000101fL, 0}, /* older library major version: NO */ |
| { 0x1000101fL, 0x2000101fL, 0}, /* newer library major version: NO */ |
| }; |