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 6771 by doda, Mon Jun 5 08:48:48 2017 UTC revision 6966 by doda, Thu Nov 2 11:37:28 2017 UTC
# Line 1  Line 1 
1  /*  /*
2  Copyright (c) 1998-2001, Robert O'Callahan   * Copyright (c) 1998-2001, Robert O'Callahan
3  All rights reserved.   * (C) 2004-2017 TeraTerm Project
4     * All rights reserved.
5  Redistribution and use in source and binary forms, with or without modification,   *
6  are permitted provided that the following conditions are met:   * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8  Redistributions of source code must retain the above copyright notice, this list of   * are met:
9  conditions and the following disclaimer.   *
10     * 1. Redistributions of source code must retain the above copyright
11  Redistributions in binary form must reproduce the above copyright notice, this list   *    notice, this list of conditions and the following disclaimer.
12  of conditions and the following disclaimer in the documentation and/or other materials   * 2. Redistributions in binary form must reproduce the above copyright
13  provided with the distribution.   *    notice, this list of conditions and the following disclaimer in the
14     *    documentation and/or other materials provided with the distribution.
15  The name of Robert O'Callahan may not be used to endorse or promote products derived from   * 3. The name of the author may not be used to endorse or promote products
16  this software without specific prior written permission.   *    derived from this software without specific prior written permission.
17     *
18  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND   * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,   * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  */   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28     */
29    
30  /*  /*
31  This code is copyright (C) 1998-1999 Robert O'Callahan.  This code is copyright (C) 1998-1999 Robert O'Callahan.
# Line 35  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 66  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 114  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 144  static int recv_line_data(PTInstVar pvar Line 133  static int recv_line_data(PTInstVar pvar
133     -- reads data from the sshd and feeds the SSH protocol packets to ssh.c     -- reads data from the sshd and feeds the SSH protocol packets to ssh.c
134     -- copies any available decrypted session data into the application buffer     -- copies any available decrypted session data into the application buffer
135  */  */
136  int PKT_recv(PTInstVar pvar, char FAR * buf, int buflen)  int PKT_recv(PTInstVar pvar, char *buf, int buflen)
137  {  {
138          int amount_in_buf = 0;          int amount_in_buf = 0;
139          BOOL connection_closed = FALSE;          BOOL connection_closed = FALSE;
# Line 159  int PKT_recv(PTInstVar pvar, char FAR * Line 148  int PKT_recv(PTInstVar pvar, char FAR *
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 178  int PKT_recv(PTInstVar pvar, char FAR * Line 164  int PKT_recv(PTInstVar pvar, char FAR *
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 FAR *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 241  int PKT_recv(PTInstVar pvar, char FAR * Line 219  int PKT_recv(PTInstVar pvar, char FAR *
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 256  int PKT_recv(PTInstVar pvar, char FAR * Line 233  int PKT_recv(PTInstVar pvar, char FAR *
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 288  int PKT_recv(PTInstVar pvar, char FAR * Line 256  int PKT_recv(PTInstVar pvar, char FAR *
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.6771  
changed lines
  Added in v.6966

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