Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/ttssh2/ttxssh/pkt.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6965 by doda, Tue Jul 4 15:02:28 2017 UTC revision 6966 by doda, Thu Nov 2 11:37:28 2017 UTC
# Line 36  See LICENSE.TXT for the license. Line 36  See LICENSE.TXT for the license.
36  #include "util.h"  #include "util.h"
37  #include "pkt.h"  #include "pkt.h"
38    
 //#define READAMOUNT 60000  
 // 60000 -> 65536 へ拡張。SSH2ではwindow制御を行うため、SSH2のwindow sizeと  
 // 合わせておく必要がある。(2004.10.17 yutaka)  
 //#define READAMOUNT 65536  
 // 65536 -> 131072 へ拡張。(2007.10.29 maya)  
39  #define READAMOUNT CHAN_SES_WINDOW_DEFAULT  #define READAMOUNT CHAN_SES_WINDOW_DEFAULT
40    
41  void PKT_init(PTInstVar pvar)  void PKT_init(PTInstVar pvar)
# Line 67  static int recv_data(PTInstVar pvar, uns Line 62  static int recv_data(PTInstVar pvar, uns
62                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
63          }          }
64    
65          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen, up_to_amount);
                         up_to_amount);  
66    
67          _ASSERT(pvar->pkt_state.buf != NULL);          _ASSERT(pvar->pkt_state.buf != NULL);
68    
69          amount_read = (pvar->Precv) (pvar->socket,          amount_read = (pvar->Precv) (pvar->socket,
70                                       pvar->pkt_state.buf +                                       pvar->pkt_state.buf + pvar->pkt_state.datalen,
                                      pvar->pkt_state.datalen,  
71                                       up_to_amount - pvar->pkt_state.datalen,                                       up_to_amount - pvar->pkt_state.datalen,
72                                       0);                                       0);
73    
74          if (amount_read > 0) {          if (amount_read > 0) {
75                  /* Update seen_newline if necessary */                  /* Update seen_newline if necessary */
76                  if (!pvar->pkt_state.seen_server_ID                  if (!pvar->pkt_state.seen_server_ID && !pvar->pkt_state.seen_newline) {
                  && !pvar->pkt_state.seen_newline) {  
77                          int i;                          int i;
78    
79                          for (i = 0; i < amount_read; i++) {                          for (i = 0; i < amount_read; i++) {
80                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] == '\n') {
                                     '\n') {  
81                                          pvar->pkt_state.seen_newline = 1;                                          pvar->pkt_state.seen_newline = 1;
82                                  }                                  }
83                          }                          }
84                  }                  }
   
85                  pvar->pkt_state.datalen += amount_read;                  pvar->pkt_state.datalen += amount_read;
86          }          }
87    
# Line 115  static int recv_line_data(PTInstVar pvar Line 105  static int recv_line_data(PTInstVar pvar
105                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
106          }          }
107    
108          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen, up_to_amount);
                         up_to_amount);  
