From fde43cf87c5df052bab04e890cbee91062f17159 Mon Sep 17 00:00:00 2001 From: Sergey Dorofeev Date: Fri, 24 Feb 2012 22:24:56 +0400 Subject: [PATCH] segfault fix --- source/bforce/prot_binkp_api.c | 12 +++++++++--- source/bforce/prot_common.c | 23 +++++++++++++++++++---- source/bforce/prot_zmsend.c | 5 ++++- source/bforce/sess_common.c | 2 ++ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/source/bforce/prot_binkp_api.c b/source/bforce/prot_binkp_api.c index ec3f765..25232ec 100644 --- a/source/bforce/prot_binkp_api.c +++ b/source/bforce/prot_binkp_api.c @@ -78,21 +78,27 @@ void binkp_init(s_handshake_protocol *THIS) void binkp_deinit(s_handshake_protocol *THIS) { - ASSERT(THIS); - ASSERT(THIS->remote_data); - ASSERT(THIS->local_data); + log("binkp_deinit"); + if (THIS==NULL) { + log("THIS==NULL"); + return; + } if( THIS->remote_data ) { memset(THIS->remote_data, '\0', sizeof(s_binkp_sysinfo)); free(THIS->remote_data); + THIS->remote_data = NULL; } if( THIS->local_data ) { memset(THIS->local_data, '\0', sizeof(s_binkp_sysinfo)); free(THIS->local_data); + THIS->local_data = NULL; } + log("binkp_deinit end"); + } int binkp_incoming2(s_handshake_protocol *THIS) diff --git a/source/bforce/prot_common.c b/source/bforce/prot_common.c index f854e21..8c0988a 100644 --- a/source/bforce/prot_common.c +++ b/source/bforce/prot_common.c @@ -349,7 +349,7 @@ get_next_file: if( !ptrl ) { /* send file received through netspool */ pi->send->fp = 0; - pi->send->local_name = "NETSPOOL"; + pi->send->local_name = (char*)xstrcpy("NETSPOOL"); pi->send->type = out_filetype(state.netspool.filename); pi->send->net_name = recode_file_out(p_convfilename(state.netspool.filename, pi->send->type)); pi->send->fname = NULL; @@ -749,7 +749,9 @@ static int p_move2inbound(s_protinfo *pi) { log("recv: cannot get unique name for \"%s\"", pi->recv->local_name); + log("free realname"); free(realname); + log("freed"); return 1; } @@ -796,10 +798,16 @@ static int p_move2inbound(s_protinfo *pi) destname); } - if( realname ) + if( realname ) { + log("free realname"); free(realname); - if( uniqname ) + log("freed"); + } + if( uniqname ) { + log("free uniqname"); free(uniqname); + log("freed"); + } return rc ? 1 : 0; } @@ -984,8 +992,9 @@ int p_rx_fopen(s_protinfo *pi, char *fn, size_t sz, time_t tm, mode_t mode) pi->recv->status = FSTAT_SKIPPED; } } - + log("free fname"); free(fname); fname = NULL; + log("freed"); if( pi->recv->status == FSTAT_SKIPPED ) return 2; @@ -1013,8 +1022,10 @@ int p_rx_fopen(s_protinfo *pi, char *fn, size_t sz, time_t tm, mode_t mode) else pi->recv->status = FSTAT_REFUSED; + log("free pi->recv->fname"); free(pi->recv->fname); pi->recv->fname = NULL; + log("freed"); return pi->recv->status == FSTAT_SKIPPED ? 2 : 1; } @@ -1636,6 +1647,7 @@ char *prot_unique_name(char *dirname, char *fname, int type) */ void deinit_finfo(s_finfo *fi) { + log("deinit_finfo"); if( fi->fp ) fclose(fi->fp); @@ -1647,6 +1659,7 @@ void deinit_finfo(s_finfo *fi) free(fi->fname); memset(fi, '\0', sizeof(s_finfo)); + log("deinit_finfo end"); } /***************************************************************************** @@ -1764,6 +1777,7 @@ void init_protinfo(s_protinfo *pi, bool caller) void deinit_protinfo(s_protinfo *pi) { int i; + log("deinit_protinfo"); for( i = 0; i < pi->n_sentfiles; i++ ) deinit_finfo(&pi->sentfiles[i]); @@ -1779,4 +1793,5 @@ void deinit_protinfo(s_protinfo *pi) free(pi->rcvdfiles); memset(pi, '\0', sizeof(s_protinfo)); + log("deinit_protinfo end"); } diff --git a/source/bforce/prot_zmsend.c b/source/bforce/prot_zmsend.c index 9a9a5a6..714b896 100644 --- a/source/bforce/prot_zmsend.c +++ b/source/bforce/prot_zmsend.c @@ -719,8 +719,11 @@ exit: if (pi->send) p_tx_fclose(pi); - if( txbuf ) + if( txbuf ) { free(txbuf); + txbuf = NULL; + } + return(rc); } diff --git a/source/bforce/sess_common.c b/source/bforce/sess_common.c index 956401c..e3c235a 100644 --- a/source/bforce/sess_common.c +++ b/source/bforce/sess_common.c @@ -164,6 +164,7 @@ void init_state(s_state *pstate) void deinit_state(s_state *pstate) { + log("deinit_state begin"); if (pstate->linename) free(pstate->linename); if (pstate->cidstr) free(pstate->cidstr); if (pstate->peername) free(pstate->peername); @@ -184,6 +185,7 @@ void deinit_state(s_state *pstate) memset(pstate, '\0', sizeof(s_state)); pstate->session_rc = -1; + log("deinit_state end"); } s_faddr *session_1remote_address()