commit cfdc80c38ee94035813587922adef2cca865ed59
Author: Oswald Buddenhagen <o...@kde.org>
Date:   Sun Mar 13 14:12:54 2011 +0100

    make socket_write() capable of taking ownership of the buffer
    
    that way the user code doesn't have to free it any more.

 src/drv_imap.c |   30 +++++++++++++-----------------
 src/isync.h    |    3 ++-
 src/socket.c   |    4 +++-
 3 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/src/drv_imap.c b/src/drv_imap.c
index 8ec653f..3954118 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -244,14 +244,14 @@ v_submit_imap_cmd( imap_store_t *ctx, struct imap_cmd 
*cmd,
                else
                        printf( ">>> %d LOGIN <user> <pass>\n", cmd->tag );
        }
-       if (socket_write( &ctx->conn, buf, bufl ) < 0)
+       if (socket_write( &ctx->conn, buf, bufl, KeepOwn ) < 0)
                goto bail;
        if (litplus) {
-               if (socket_write( &ctx->conn, cmd->param.data, 
cmd->param.data_len ) < 0 ||
-                   socket_write( &ctx->conn, "\r\n", 2 ) < 0)
-                       goto bail;
-               free( cmd->param.data );
+               char *p = cmd->param.data;
                cmd->param.data = 0;
+               if (socket_write( &ctx->conn, p, cmd->param.data_len, GiveOwn ) 
< 0 ||
+                   socket_write( &ctx->conn, "\r\n", 2, KeepOwn ) < 0)
+                       goto bail;
        } else if (cmd->param.cont || cmd->param.data) {
                ctx->literal_pending = 1;
        }
@@ -777,7 +777,7 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
 {
        struct imap_cmd *cmdp, **pcmdp;
        char *cmd, *arg, *arg1, *p;
-       int n, resp, resp2, tag, greeted;
+       int resp, resp2, tag, greeted;
 
        greeted = ctx->greeting;
        for (;;) {
@@ -839,10 +839,9 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
                        if (cmdp->param.data) {
                                if (cmdp->param.to_trash)
                                        ctx->trashnc = 0; /* Can't get NO 
[TRYCREATE] any more. */
-                               n = socket_write( &ctx->conn, cmdp->param.data, 
cmdp->param.data_len );
-                               free( cmdp->param.data );
+                               p = cmdp->param.data;
                                cmdp->param.data = 0;
-                               if (n < 0)
+                               if (socket_write( &ctx->conn, p, 
cmdp->param.data_len, GiveOwn ) < 0)
                                        break;
                        } else if (cmdp->param.cont) {
                                if (cmdp->param.cont( ctx, cmdp, cmd ))
@@ -851,7 +850,7 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd )
                                error( "IMAP error: unexpected command 
continuation request\n" );
                                break;
                        }
-                       if (socket_write( &ctx->conn, "\r\n", 2 ) < 0)
+                       if (socket_write( &ctx->conn, "\r\n", 2, KeepOwn ) < 0)
                                break;
                        if (!cmdp->param.cont)
                                ctx->literal_pending = 0;
@@ -1039,18 +1038,15 @@ do_cram_auth( imap_store_t *ctx, struct imap_cmd *cmdp, 
const char *prompt )
 {
        imap_server_conf_t *srvc = ((imap_store_conf_t *)ctx->gen.conf)->server;
        char *resp;
-       int n, l;
+       int l;
+
+       cmdp->param.cont = 0;
 
        cram( prompt, srvc->user, srvc->pass, &resp, &l );
 
        if (DFlags & VERBOSE)
                printf( ">+> %s\n", resp );
-       n = socket_write( &ctx->conn, resp, l );
-       free( resp );
-       if (n != l)
-               return -1;
-       cmdp->param.cont = 0;
-       return 0;
+       return socket_write( &ctx->conn, resp, l, GiveOwn );
 }
 #endif
 
diff --git a/src/isync.h b/src/isync.h
index 83feb65..c074f56 100644
--- a/src/isync.h
+++ b/src/isync.h
@@ -333,7 +333,8 @@ int socket_connect( const server_conf_t *conf, conn_t *sock 
);
 int socket_start_tls( const server_conf_t *conf, conn_t *sock );
 void socket_close( conn_t *sock );
 int socket_read( conn_t *sock, char *buf, int len );
-int socket_write( conn_t *sock, char *buf, int len );
+typedef enum { KeepOwn = 0, GiveOwn } ownership_t;
+int socket_write( conn_t *sock, char *buf, int len, ownership_t takeOwn );
 int socket_pending( conn_t *sock );
 
 int buffer_gets( conn_t *b, char **s );
diff --git a/src/socket.c b/src/socket.c
index cc080b4..b2a1ee9 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -373,7 +373,7 @@ socket_read( conn_t *sock, char *buf, int len )
 }
 
 int
-socket_write( conn_t *sock, char *buf, int len )
+socket_write( conn_t *sock, char *buf, int len, ownership_t takeOwn )
 {
        int n;
 
@@ -383,6 +383,8 @@ socket_write( conn_t *sock, char *buf, int len )
                sock->ssl ? SSL_write( sock->ssl, buf, len ) :
 #endif
                write( sock->fd, buf, len );
+       if (takeOwn == GiveOwn)
+               free( buf );
        if (n != len) {
                socket_perror( "write", sock, n );
                close( sock->fd );

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to