[SVN] r449 - /branches/cvsmerge/cyrus-cvs/imap/backend.c
debian at incase.de
debian at incase.de
Fri May 12 09:46:07 UTC 2006
Author: sven
Date: Fri May 12 11:46:05 2006
New Revision: 449
URL: https://mail.incase.de/viewcvs?rev=449&root=cyrus22&view=rev
Log:
only free() the backend struct if we allocated it (don't free cached connections)
Modified:
branches/cvsmerge/cyrus-cvs/imap/backend.c
Modified: branches/cvsmerge/cyrus-cvs/imap/backend.c
URL: https://mail.incase.de/viewcvs/branches/cvsmerge/cyrus-cvs/imap/backend.c?rev=449&root=cyrus22&r1=448&r2=449&view=diff
==============================================================================
--- branches/cvsmerge/cyrus-cvs/imap/backend.c (original)
+++ branches/cvsmerge/cyrus-cvs/imap/backend.c Fri May 12 11:46:05 2006
@@ -39,7 +39,7 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: backend.c,v 1.40 2006/04/03 16:34:36 murch Exp $ */
+/* $Id: backend.c,v 1.41 2006/05/11 18:05:29 murch Exp $ */
#include <config.h>
@@ -264,7 +264,7 @@
}
}
-struct backend *backend_connect(struct backend *ret, const char *server,
+struct backend *backend_connect(struct backend *ret_backend, const char *server,
struct protocol_t *prot, const char *userid,
const char **auth_status)
{
@@ -276,13 +276,16 @@
struct sockaddr_un sunsock;
char buf[2048], *mechlist = NULL;
struct sigaction action;
-
- if (!ret) {
+ struct backend *ret;
+
+ if (!ret_backend) {
ret = xmalloc(sizeof(struct backend));
memset(ret, 0, sizeof(struct backend));
strlcpy(ret->hostname, server, sizeof(ret->hostname));
ret->timeout = NULL;
}
+ else
+ ret = ret_backend;
if (server[0] == '/') { /* unix socket */
res0 = &hints;
@@ -312,7 +315,7 @@
if (err) {
syslog(LOG_ERR, "getaddrinfo(%s) failed: %s",
server, gai_strerror(err));
- free(ret);
+ if (!ret_backend) free(ret);
return NULL;
}
/* Get addrinfo struct for local interface. */
@@ -363,7 +366,7 @@
if (res0 != &hints)
freeaddrinfo(res0);
syslog(LOG_ERR, "connect(%s) failed: %m", server);
- free(ret);
+ if (!ret_backend) free(ret);
return NULL;
}
memcpy(&ret->addr, res->ai_addr, res->ai_addrlen);
@@ -381,7 +384,7 @@
syslog(LOG_ERR,
"backend_connect(): couldn't read initial greeting: %s",
ret->in->error ? ret->in->error : "(null)");
- free(ret);
+ if (!ret_backend) free(ret);
close(sock);
return NULL;
}
@@ -396,14 +399,16 @@
if ((r = backend_authenticate(ret, prot, &mechlist, userid, auth_status))) {
syslog(LOG_ERR, "couldn't authenticate to backend server: %s",
sasl_errstring(r, NULL, NULL));
- free(ret);
+ if (!ret_backend) free(ret);
close(sock);
ret = NULL;
}
}
if (mechlist) free(mechlist);
-
+
+ if (!ret_backend) ret_backend = ret;
+
return ret;
}
More information about the Pkg-Cyrus-imapd-Debian-devel
mailing list