109    
110          for (i = 0 ; i < (int)up_to_amount ; i++) {          for (i = 0 ; i < (int)up_to_amount ; i++) {
111                  amount_read = (pvar->Precv) (pvar->socket,                  amount_read = (pvar->Precv) (pvar->socket, &buf[i], 1, 0);
                                              &buf[i], 1, 0);  
112                  if (amount_read != 1) {                  if (amount_read != 1) {
113                          return 0; // error                          return 0; // error
114                  }                  }
# Line 160  int PKT_recv(PTInstVar pvar, char *buf, Line 148  int PKT_recv(PTInstVar pvar, char *buf,
148                          buflen -= grabbed;                          buflen -= grabbed;
149    
150                  } else if (!pvar->pkt_state.seen_server_ID &&                  } else if (!pvar->pkt_state.seen_server_ID &&
151                             (pvar->pkt_state.seen_newline                             (pvar->pkt_state.seen_newline || pvar->pkt_state.datalen >= 255)) {
                             || pvar->pkt_state.datalen >= 255)) {  
152                          /* We're looking for the initial ID string and either we've seen the                          /* We're looking for the initial ID string and either we've seen the
153                             terminating newline, or we've exceeded the limit at which we should see                             terminating newline, or we've exceeded the limit at which we should see
154                             a newline. */                             a newline. */
155                          unsigned int i;                          unsigned int i;
156    
157                          for (i = 0;                          for (i = 0; pvar->pkt_state.buf[i] != '\n' && i < pvar->pkt_state.datalen; i++) {
                              pvar->pkt_state.buf[i] != '\n'  
                              && i < pvar->pkt_state.datalen; i++) {  
158                          }                          }
159                          if (pvar->pkt_state.buf[i] == '\n') {                          if (pvar->pkt_state.buf[i] == '\n') {
160                                  i++;                                  i++;
# Line 179  int PKT_recv(PTInstVar pvar, char *buf, Line 164  int PKT_recv(PTInstVar pvar, char *buf,
164                          if (SSH_handle_server_ID(pvar, pvar->pkt_state.buf, i)) {                          if (SSH_handle_server_ID(pvar, pvar->pkt_state.buf, i)) {
165                                  pvar->pkt_state.seen_server_ID = 1;                                  pvar->pkt_state.seen_server_ID = 1;
166    
167                                  if (SSHv1(pvar)) {                                  if (SSHv2(pvar)) {
   
                                 } else { // for SSH2(yutaka)  
168                                          // send Key Exchange Init                                          // send Key Exchange Init
169                                          SSH2_send_kexinit(pvar);                                          SSH2_send_kexinit(pvar);
170                                  }                                  }
   
171                          } else {                          } else {
172                                  // reset flag to re-read server ID (2008.1.24 yutaka)                                  // reset flag to re-read server ID (2008.1.24 yutaka)
173                                  pvar->pkt_state.seen_newline = 0;                                  pvar->pkt_state.seen_newline = 0;
   
174                          }                          }
175    
176                          pvar->pkt_state.datastart += i;                          pvar->pkt_state.datastart += i;
177                          pvar->pkt_state.datalen -= i;                          pvar->pkt_state.datalen -= i;
178    
179                  } else if (pvar->pkt_state.seen_server_ID                  } else if (pvar->pkt_state.seen_server_ID &&
180                             && pvar->pkt_state.datalen >=                             pvar->pkt_state.datalen >= (unsigned int) SSH_get_min_packet_size(pvar)) {
181                             (unsigned int) SSH_get_min_packet_size(pvar)) {                          char *data = pvar->pkt_state.buf + pvar->pkt_state.datastart;
                         char *data =  
                                 pvar->pkt_state.buf + pvar->pkt_state.datastart;  
182                          uint32 padding;                          uint32 padding;
183                          uint32 pktsize;                          uint32 pktsize;
184                          uint32 total_packet_size;                          uint32 total_packet_size;
185    
                         //debug_print(10, data, pvar->pkt_state.datalen);  
   
186                          // 暗号化パケットの一部を復号化する。                          // 暗号化パケットの一部を復号化する。
187                          if (!pvar->pkt_state.predecrypted_packet) {                          if (!pvar->pkt_state.predecrypted_packet) {
188                                  SSH_predecrpyt_packet(pvar, data);                                  SSH_predecrpyt_packet(pvar, data);
# Line 242  int PKT_recv(PTInstVar pvar, char *buf, Line 219  int PKT_recv(PTInstVar pvar, char *buf,
219                                                    "Oversized packet received from server; connection will close.");                                                    "Oversized packet received from server; connection will close.");
220                                  notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);                                  notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
221                          } else {                          } else {
222                                  int amount_read =                                  int amount_read = recv_data(pvar, max(total_packet_size, READAMOUNT));
                                         recv_data(pvar, max(total_packet_size, READAMOUNT));  
223    
224                                  if (amount_read == SOCKET_ERROR) {                                  if (amount_read == SOCKET_ERROR) {
225                                          if (amount_in_buf == 0) {                                          if (amount_in_buf == 0) {
# Line 257  int PKT_recv(PTInstVar pvar, char *buf, Line 233  int PKT_recv(PTInstVar pvar, char *buf,
233                                          }                                          }
234                                  }                                  }
235                          }                          }
   
   
236                  } else {                  } else {
237                          // パケットの受信(最大60KB)                          // パケットの受信
238                          int amount_read;                          int amount_read;
239    
240                          if (pvar->pkt_state.seen_server_ID == 0) {                          amount_read = recv_data(pvar, READAMOUNT);
                                 //amount_read = recv_line_data(pvar);  
                                 amount_read = recv_data(pvar, READAMOUNT);  
   
                         } else {  
                                 amount_read = recv_data(pvar, READAMOUNT);  
   
                         }  
241    
242                          if (amount_read == SOCKET_ERROR) {                          if (amount_read == SOCKET_ERROR) {
243                                  if (amount_in_buf == 0) {                                  if (amount_in_buf == 0) {
# Line 289  int PKT_recv(PTInstVar pvar, char *buf, Line 256  int PKT_recv(PTInstVar pvar, char *buf,
256          }          }
257    
258          if (SSH_is_any_payload(pvar)) {          if (SSH_is_any_payload(pvar)) {
259                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY, pvar->socket, MAKELPARAM(FD_READ, 0));
                             pvar->socket, MAKELPARAM(FD_READ, 0));  
260          }          }
261    
262          return amount_in_buf;          return amount_in_buf;

Legend:
Removed from v.6965  
changed lines
  Added in v.6966

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26