8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 16:43:03 +01:00

Load zlib dynamically to make it possible for the client to run without it

Added configure switch to turn off build with compression
Cleanup zlib streams to avoid memory leak
Use SHRLIB_EXT instead explicit "so"
This commit is contained in:
alexpeshkoff 2014-11-26 17:43:45 +00:00
parent 647971f162
commit 6cb0fdb082
5 changed files with 121 additions and 52 deletions

View File

@ -485,6 +485,7 @@ AC_SUBST(MAKEFILE_PREFIX)
AC_SUBST(AR_OPTIONS)
AC_SUBST(PLATFORM)
AC_SUBST(SHRLIB_EXT)
AC_DEFINE_UNQUOTED(SHRLIB_EXT, "$SHRLIB_EXT", [Extension for shared libraries])
AC_DEFINE(CASE_SENSITIVITY, true, [Define this if paths are case sensitive])
@ -653,6 +654,15 @@ AC_ARG_WITH(gpre-pascal,
esac])
AC_SUBST(GPRE_LANGUAGE_MODULES)
dnl Compression switch
COMPRESSION=Y
AC_ARG_WITH(wire-compress,
[ --with-wire-compress support compression of data, tarnsfered over the wire (default=yes)],
[case "$withval" in
yes) ;;
no) COMPRESSION=N;;
*) AC_MSG_ERROR(bad value '${withval}' for --with-wire-compress);;
esac])
dnl Checks for programs.
@ -723,7 +733,11 @@ AC_CHECK_HEADERS(langinfo.h)
AC_CHECK_HEADERS(iconv.h)
AC_CHECK_HEADERS(libio.h)
AC_CHECK_HEADERS(linux/falloc.h)
AC_CHECK_HEADERS(zlib.h)
dnl check for compression
if test "$COMPRESSION" = "Y"; then
AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR(zlib header not found - please install development zlib package))
fi
dnl check for ICU presence
AC_CHECK_HEADER(unicode/ucnv.h,,AC_MSG_ERROR(ICU support not found - please install development ICU package))
@ -740,7 +754,6 @@ AC_SUBST(MATHLIB)
dnl Check for libraries
AC_SEARCH_LIBS(dlopen, dl)
AC_CHECK_LIB(z, deflate)
AC_CHECK_LIB(m, main)
if test "$EDITLINE_FLG" = "Y"; then
AC_CHECK_LIB(curses, tgetent, TERMLIB=curses, \

View File

@ -67,10 +67,10 @@ void ModuleLoader::doctorModuleExtension(Firebird::PathName& name)
if (name.isEmpty())
return;
Firebird::PathName::size_type pos = name.rfind(".so");
Firebird::PathName::size_type pos = name.rfind("." SHRLIB_EXT);
if (pos != name.length() - 3)
{
name += ".so";
name += "." SHRLIB_EXT;
}
pos = name.rfind('/');
pos = (pos == Firebird::PathName::npos) ? 0 : pos + 1;

View File

@ -109,19 +109,15 @@ namespace {
// always try to use module "as is"
{MOD_SUFFIX, "", false},
#ifdef HPUX
{MOD_SUFFIX, ".sl", true},
#endif
#ifdef DYNAMIC_SHARED_LIBRARIES
{MOD_SUFFIX, ".so", true},
{MOD_SUFFIX, "." SHRLIB_EXT, true},
{MOD_PREFIX, "lib", true},
#endif
/*
#ifdef DARWIN
{MOD_SUFFIX, ".dylib", true},
#endif
*/
};
// UDF/BLOB filter verifier

View File

@ -36,6 +36,7 @@
#include "../common/classes/init.h"
#include "../common/db_alias.h"
#include "firebird/Interface.h"
#include "../common/os/mod_loader.h"
#ifdef DEV_BUILD
Firebird::AtomicCounter rem_port::portCounter;
@ -820,37 +821,6 @@ ServerCallbackBase::~ServerCallbackBase()
{
}
rem_port::~rem_port()
{
if (port_events_shutdown)
{
port_events_shutdown(this);
}
delete port_srv_auth;
delete port_srv_auth_block;
delete port_version;
delete port_connection;
delete port_host;
delete port_server_crypt_callback;
#ifdef DEBUG_XDR_MEMORY
delete port_packet_vector;
#endif
while (port_crypt_keys.hasData())
{
delete port_crypt_keys.pop();
}
if (port_crypt_plugin)
Firebird::PluginManagerInterfacePtr()->releasePlugin(port_crypt_plugin);
#ifdef DEV_BUILD
--portCounter;
#endif
}
/*
void Rdb::set_async_vector(ISC_STATUS* userStatus) throw()
{
@ -1391,6 +1361,88 @@ void SrvAuthBlock::putKey(Firebird::IStatus* status, Firebird::FbCryptKey* crypt
}
namespace {
class ZLib
{
public:
ZLib(Firebird::MemoryPool&)
{
const char* name = "libz." SHRLIB_EXT ".1";
z.reset(ModuleLoader::fixAndLoadModule(name));
if (z)
symbols();
if (!z)
(Firebird::Arg::Gds(isc_random) << "Error loading zlib").raise();
}
int ZEXPORT (*deflateInit_)(z_stream* strm, int level, const char *version, int stream_size);
int ZEXPORT (*inflateInit_)(z_stream* strm, const char *version, int stream_size);
int ZEXPORT (*deflate)(z_stream* strm, int flush);
int ZEXPORT (*inflate)(z_stream* strm, int flush);
void ZEXPORT (*deflateEnd)(z_stream* strm);
void ZEXPORT (*inflateEnd)(z_stream* strm);
operator bool() {return z.hasData();}
bool operator!() {return !z.hasData();}
private:
Firebird::AutoPtr<ModuleLoader::Module> z;
void symbols()
{
#define FB_ZSYMB(A) z->findSymbol(STRINGIZE(A), A); if (!A) {z.reset(NULL); return;}
FB_ZSYMB(deflateInit_)
FB_ZSYMB(inflateInit_)
FB_ZSYMB(deflate)
FB_ZSYMB(inflate)
FB_ZSYMB(deflateEnd)
FB_ZSYMB(inflateEnd)
#undef FB_ZSYMB
}
};
Firebird::InitInstance<ZLib> zlib;
}
rem_port::~rem_port()
{
if (port_events_shutdown)
{
port_events_shutdown(this);
}
delete port_srv_auth;
delete port_srv_auth_block;
delete port_version;
delete port_connection;
delete port_host;
delete port_server_crypt_callback;
#ifdef DEBUG_XDR_MEMORY
delete port_packet_vector;
#endif
while (port_crypt_keys.hasData())
{
delete port_crypt_keys.pop();
}
if (port_crypt_plugin)
Firebird::PluginManagerInterfacePtr()->releasePlugin(port_crypt_plugin);
#ifdef DEV_BUILD
--portCounter;
#endif
#ifdef WIRE_COMPRESS_SUPPORT
if (port_compressed)
{
zlib().deflateEnd(&port_send_stream);
zlib().inflateEnd(&port_recv_stream);
}
#endif
}
bool REMOTE_inflate(rem_port* port, PacketReceive* packet_receive, UCHAR* buffer, SSHORT buffer_length, SSHORT* length)
{
#ifdef WIRE_COMPRESS_SUPPORT
@ -1413,12 +1465,11 @@ bool REMOTE_inflate(rem_port* port, PacketReceive* packet_receive, UCHAR* buffer
#endif
#endif
if (inflate(&strm, Z_NO_FLUSH) != Z_OK)
if (zlib().inflate(&strm, Z_NO_FLUSH) != Z_OK)
{
#ifdef COMPRESS_DEBUG
fprintf(stderr, "Inflate error\n");
#endif
(void)inflateEnd(&strm);
port->port_flags &= ~PORT_z_data;
return false;
}
@ -1450,7 +1501,6 @@ bool REMOTE_inflate(rem_port* port, PacketReceive* packet_receive, UCHAR* buffer
SSHORT l = (SSHORT) (port->port_buff_size - strm.avail_in);
if ((!packet_receive(port, strm.next_in, l, &l)) || (l <= 0)) // fixit - 2 ways to report errors in same routine
{
(void)inflateEnd(&strm);
port->port_flags &= ~PORT_z_data;
return false;
}
@ -1470,7 +1520,6 @@ bool REMOTE_inflate(rem_port* port, PacketReceive* packet_receive, UCHAR* buffer
#endif
}
bool REMOTE_deflate(XDR* xdrs, ProtoWrite* proto_write, PacketSend* packet_send, bool flash)
{
#ifdef WIRE_COMPRESS_SUPPORT
@ -1499,7 +1548,7 @@ bool REMOTE_deflate(XDR* xdrs, ProtoWrite* proto_write, PacketSend* packet_send,
fprintf(stderr, "\n");
#endif
#endif
int ret = deflate(&strm, flash ? Z_SYNC_FLUSH : Z_NO_FLUSH);
int ret = zlib().deflate(&strm, flash ? Z_SYNC_FLUSH : Z_NO_FLUSH);
if (ret == Z_BUF_ERROR)
ret = 0;
if (ret != 0)
@ -1542,7 +1591,6 @@ bool REMOTE_deflate(XDR* xdrs, ProtoWrite* proto_write, PacketSend* packet_send,
#endif
}
void rem_port::initCompression()
{
#ifdef WIRE_COMPRESS_SUPPORT
@ -1551,7 +1599,7 @@ void rem_port::initCompression()
port_send_stream.zalloc = Z_NULL;
port_send_stream.zfree = Z_NULL;
port_send_stream.opaque = Z_NULL;
int ret = deflateInit(&port_send_stream, Z_DEFAULT_COMPRESSION);
int ret = zlib().deflateInit(&port_send_stream, Z_DEFAULT_COMPRESSION);
if (ret != Z_OK)
(Firebird::Arg::Gds(isc_random) << "compression stream init error").raise(); // add error code
port_send_stream.next_out = NULL;
@ -1561,13 +1609,25 @@ void rem_port::initCompression()
port_recv_stream.opaque = Z_NULL;
port_recv_stream.avail_in = 0;
port_recv_stream.next_in = Z_NULL;
ret = inflateInit(&port_recv_stream);
ret = zlib().inflateInit(&port_recv_stream);
if (ret != Z_OK)
{
zlib().deflateEnd(&port_send_stream);
(Firebird::Arg::Gds(isc_random) << "decompression stream init error").raise(); // add error code
}
port_compressed.reset(FB_NEW(getPool()) UCHAR[port_buff_size * 2]);
try
{
port_compressed.reset(FB_NEW(getPool()) UCHAR[port_buff_size * 2]);
}
catch(const Firebird::Exception&)
{
zlib().deflateEnd(&port_send_stream);
zlib().inflateEnd(&port_recv_stream);
}
memset(port_compressed, 0, port_buff_size * 2);
port_recv_stream.next_in = &port_compressed[REM_RECV_OFFSET(port_buff_size)];
#ifdef COMPRESS_DEBUG
fprintf(stderr, "Completed init port %p\n", this);
#endif

View File

@ -55,7 +55,7 @@
#endif
#endif // !WIN_NT
#if defined(HAVE_ZLIB_H) && defined(HAVE_LIBZ)
#if defined(HAVE_ZLIB_H)
#define WIRE_COMPRESS_SUPPORT 1
#endif