From 86433d4fcd24b068f362aecf0b1d1666d32ac6a1 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 24 Oct 2000 12:29:57 +0000 Subject: [PATCH] Fixed bug in proxy where a Yaz_ProxyClient could be owned by two Yaz_Proxy's (fatal). --- src/yaz-pdu-assoc.cpp | 8 ++++++-- src/yaz-proxy.cpp | 41 +++++++++++++++++++++++++++++++---------- src/yaz-socket-manager.cpp | 10 +++++++++- src/yaz-z-server.cpp | 12 ++++++++---- 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/yaz-pdu-assoc.cpp b/src/yaz-pdu-assoc.cpp index 0462f5a..6986733 100644 --- a/src/yaz-pdu-assoc.cpp +++ b/src/yaz-pdu-assoc.cpp @@ -3,7 +3,11 @@ * See the file LICENSE for details. * * $Log: yaz-pdu-assoc.cpp,v $ - * Revision 1.17 2000-10-11 11:58:16 adam + * Revision 1.18 2000-10-24 12:29:57 adam + * Fixed bug in proxy where a Yaz_ProxyClient could be owned by + * two Yaz_Proxy's (fatal). + * + * Revision 1.17 2000/10/11 11:58:16 adam * Moved header files to include/yaz++. Switched to libtool and automake. * Configure script creates yaz++-config script. * @@ -169,7 +173,7 @@ void Yaz_PDU_Assoc::socketNotify(int event) { logf (m_log, "Connection closed by peer"); close(); - m_PDU_Observer->failNotify(); + m_PDU_Observer->failNotify(); // problem here.. return; } // lock it, so we know if recv_PDU deletes it. diff --git a/src/yaz-proxy.cpp b/src/yaz-proxy.cpp index e24fb8c..7df59ee 100644 --- a/src/yaz-proxy.cpp +++ b/src/yaz-proxy.cpp @@ -3,7 +3,11 @@ * See the file LICENSE for details. * * $Log: yaz-proxy.cpp,v $ - * Revision 1.19 2000-10-11 11:58:16 adam + * Revision 1.20 2000-10-24 12:29:57 adam + * Fixed bug in proxy where a Yaz_ProxyClient could be owned by + * two Yaz_Proxy's (fatal). + * + * Revision 1.19 2000/10/11 11:58:16 adam * Moved header files to include/yaz++. Switched to libtool and automake. * Configure script creates yaz++-config script. * @@ -108,7 +112,7 @@ IYaz_PDU_Observer *Yaz_Proxy::clone(IYaz_PDU_Observable { Yaz_Proxy *new_proxy = new Yaz_Proxy(the_PDU_Observable); new_proxy->m_parent = this; - new_proxy->timeout(120); + new_proxy->timeout(500); new_proxy->set_proxyTarget(m_proxyTarget); new_proxy->set_APDU_log(get_APDU_log()); return new_proxy; @@ -167,7 +171,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu) if (!m_proxyTarget) return 0; - if (cookie) + if (cookie && *cookie) { logf (LOG_LOG, "lookup of clients cookie=%s target=%s", cookie, m_proxyTarget); @@ -205,10 +209,15 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu) c->m_last_resultCount = 0; c->m_sr_transform = 0; c->m_waiting = 0; - c->timeout(600); + c->timeout(600); } c->m_seqno = parent->m_seqno; + if (c->m_server && c->m_server != this) + c->m_server->m_client = 0; + c->m_server = this; + c->m_seqno = parent->m_seqno; (parent->m_seqno)++; + yaz_log (LOG_LOG, "get_client 1 %p %p", this, c); return c; } } @@ -241,7 +250,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu) { logf (LOG_LOG, "Yaz_Proxy::get_client re-init session %d", c->m_seqno); - if (c->m_server) + if (c->m_server && c->m_server != this) delete c->m_server; c->m_server = 0; } @@ -254,7 +263,13 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu) else c->m_cookie[0] = '\0'; c->m_seqno = parent->m_seqno; + if (c->m_server && c->m_server != this) + { + c->m_server->m_client = 0; + delete c->m_server; + } (parent->m_seqno)++; + yaz_log (LOG_LOG, "get_client 2 %p %p", this, c); return c; } } @@ -287,6 +302,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu) (parent->m_seqno)++; } + yaz_log (LOG_LOG, "get_client 3 %p %p", this, c); return c; } @@ -406,6 +422,7 @@ void Yaz_Proxy::recv_Z_PDU(Z_APDU *apdu) if (m_client->send_Z_PDU(apdu) < 0) { delete m_client; + m_client = 0; delete this; } else @@ -422,11 +439,16 @@ void Yaz_Proxy::shutdown() // only keep if keep_alive flag and cookie is set... if (m_keepalive && m_client && m_client->m_cookie[0]) { + if (m_client->m_waiting == 2) + abort(); // Tell client (if any) that no server connection is there.. m_client->m_server = 0; } - else + else if (m_client) { + yaz_log (LOG_LOG, "deleting %p %p", this, m_client); + if (m_client->m_waiting == 2) + abort(); delete m_client; } delete this; @@ -465,11 +487,10 @@ IYaz_PDU_Observer *Yaz_ProxyClient::clone(IYaz_PDU_Observable Yaz_ProxyClient::~Yaz_ProxyClient() { if (m_prev) - { *m_prev = m_next; - if (m_next) - m_next->m_prev = m_prev; - } + if (m_next) + m_next->m_prev = m_prev; + m_waiting = 2; // for debugging purposes only. delete m_last_query; } diff --git a/src/yaz-socket-manager.cpp b/src/yaz-socket-manager.cpp index d8e1ef2..376a079 100644 --- a/src/yaz-socket-manager.cpp +++ b/src/yaz-socket-manager.cpp @@ -3,7 +3,11 @@ * See the file LICENSE for details. * * $Log: yaz-socket-manager.cpp,v $ - * Revision 1.11 2000-10-11 11:58:17 adam + * Revision 1.12 2000-10-24 12:29:57 adam + * Fixed bug in proxy where a Yaz_ProxyClient could be owned by + * two Yaz_Proxy's (fatal). + * + * Revision 1.11 2000/10/11 11:58:17 adam * Moved header files to include/yaz++. Switched to libtool and automake. * Configure script creates yaz++-config script. * @@ -235,6 +239,10 @@ int Yaz_SocketManager::processEvent() return 0; } + +// n p n p ...... n p n p +// front back + void Yaz_SocketManager::putEvent(YazSocketEvent *event) { // put in back of queue diff --git a/src/yaz-z-server.cpp b/src/yaz-z-server.cpp index d07bae0..38fedb4 100644 --- a/src/yaz-z-server.cpp +++ b/src/yaz-z-server.cpp @@ -3,7 +3,11 @@ * See the file LICENSE for details. * * $Log: yaz-z-server.cpp,v $ - * Revision 1.4 2000-10-11 11:58:17 adam + * Revision 1.5 2000-10-24 12:29:57 adam + * Fixed bug in proxy where a Yaz_ProxyClient could be owned by + * two Yaz_Proxy's (fatal). + * + * Revision 1.4 2000/10/11 11:58:17 adam * Moved header files to include/yaz++. Switched to libtool and automake. * Configure script creates yaz++-config script. * @@ -279,7 +283,7 @@ void Yaz_Z_Server::recv_Z_PDU (Z_APDU *apdu_request) switch (apdu_request->which) { case Z_APDU_initRequest: - logf (LOG_LOG, "got InitRequest"); + logf (LOG_LOG, "got InitRequest p=%p", this); apdu_response = create_Z_PDU(Z_APDU_initResponse); recv_Z_init (apdu_request->u.initRequest, apdu_response->u.initResponse); @@ -290,7 +294,7 @@ void Yaz_Z_Server::recv_Z_PDU (Z_APDU *apdu_request) send_Z_PDU(apdu_response); break; case Z_APDU_searchRequest: - logf (LOG_LOG, "got SearchRequest"); + logf (LOG_LOG, "got SearchRequest p=%p", this); apdu_response = create_Z_PDU(Z_APDU_searchResponse); recv_Z_search (apdu_request->u.searchRequest, apdu_response->u.searchResponse); @@ -302,7 +306,7 @@ void Yaz_Z_Server::recv_Z_PDU (Z_APDU *apdu_request) send_Z_PDU(apdu_response); break; case Z_APDU_presentRequest: - logf (LOG_LOG, "got PresentRequest"); + logf (LOG_LOG, "got PresentRequest p=%p", this); apdu_response = create_Z_PDU(Z_APDU_presentResponse); recv_Z_present (apdu_request->u.presentRequest, apdu_response->u.presentResponse); -- 1.7.10.4