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 2922 by yutakapon, Sun Oct 29 17:15:47 2006 UTC revision 3101 by yutakapon, Wed Jan 30 12:19:27 2008 UTC
# Line 37  See LICENSE.TXT for the license. Line 37  See LICENSE.TXT for the license.
37  //#define READAMOUNT 60000  //#define READAMOUNT 60000
38  // 60000 -> 65536 へ拡張。SSH2ではwindow制御を行うため、SSH2のwindow sizeと  // 60000 -> 65536 へ拡張。SSH2ではwindow制御を行うため、SSH2のwindow sizeと
39  // 合わせておく必要がある。(2004.10.17 yutaka)  // 合わせておく必要がある。(2004.10.17 yutaka)
40  #define READAMOUNT 65536  //#define READAMOUNT 65536
41    // 65536 -> 131072 へ拡張。(2007.10.29 maya)
42    #define READAMOUNT CHAN_SES_WINDOW_DEFAULT
43    
44  void PKT_init(PTInstVar pvar)  void PKT_init(PTInstVar pvar)
45  {  {
# Line 58  static int recv_data(PTInstVar pvar, uns Line 60  static int recv_data(PTInstVar pvar, uns
60          /* Shuffle data to the start of the buffer */          /* Shuffle data to the start of the buffer */
61          if (pvar->pkt_state.datastart != 0) {          if (pvar->pkt_state.datastart != 0) {
62                  memmove(pvar->pkt_state.buf,                  memmove(pvar->pkt_state.buf,
63                                  pvar->pkt_state.buf + pvar->pkt_state.datastart,                          pvar->pkt_state.buf + pvar->pkt_state.datastart,
64                                  pvar->pkt_state.datalen);                          pvar->pkt_state.datalen);
65                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
66          }          }
67    
68          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
69                                          up_to_amount);                          up_to_amount);
70    
71          _ASSERT(pvar->pkt_state.buf != NULL);          _ASSERT(pvar->pkt_state.buf != NULL);
72    
73          amount_read = (pvar->Precv) (pvar->socket,          amount_read = (pvar->Precv) (pvar->socket,
74                                                                   pvar->pkt_state.buf +                                       pvar->pkt_state.buf +
75                                                                   pvar->pkt_state.datalen,                                       pvar->pkt_state.datalen,
76                                                                   up_to_amount - pvar->pkt_state.datalen,                                       up_to_amount - pvar->pkt_state.datalen,
77                                                                   0);                                       0);
78    
79          if (amount_read > 0) {          if (amount_read > 0) {
80                  /* Update seen_newline if necessary */                  /* Update seen_newline if necessary */
81                  if (!pvar->pkt_state.seen_server_ID                  if (!pvar->pkt_state.seen_server_ID
82                          && !pvar->pkt_state.seen_newline) {                   && !pvar->pkt_state.seen_newline) {
83                          int i;                          int i;
84    
85                          for (i = 0; i < amount_read; i++) {                          for (i = 0; i < amount_read; i++) {
86                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==
87                                          '\n') {                                      '\n') {
88                                          pvar->pkt_state.seen_newline = 1;                                          pvar->pkt_state.seen_newline = 1;
89                                  }                                  }
90                          }                          }
# Line 106  static int recv_line_data(PTInstVar pvar Line 108  static int recv_line_data(PTInstVar pvar
108          /* Shuffle data to the start of the buffer */          /* Shuffle data to the start of the buffer */
109          if (pvar->pkt_state.datastart != 0) {          if (pvar->pkt_state.datastart != 0) {
110                  memmove(pvar->pkt_state.buf,                  memmove(pvar->pkt_state.buf,
111                                  pvar->pkt_state.buf + pvar->pkt_state.datastart,                          pvar->pkt_state.buf + pvar->pkt_state.datastart,
112                                  pvar->pkt_state.datalen);                          pvar->pkt_state.datalen);
113                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
114          }          }
115    
116          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
117                                          up_to_amount);                          up_to_amount);
118    
119          for (i = 0 ; i < (int)up_to_amount ; i++) {          for (i = 0 ; i < (int)up_to_amount ; i++) {
120                  amount_read = (pvar->Precv) (pvar->socket,                  amount_read = (pvar->Precv) (pvar->socket,
121                                                                          &buf[i],                                               &buf[i], 1, 0);
                                                                         1,  
                                                                         0);  
122                  if (amount_read != 1) {                  if (amount_read != 1) {
123                          return 0; // error                          return 0; // error
124                  }                  }
# Line 158  int PKT_recv(PTInstVar pvar, char FAR * Line 158  int PKT_recv(PTInstVar pvar, char FAR *
158                          buflen -= grabbed;                          buflen -= grabbed;
159    
160                  } else if (!pvar->pkt_state.seen_server_ID &&                  } else if (!pvar->pkt_state.seen_server_ID &&
161                                     (pvar->pkt_state.seen_newline                             (pvar->pkt_state.seen_newline
162                                          || pvar->pkt_state.datalen >= 255)) {                              || pvar->pkt_state.datalen >= 255)) {
163                          /* 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
164                             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
165                             a newline. */                             a newline. */
166                          unsigned int i;                          unsigned int i;
167    
168                          for (i = 0;                          for (i = 0;
169                                   pvar->pkt_state.buf[i] != '\n'                               pvar->pkt_state.buf[i] != '\n'
170                                   && i < pvar->pkt_state.datalen; i++) {                               && i < pvar->pkt_state.datalen; i++) {
171                          }                          }
172                          if (pvar->pkt_state.buf[i] == '\n') {                          if (pvar->pkt_state.buf[i] == '\n') {
173                                  i++;                                  i++;
# Line 184  int PKT_recv(PTInstVar pvar, char FAR * Line 184  int PKT_recv(PTInstVar pvar, char FAR *
184                                          SSH2_send_kexinit(pvar);                                          SSH2_send_kexinit(pvar);
185                                  }                                  }
186    
187                            } else {
188                                    // reset flag to re-read server ID (2008.1.24 yutaka)
189                                    pvar->pkt_state.seen_newline = 0;
190    
191                          }                          }
192    
193                          pvar->pkt_state.datastart += i;                          pvar->pkt_state.datastart += i;
194                          pvar->pkt_state.datalen -= i;                          pvar->pkt_state.datalen -= i;
195    
196                  } else if (pvar->pkt_state.seen_server_ID                  } else if (pvar->pkt_state.seen_server_ID
197                                     && pvar->pkt_state.datalen >=                             && pvar->pkt_state.datalen >=
198                                     (unsigned int) SSH_get_min_packet_size(pvar)) {                             (unsigned int) SSH_get_min_packet_size(pvar)) {
199                          char FAR *data =                          char FAR *data =
200                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;
201                          uint32 padding;                          uint32 padding;
# Line 239  int PKT_recv(PTInstVar pvar, char FAR * Line 243  int PKT_recv(PTInstVar pvar, char FAR *
243                          } else if (total_packet_size > 4 * 1024 * 1024) {                          } else if (total_packet_size > 4 * 1024 * 1024) {
244                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。
245                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。
246                                  notify_fatal_error(pvar,                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
247                                                                     "Oversized packet received from server; connection will close.");                                                                    "Oversized packet received from server; connection will close.");
248                                    notify_fatal_error(pvar, pvar->ts->UIMsg);
249                          } else {                          } else {
250                                  int amount_read =                                  int amount_read =
251                                          recv_data(pvar, max(total_packet_size, READAMOUNT));                                          recv_data(pvar, max(total_packet_size, READAMOUNT));
# Line 290  int PKT_recv(PTInstVar pvar, char FAR * Line 295  int PKT_recv(PTInstVar pvar, char FAR *
295    
296          if (SSH_is_any_payload(pvar)) {          if (SSH_is_any_payload(pvar)) {
297                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
298                                          pvar->socket, MAKELPARAM(FD_READ, 0));                              pvar->socket, MAKELPARAM(FD_READ, 0));
299          }          }
300    
301          return amount_in_buf;          return amount_in_buf;
# Line 300  void PKT_end(PTInstVar pvar) Line 305  void PKT_end(PTInstVar pvar)
305  {  {
306          buf_destroy(&pvar->pkt_state.buf, &pvar->pkt_state.buflen);          buf_destroy(&pvar->pkt_state.buf, &pvar->pkt_state.buflen);
307  }  }
   
 /*  
  * $Log: not supported by cvs2svn $  
  * Revision 1.2  2004/12/19 15:39:58  yutakakn  
  * CVS LogIDの追加  
  *  
  */  

Legend:
Removed from v.2922  
changed lines
  Added in v.3101

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