@@ -203,7 +203,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
203203 }
204204 }
205205
206- while (r > 0 )
206+ while (1 )
207207 {
208208 // local socks5 server
209209 if (server -> stage == 5 )
@@ -215,27 +215,9 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
215215 return ;
216216 }
217217
218- // Copy to remote->buf
219- if (buf != remote -> buf ) {
220- memcpy (remote -> buf , buf , r );
221- }
222-
223218 // insert shadowsocks header
224219 if (!remote -> direct )
225220 {
226- if (!remote -> send_ctx -> connected )
227- {
228- char * tmp = malloc (max (BUF_SIZE , r + server -> addr_len ));
229-
230- memcpy (tmp , server -> addr_to_send , server -> addr_len );
231- memcpy (tmp + server -> addr_len , remote -> buf , r );
232- r += server -> addr_len ;
233-
234- // deallocate
235- free (remote -> buf );
236- remote -> buf = tmp ;
237- }
238-
239221 remote -> buf = ss_encrypt (BUF_SIZE , remote -> buf , & r , server -> e_ctx );
240222
241223 if (remote -> buf == NULL )
@@ -342,7 +324,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
342324 }
343325
344326 // all processed
345- r = 0 ;
327+ return ;
346328 }
347329 else if (server -> stage == 0 )
348330 {
@@ -352,8 +334,6 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
352334 char * send_buf = (char * )& response ;
353335 send (server -> fd , send_buf , sizeof (response ), 0 );
354336 server -> stage = 1 ;
355- r -= 3 ;
356- buf += 3 ;
357337 return ;
358338 }
359339 else if (server -> stage == 1 )
@@ -452,12 +432,10 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
452432 return ;
453433 }
454434
455- server -> addr_to_send = ss_addr_to_send ;
456- server -> addr_len = addr_len ;
457435 server -> stage = 5 ;
458436
459- r -= (4 + addr_len );
460- buf += (4 + addr_len );
437+ r -= (3 + addr_len );
438+ buf += (3 + addr_len );
461439
462440 if (verbose )
463441 {
@@ -486,6 +464,23 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents)
486464 return ;
487465 }
488466
467+ if (!remote -> direct )
468+ {
469+ memcpy (remote -> buf , ss_addr_to_send , addr_len );
470+ if (r > 0 )
471+ {
472+ memcpy (remote -> buf + addr_len , buf , r );
473+ }
474+ r += addr_len ;
475+ }
476+ else
477+ {
478+ if (r > 0 )
479+ {
480+ memcpy (remote -> buf , buf , r );
481+ }
482+ }
483+
489484 server -> remote = remote ;
490485 remote -> server = server ;
491486 }
@@ -675,6 +670,14 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents)
675670 ev_timer_stop (EV_A_ & remote_send_ctx -> watcher );
676671 ev_timer_start (EV_A_ & remote -> recv_ctx -> watcher );
677672 ev_io_start (EV_A_ & remote -> recv_ctx -> io );
673+
674+ // no need to send any data
675+ if (remote -> buf_len == 0 )
676+ {
677+ ev_io_stop (EV_A_ & remote_send_ctx -> io );
678+ ev_io_start (EV_A_ & server -> recv_ctx -> io );
679+ return ;
680+ }
678681 }
679682 else
680683 {
@@ -838,10 +841,6 @@ static void free_server(struct server *server)
838841 {
839842 free (server -> buf );
840843 }
841- if (server -> addr_to_send != NULL )
842- {
843- free (server -> addr_to_send );
844- }
845844 free (server -> recv_ctx );
846845 free (server -> send_ctx );
847846 free (server );
0 commit comments