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 2729 by yutakakn, Sun Nov 14 15:53:21 2004 UTC revision 3003 by maya, Mon Aug 20 14:21:57 2007 UTC
# Line 58  static int recv_data(PTInstVar pvar, uns Line 58  static int recv_data(PTInstVar pvar, uns
58          /* Shuffle data to the start of the buffer */          /* Shuffle data to the start of the buffer */
59          if (pvar->pkt_state.datastart != 0) {          if (pvar->pkt_state.datastart != 0) {
60                  memmove(pvar->pkt_state.buf,                  memmove(pvar->pkt_state.buf,
61                                  pvar->pkt_state.buf + pvar->pkt_state.datastart,                          pvar->pkt_state.buf + pvar->pkt_state.datastart,
62                                  pvar->pkt_state.datalen);                          pvar->pkt_state.datalen);
63                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
64          }          }
65    
66          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
67                                          up_to_amount);                          up_to_amount);
68    
69          _ASSERT(pvar->pkt_state.buf != NULL);          _ASSERT(pvar->pkt_state.buf != NULL);
70    
71          amount_read = (pvar->Precv) (pvar->socket,          amount_read = (pvar->Precv) (pvar->socket,
72                                                                   pvar->pkt_state.buf +                                       pvar->pkt_state.buf +
73                                                                   pvar->pkt_state.datalen,                                       pvar->pkt_state.datalen,
74                                                                   up_to_amount - pvar->pkt_state.datalen,                                       up_to_amount - pvar->pkt_state.datalen,
75                                                                   0);                                       0);
76    
77          if (amount_read > 0) {          if (amount_read > 0) {
78                  /* Update seen_newline if necessary */                  /* Update seen_newline if necessary */
79                  if (!pvar->pkt_state.seen_server_ID                  if (!pvar->pkt_state.seen_server_ID
80                          && !pvar->pkt_state.seen_newline) {                   && !pvar->pkt_state.seen_newline) {
81                          int i;                          int i;
82    
83                          for (i = 0; i < amount_read; i++) {                          for (i = 0; i < amount_read; i++) {
84                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==                                  if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==
85                                          '\n') {                                      '\n') {
86                                          pvar->pkt_state.seen_newline = 1;                                          pvar->pkt_state.seen_newline = 1;
87                                  }                                  }
88                          }                          }
# Line 106  static int recv_line_data(PTInstVar pvar Line 106  static int recv_line_data(PTInstVar pvar
106          /* Shuffle data to the start of the buffer */          /* Shuffle data to the start of the buffer */
107          if (pvar->pkt_state.datastart != 0) {          if (pvar->pkt_state.datastart != 0) {
108                  memmove(pvar->pkt_state.buf,                  memmove(pvar->pkt_state.buf,
109                                  pvar->pkt_state.buf + pvar->pkt_state.datastart,                          pvar->pkt_state.buf + pvar->pkt_state.datastart,
110                                  pvar->pkt_state.datalen);                          pvar->pkt_state.datalen);
111                  pvar->pkt_state.datastart = 0;                  pvar->pkt_state.datastart = 0;
112          }          }
113    
114          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,          buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
115                                          up_to_amount);                          up_to_amount);
116    
117          for (i = 0 ; i < (int)up_to_amount ; i++) {          for (i = 0 ; i < (int)up_to_amount ; i++) {
118                  amount_read = (pvar->Precv) (pvar->socket,                  amount_read = (pvar->Precv) (pvar->socket,
119                                                                          &buf[i],                                               &buf[i], 1, 0);
                                                                         1,  
                                                                         0);  
120                  if (amount_read != 1) {                  if (amount_read != 1) {
121                          return 0; // error                          return 0; // error
122                  }                  }
# Line 158  int PKT_recv(PTInstVar pvar, char FAR * Line 156  int PKT_recv(PTInstVar pvar, char FAR *
156                          buflen -= grabbed;                          buflen -= grabbed;
157    
158                  } else if (!pvar->pkt_state.seen_server_ID &&                  } else if (!pvar->pkt_state.seen_server_ID &&
159                                     (pvar->pkt_state.seen_newline                             (pvar->pkt_state.seen_newline
160                                          || pvar->pkt_state.datalen >= 255)) {                              || pvar->pkt_state.datalen >= 255)) {
161                          /* 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
162                             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
163                             a newline. */                             a newline. */
164                          unsigned int i;                          unsigned int i;
165    
166                          for (i = 0;                          for (i = 0;
167                                   pvar->pkt_state.buf[i] != '\n'                               pvar->pkt_state.buf[i] != '\n'
168                                   && i < pvar->pkt_state.datalen; i++) {                               && i < pvar->pkt_state.datalen; i++) {
169                          }                          }
170                          if (pvar->pkt_state.buf[i] == '\n') {                          if (pvar->pkt_state.buf[i] == '\n') {
171                                  i++;                                  i++;
# Line 190  int PKT_recv(PTInstVar pvar, char FAR * Line 188  int PKT_recv(PTInstVar pvar, char FAR *
188                          pvar->pkt_state.datalen -= i;                          pvar->pkt_state.datalen -= i;
189    
190                  } else if (pvar->pkt_state.seen_server_ID                  } else if (pvar->pkt_state.seen_server_ID
191                                     && pvar->pkt_state.datalen >=                             && pvar->pkt_state.datalen >=
192                                     (unsigned int) SSH_get_min_packet_size(pvar)) {                             (unsigned int) SSH_get_min_packet_size(pvar)) {
193                          char FAR *data =                          char FAR *data =
194                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;                                  pvar->pkt_state.buf + pvar->pkt_state.datastart;
195                          uint32 padding;                          uint32 padding;
# Line 202  int PKT_recv(PTInstVar pvar, char FAR * Line 200  int PKT_recv(PTInstVar pvar, char FAR *
200    
201                          // SSH2なら暗号化パケットの一部を復号化する。                          // SSH2なら暗号化パケットの一部を復号化する。
202                          if (!pvar->pkt_state.predecrypted_packet) {                          if (!pvar->pkt_state.predecrypted_packet) {
203                                    //DEBUG_PRINT_TO_FILE(0, data, pvar->pkt_state.datalen);
204                                  SSH_predecrpyt_packet(pvar, data);                                  SSH_predecrpyt_packet(pvar, data);
205    
206                                  if (SSHv1(pvar)) {                                  if (SSHv1(pvar)) {
# Line 238  int PKT_recv(PTInstVar pvar, char FAR * Line 237  int PKT_recv(PTInstVar pvar, char FAR *
237                          } else if (total_packet_size > 4 * 1024 * 1024) {                          } else if (total_packet_size > 4 * 1024 * 1024) {
238                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。                                  // 4MBを超える巨大なパケットが届いたら、異常終了する。
239                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。                                  // 実際にはデータ化けで復号失敗時に、誤認識することが多い。
240                                  notify_fatal_error(pvar,                                  UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
241                                                                     "Oversized packet received from server; connection will close.");                                                                    "Oversized packet received from server; connection will close.");
242                                    notify_fatal_error(pvar, pvar->ts->UIMsg);
243                          } else {                          } else {
244                                  int amount_read =                                  int amount_read =
245                                          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 289  int PKT_recv(PTInstVar pvar, char FAR *
289    
290          if (SSH_is_any_payload(pvar)) {          if (SSH_is_any_payload(pvar)) {
291                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
292                                          pvar->socket, MAKELPARAM(FD_READ, 0));                              pvar->socket, MAKELPARAM(FD_READ, 0));
293          }          }
294    
295          return amount_in_buf;          return amount_in_buf;

Legend:
Removed from v.2729  
changed lines
  Added in v.3003

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