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

ttssh2/branches/avendor/ttxssh/pkt.c revision 2728 by yutakakn, Sun Nov 14 15:53:21 2004 UTC ttssh2/trunk/ttxssh/pkt.c revision 3057 by maya, Sun Oct 28 15:55:48 2007 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 190  int PKT_recv(PTInstVar pvar, char FAR * Line 190  int PKT_recv(PTInstVar pvar, char FAR *
190                          pvar->pkt_state.datalen -= i;                          pvar->pkt_state.datalen -= i;
191    
192                  } else if (pvar->pkt_state.seen_server_ID                  } else if (pvar->pkt_state.seen_server_ID
193                                     && pvar->pkt_state.datalen >=                             && pvar->pkt_state.datalen >=
194                                     (unsigned int) SSH_get_min_packet_size(pvar)) {                             (unsigned int) SSH_get_min_packet_size(pvar)) {
195                          char FAR *data =                          char FAR *data =
196                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;
197                          uint32 padding;                          uint32 padding;
# Line 202  int PKT_recv(PTInstVar pvar, char FAR * Line 202  int PKT_recv(PTInstVar pvar, char FAR *
202    
203                          // SSH2なら暗号化パケットの一部を復号化する。                          // SSH2なら暗号化パケットの一部を復号化する。
204                          if (!pvar->pkt_state.predecrypted_packet) {                          if (!pvar->pkt_state.predecrypted_packet) {
205                                    //DEBUG_PRINT_TO_FILE(0, data, pvar->pkt_state.datalen);
206                                  SSH_predecrpyt_packet(pvar, data);                                  SSH_predecrpyt_packet(pvar, data);
207    
208                                  if (SSHv1(pvar)) {                                  if (SSHv1(pvar)) {
# Line 238  int PKT_recv(PTInstVar pvar, char FAR * Line 239  int PKT_recv(PTInstVar pvar, char FAR *
239                          } else if (total_packet_size > 4 * 1024 * 1024) {                          } else if (total_packet_size > 4 * 1024 * 1024) {
240                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。
241                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。
242                                  notify_fatal_error(pvar,                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
243                                                                     "Oversized packet received from server; connection will close.");                                                                    "Oversized packet received from server; connection will close.");
244                                    notify_fatal_error(pvar, pvar->ts->UIMsg);
245                          } else {                          } else {
246                                  int amount_read =                                  int amount_read =
247                                          recv_data(pvar, max(total_packet_size, READAMOUNT));                                          recv_data(pvar, max(total_packet_size, READAMOUNT));
# Line 289  int PKT_recv(PTInstVar pvar, char FAR * Line 291  int PKT_recv(PTInstVar pvar, char FAR *
291    
292          if (SSH_is_any_payload(pvar)) {          if (SSH_is_any_payload(pvar)) {
293                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
294                                          pvar->socket, MAKELPARAM(FD_READ, 0));                              pvar->socket, MAKELPARAM(FD_READ, 0));
295          }          }
296    
297          return amount_in_buf;          return amount_in_buf;

Legend:
Removed from v.2728  
changed lines
  Added in v.3057

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