Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ssh.c

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

revision 2806 by yutakakn, Mon Mar 28 13:52:05 2005 UTC revision 2809 by yutakakn, Sun Apr 3 14:39:48 2005 UTC
# Line 90  static void start_ssh_heartbeat_thread(P Line 90  static void start_ssh_heartbeat_thread(P
90    
91    
92  //  //
93    // SSH2 data structure
94    //
95    
96    /* default window/packet sizes for tcp/x11-fwd-channel */
97    #define CHAN_SES_PACKET_DEFAULT (32*1024)
98    #define CHAN_SES_WINDOW_DEFAULT (2*CHAN_SES_PACKET_DEFAULT) // READAMOUNT @ pkt.cと同期を取ること
99    
100    // channel data structure
101    #define CHANNEL_MAX 100
102    
103    typedef struct channel {
104            int used;
105            int type;
106            int self_id;
107            int remote_id;
108            unsigned int local_window;
109            unsigned int local_window_max;
110            unsigned int local_consumed;
111            unsigned int local_maxpacket;
112            unsigned int remote_window;
113            unsigned int remote_maxpacket;
114    } Channel_t;
115    
116    static Channel_t channels[CHANNEL_MAX];
117    
118    //
119    // channel function
120    //
121    static Channel_t *ssh2_channel_new(unsigned int window, unsigned int maxpack)
122    {
123            int i, found;
124            Channel_t *c;
125    
126            found = -1;
127            for (i = 0 ; i < CHANNEL_MAX ; i++) {
128                    if (channels[i].used == 0) { // free channel
129                            found = i;
130                            break;
131                    }
132            }
133            if (found == -1) { // not free channel
134                    return (NULL);
135            }
136    
137            // setup
138            c = &channels[found];
139            c->used = 1;
140            c->self_id = i;
141            c->remote_id = -1;
142            c->local_window = window;
143            c->local_window_max = window;
144            c->local_consumed = 0;
145            c->local_maxpacket = maxpack;
146            c->remote_window = 0;
147            c->remote_maxpacket = 0;
148    
149            return (c);
150    }
151    
152    
153    // connection close時に呼ばれる
154    void ssh2_channel_free(void)
155    {
156            int i;
157            Channel_t *c;
158    
159            for (i = 0 ; i < CHANNEL_MAX ; i++) {
160                    c = &channels[i];
161                    memset(c, 0, sizeof(Channel_t));
162            }
163    
164    }
165    
166    static Channel_t *ssh2_channel_lookup(int id)
167    {
168            Channel_t *c;
169    
170            if (id < 0 || id >= CHANNEL_MAX) {
171                    return (NULL);
172            }
173            c = &channels[id];
174            if (c->used == 0) { // already freed
175                    return (NULL);
176            }
177            return (c);
178    }
179    
180    
181    
182    //
183  // SSH heartbeat mutex  // SSH heartbeat mutex
184  //  //
185  static CRITICAL_SECTION g_ssh_heartbeat_lock;   /* ロック用変数 */  static CRITICAL_SECTION g_ssh_heartbeat_lock;   /* ロック用変数 */
# Line 133  typedef struct memtag { Line 223  typedef struct memtag {
223    
224  static memtag_t memtags[MEMTAG_MAX];  static memtag_t memtags[MEMTAG_MAX];
225  static int memtag_count = 0;  static int memtag_count = 0;
226    static int memtag_use = 0;
227    
228  /* ダンプラインをフォーマット表示する */  /* ダンプラインをフォーマット表示する */
229  static void displine_memdump(FILE *fp, int addr, int *bytes, int byte_cnt)  static void displine_memdump(FILE *fp, int addr, int *bytes, int byte_cnt)
# Line 207  void init_memdump(void) Line 298  void init_memdump(void)
298                  memtags[i].data = NULL;                  memtags[i].data = NULL;
299                  memtags[i].len = 0;                  memtags[i].len = 0;
300          }          }
301            memtag_use++;
302  }  }
303    
304  void finish_memdump(void)  void finish_memdump(void)
305  {  {
306          int i;          int i;
307    
308            // initializeされてないときは何もせずに戻る。(2005.4.3 yutaka)
309            if (memtag_use <= 0)
310                    return;
311            memtag_use--;
312    
313          for (i = 0 ; i < MEMTAG_MAX ; i++) {          for (i = 0 ; i < MEMTAG_MAX ; i++) {
314                  free(memtags[i].name);                  free(memtags[i].name);
315                  free(memtags[i].desc);                  free(memtags[i].desc);
# Line 1438  void SSH2_dispatch_add_range_message(uns Line 1535  void SSH2_dispatch_add_range_message(uns
1535  }  }
1536    
1537    
 /* default window/packet sizes for tcp/x11-fwd-channel */  
 #define CHAN_SES_PACKET_DEFAULT (32*1024)  
 #define CHAN_SES_WINDOW_DEFAULT (2*CHAN_SES_PACKET_DEFAULT) // READAMOUNT @ pkt.cと同期を取ること  
   
 //#define CHAN_TCP_PACKET_DEFAULT (32*1024)  
 //#define CHAN_TCP_WINDOW_DEFAULT (4*CHAN_TCP_PACKET_DEFAULT)  
 //#define CHAN_X11_PACKET_DEFAULT (16*1024)  
 //#define CHAN_X11_WINDOW_DEFAULT (4*CHAN_X11_PACKET_DEFAULT)  
   
 // クライアントのwindow sizeをサーバへ知らせる  
 static void do_SSH2_adjust_window_size(PTInstVar pvar)  
 {  
         const unsigned int window_size = CHAN_SES_PACKET_DEFAULT;  
         buffer_t *msg;  
         unsigned char *outmsg;  
         int len;  
   
         // ローカルのwindow sizeにまだ余裕があるなら、何もしない。  
         if (pvar->local_window > window_size)  
                 return;  
   
         {  
                 // pty open  
                 msg = buffer_init();  
                 if (msg == NULL) {  
                         // TODO: error check  
                         return;  
                 }  
                 buffer_put_int(msg, pvar->remote_id);    
                 buffer_put_int(msg, window_size - pvar->local_window);    
   
                 len = buffer_len(msg);  
                 outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_WINDOW_ADJUST, len);  
                 memcpy(outmsg, buffer_ptr(msg), len);  
                 finish_send_packet(pvar);  
                 buffer_free(msg);  
   
                 // クライアントのwindow sizeを増やす  
                 pvar->local_window = window_size;  
         }  
   
 }  
   
   
 static void SSH2_consume_packet_size(PTInstVar pvar, unsigned char message)  
 {  
         int len;  
         char *data;  
   
         if (!(message >= SSH2_MSG_CHANNEL_OPEN_CONFIRMATION && message <= SSH2_MSG_CHANNEL_FAILURE)) {  
                 return;  
         }  
   
         // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード  
         data = pvar->ssh_state.payload;  
         // パケットサイズ - (パディングサイズ+1);真のパケットサイズ  
         len = pvar->ssh_state.payloadlen;  
   
         pvar->local_window -= (len + 1);  
   
         do_SSH2_adjust_window_size(pvar);  
   
 }  
   
   
1538  void SSH_handle_packet(PTInstVar pvar, char FAR * data, int len,  void SSH_handle_packet(PTInstVar pvar, char FAR * data, int len,
1539                                             int padding)                                             int padding)
1540  {  {
# Line 2017  void SSH_notify_disconnecting(PTInstVar Line 2049  void SSH_notify_disconnecting(PTInstVar
2049                  buffer_t *msg;                  buffer_t *msg;
2050                  unsigned char *outmsg;                  unsigned char *outmsg;
2051                  int len;                  int len;
2052                    Channel_t *c;
2053    
2054                    c = ssh2_channel_lookup(pvar->shell_id);
2055                    if (c == NULL)
2056                            return;
2057    
2058                  // SSH2 serverにchannel closeを伝える                  // SSH2 serverにchannel closeを伝える
2059                  msg = buffer_init();                  msg = buffer_init();
# Line 2024  void SSH_notify_disconnecting(PTInstVar Line 2061  void SSH_notify_disconnecting(PTInstVar
2061                          // TODO: error check                          // TODO: error check
2062                          return;                          return;
2063                  }                  }
2064                  buffer_put_int(msg, pvar->remote_id);                    buffer_put_int(msg, c->remote_id);  
2065    
2066                  len = buffer_len(msg);                  len = buffer_len(msg);
2067                  outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_CLOSE, len);                  outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_CLOSE, len);
# Line 2067  void SSH_notify_win_size(PTInstVar pvar, Line 2104  void SSH_notify_win_size(PTInstVar pvar,
2104                  char *s;                  char *s;
2105                  unsigned char *outmsg;                  unsigned char *outmsg;
2106                  int len;                  int len;
2107                    Channel_t *c;
2108    
2109                    c = ssh2_channel_lookup(pvar->shell_id);
2110                    if (c == NULL)
2111                            return;
2112    
2113                  msg = buffer_init();                  msg = buffer_init();
2114                  if (msg == NULL) {                  if (msg == NULL) {
2115                          // TODO: error check                          // TODO: error check
2116                          return;                          return;
2117                  }                  }
2118                  buffer_put_int(msg, pvar->remote_id);                    buffer_put_int(msg, c->remote_id);  
2119                  s = "window-change";                    s = "window-change";  
2120                  buffer_put_string(msg, s, strlen(s));                    buffer_put_string(msg, s, strlen(s));  
2121                  buffer_put_char(msg, 0);  // wantconfirm                  buffer_put_char(msg, 0);  // wantconfirm
# Line 2192  void SSH_send(PTInstVar pvar, unsigned c Line 2234  void SSH_send(PTInstVar pvar, unsigned c
2234                  buffer_t *msg;                  buffer_t *msg;
2235                  unsigned char *outmsg;                  unsigned char *outmsg;
2236                  int len;                  int len;
2237                    Channel_t *c;
2238    
2239                    c = ssh2_channel_lookup(pvar->shell_id);
2240                    if (c == NULL)
2241                            return;
2242    
2243                  msg = buffer_init();                  msg = buffer_init();
2244                  if (msg == NULL) {                  if (msg == NULL) {
2245                          // TODO: error check                          // TODO: error check
2246                          return;                          return;
2247                  }                  }
2248                  buffer_put_int(msg, pvar->remote_id);                    buffer_put_int(msg, c->remote_id);  
2249                  buffer_put_string(msg, (char *)buf, buflen);                    buffer_put_string(msg, (char *)buf, buflen);  
2250    
2251                  len = buffer_len(msg);                  len = buffer_len(msg);
# Line 2208  void SSH_send(PTInstVar pvar, unsigned c Line 2255  void SSH_send(PTInstVar pvar, unsigned c
2255                  buffer_free(msg);                  buffer_free(msg);
2256    
2257                  // remote window sizeの調整                  // remote window sizeの調整
2258                  pvar->remote_window -= len;                  c->remote_window -= len;
2259    
2260          }          }
2261    
# Line 2381  void SSH_end(PTInstVar pvar) Line 2428  void SSH_end(PTInstVar pvar)
2428                  pvar->session_id_len = 0;                  pvar->session_id_len = 0;
2429    
2430                  pvar->userauth_success = 0;                  pvar->userauth_success = 0;
2431                  pvar->remote_id = 0;                  //pvar->remote_id = 0;
2432                    pvar->shell_id = 0;
2433                  pvar->session_nego_status = 0;                  pvar->session_nego_status = 0;
2434    
2435                  pvar->ssh_heartbeat_tick = 0;                  pvar->ssh_heartbeat_tick = 0;
# Line 2516  void SSH_request_X11_forwarding(PTInstVa Line 2564  void SSH_request_X11_forwarding(PTInstVa
2564    
2565  void SSH_open_channel(PTInstVar pvar, uint32 local_channel_num,  void SSH_open_channel(PTInstVar pvar, uint32 local_channel_num,
2566                                            char FAR * to_remote_host, int to_remote_port,                                            char FAR * to_remote_host, int to_remote_port,
2567                                            char FAR * originator)                                            char FAR * originator, unsigned short originator_port)
2568  {  {
2569          static const int msgs[]          static const int msgs[]
2570          = { SSH_MSG_CHANNEL_OPEN_CONFIRMATION, SSH_MSG_CHANNEL_OPEN_FAILURE };          = { SSH_MSG_CHANNEL_OPEN_CONFIRMATION, SSH_MSG_CHANNEL_OPEN_FAILURE };
# Line 2539  void SSH_open_channel(PTInstVar pvar, ui Line 2587  void SSH_open_channel(PTInstVar pvar, ui
2587                  set_uint32(outmsg + 12 + host_len, originator_len);                  set_uint32(outmsg + 12 + host_len, originator_len);
2588                  memcpy(outmsg + 16 + host_len, originator, originator_len);                  memcpy(outmsg + 16 + host_len, originator, originator_len);
2589          } else {          } else {
                 unsigned char FAR *outmsg =  
                         begin_send_packet(pvar, SSH_MSG_PORT_OPEN,  
                                                           12 + host_len);  
2590    
2591                  set_uint32(outmsg, local_channel_num);                  if (SSHv1(pvar)) {
2592                  set_uint32(outmsg + 4, host_len);                          unsigned char FAR *outmsg =
2593                  memcpy(outmsg + 8, to_remote_host, host_len);                                  begin_send_packet(pvar, SSH_MSG_PORT_OPEN,
2594                  set_uint32(outmsg + 8 + host_len, to_remote_port);                                                                  12 + host_len);
2595    
2596                            set_uint32(outmsg, local_channel_num);
2597                            set_uint32(outmsg + 4, host_len);
2598                            memcpy(outmsg + 8, to_remote_host, host_len);
2599                            set_uint32(outmsg + 8 + host_len, to_remote_port);
2600    
2601                    } else {
2602                            // SSH2 port-fowarding (2005.2.26 yutaka)
2603                            buffer_t *msg;
2604                            char *s;
2605                            unsigned char *outmsg;
2606                            int len;
2607                            Channel_t *c;
2608    
2609                            c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT);
2610    
2611                            msg = buffer_init();
2612                            if (msg == NULL) {
2613                                    // TODO: error check
2614                                    return;
2615                            }
2616                            s = "direct-tcpip";
2617                            buffer_put_string(msg, s, strlen(s)); // ctype
2618                            buffer_put_int(msg, c->self_id);  // self
2619                            buffer_put_int(msg, c->local_window);  // local_window
2620                            buffer_put_int(msg, c->local_maxpacket);  // local_maxpacket
2621    
2622                            s = to_remote_host;
2623                            buffer_put_string(msg, s, strlen(s)); // target host
2624                            buffer_put_int(msg, to_remote_port);  // target port
2625    
2626                            s = originator;
2627                            buffer_put_string(msg, s, strlen(s)); // originator host
2628                            buffer_put_int(msg, originator_port);  // originator port
2629    
2630                            len = buffer_len(msg);
2631                            outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_OPEN, len);
2632                            memcpy(outmsg, buffer_ptr(msg), len);
2633                            finish_send_packet(pvar);
2634                            buffer_free(msg);
2635    
2636                            return;
2637    
2638                            /* NOT REACHED */
2639                    }
2640    
2641          }          }
2642    
2643          finish_send_packet(pvar);          if (SSHv1(pvar)) { // SSH1のみ
2644                    finish_send_packet(pvar);
2645                    enque_handlers(pvar, 2, msgs, handlers);
2646            }
2647    
         enque_handlers(pvar, 2, msgs, handlers);  
2648  }  }
2649    
2650    
# Line 2648  static Newkeys current_keys[MODE_MAX]; Line 2741  static Newkeys current_keys[MODE_MAX];
2741  #define write_buffer_file(buf,len) do_write_buffer_file(buf,len,__FILE__,__LINE__)  #define write_buffer_file(buf,len) do_write_buffer_file(buf,len,__FILE__,__LINE__)
2742    
2743    
2744    //
2745    // general
2746    //
2747    
2748  static int get_cipher_block_size(SSHCipher cipher)  static int get_cipher_block_size(SSHCipher cipher)
2749  {  {
2750          ssh2_cipher_t *ptr = ssh2_ciphers;          ssh2_cipher_t *ptr = ssh2_ciphers;
# Line 4980  static BOOL handle_SSH2_userauth_success Line 5077  static BOOL handle_SSH2_userauth_success
5077          char *s;          char *s;
5078          unsigned char *outmsg;          unsigned char *outmsg;
5079          int len;          int len;
5080            Channel_t *c;
5081    
5082          // 認証OK          // 認証OK
5083          pvar->userauth_success = 1;          pvar->userauth_success = 1;
5084    
5085            // ポートフォワーディングの準備 (2005.2.26 yutaka)
5086            FWD_enter_interactive_mode(pvar);
5087    
5088          // ディスパッチルーチンの再設定          // ディスパッチルーチンの再設定
5089          do_SSH2_dispatch_setup_for_transfer();          do_SSH2_dispatch_setup_for_transfer();
5090    
5091    
5092          // チャネル設定          // チャネル設定
5093          pvar->local_window = CHAN_SES_WINDOW_DEFAULT;          c = ssh2_channel_new(CHAN_SES_WINDOW_DEFAULT, CHAN_SES_PACKET_DEFAULT);
5094          pvar->local_window_max = CHAN_SES_WINDOW_DEFAULT;          if (c == NULL) {
5095          pvar->local_consumed = 0;                  // TODO: error check
5096          pvar->local_maxpacket = CHAN_SES_PACKET_DEFAULT;                  return FALSE;
5097          pvar->remote_window = 0;          }
         pvar->remote_maxpacket = 0;  
5098    
5099            // シェルのIDを取っておく
5100            pvar->shell_id = c->self_id;
5101    
5102          // シェルオープン          // シェルオープン
5103          msg = buffer_init();          msg = buffer_init();
# Line 5005  static BOOL handle_SSH2_userauth_success Line 5107  static BOOL handle_SSH2_userauth_success
5107          }          }
5108          s = "session";          s = "session";
5109          buffer_put_string(msg, s, strlen(s));  // ctype          buffer_put_string(msg, s, strlen(s));  // ctype
5110          buffer_put_int(msg, 0);  // self          buffer_put_int(msg, c->self_id);  // self(channel number)
5111          buffer_put_int(msg, pvar->local_window);  // local_window          buffer_put_int(msg, c->local_window);  // local_window
5112          buffer_put_int(msg, pvar->local_maxpacket);  // local_maxpacket          buffer_put_int(msg, c->local_maxpacket);  // local_maxpacket
5113          len = buffer_len(msg);          len = buffer_len(msg);
5114          outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_OPEN, len);          outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_OPEN, len);
5115          memcpy(outmsg, buffer_ptr(msg), len);          memcpy(outmsg, buffer_ptr(msg), len);
# Line 5174  static BOOL handle_SSH2_open_confirm(PTI Line 5276  static BOOL handle_SSH2_open_confirm(PTI
5276          int len;          int len;
5277          char *data;          char *data;
5278          int id, remote_id;          int id, remote_id;
5279            Channel_t *c;
5280  #ifdef DONT_WANTCONFIRM  #ifdef DONT_WANTCONFIRM
5281          int wantconfirm = 0; // false          int wantconfirm = 0; // false
5282  #else  #else
# Line 5187  static BOOL handle_SSH2_open_confirm(PTI Line 5290  static BOOL handle_SSH2_open_confirm(PTI
5290    
5291          id = get_uint32_MSBfirst(data);          id = get_uint32_MSBfirst(data);
5292          data += 4;          data += 4;
5293    
5294            c = ssh2_channel_lookup(id);
5295            if (c == NULL) {
5296                    // TODO:
5297                    return FALSE;
5298            }
5299    
5300          // TODO: id check          // TODO: id check
5301          remote_id = get_uint32_MSBfirst(data);          remote_id = get_uint32_MSBfirst(data);
5302          data += 4;          data += 4;
5303    
5304          pvar->remote_id = remote_id;          c->remote_id = remote_id;
5305          pvar->session_nego_status = 1;            pvar->session_nego_status = 1;  
5306    
5307          // remote window size          // remote window size
5308          pvar->remote_window = get_uint32_MSBfirst(data);          c->remote_window = get_uint32_MSBfirst(data);
5309          data += 4;          data += 4;
5310          pvar->remote_maxpacket = get_uint32_MSBfirst(data);          c->remote_maxpacket = get_uint32_MSBfirst(data);
5311          data += 4;          data += 4;
5312    
5313          //debug_print(100, data, len);          //debug_print(100, data, len);
# Line 5248  static BOOL handle_SSH2_channel_success( Line 5358  static BOOL handle_SSH2_channel_success(
5358          char *s;          char *s;
5359          unsigned char *outmsg;          unsigned char *outmsg;
5360          int len;          int len;
5361            Channel_t *c;
5362    
5363          {          {
5364          char buf[128];          char buf[128];
# Line 5268  static BOOL handle_SSH2_channel_success( Line 5379  static BOOL handle_SSH2_channel_success(
5379                          // TODO: error check                          // TODO: error check
5380                          return FALSE;                          return FALSE;
5381                  }                  }
5382                  buffer_put_int(msg, pvar->remote_id);                    // find channel by shell id(2005.2.27 yutaka)
5383                    c = ssh2_channel_lookup(pvar->shell_id);
5384                    if (c == NULL) {
5385                            // TODO: error check
5386                            return FALSE;
5387                    }
5388                    buffer_put_int(msg, c->remote_id);  
5389    //              buffer_put_int(msg, pvar->remote_id);  
5390    
5391                  s = "shell";                  s = "shell";
5392                  buffer_put_string(msg, s, strlen(s));  // ctype                  buffer_put_string(msg, s, strlen(s));  // ctype
5393                  buffer_put_char(msg, wantconfirm);   // wantconfirm (disableに変更 2005/3/28 yutaka)                  buffer_put_char(msg, wantconfirm);   // wantconfirm (disableに変更 2005/3/28 yutaka)
# Line 5296  static BOOL handle_SSH2_channel_success( Line 5415  static BOOL handle_SSH2_channel_success(
5415  }  }
5416    
5417    
5418    
5419    // クライアントのwindow sizeをサーバへ知らせる
5420    static void do_SSH2_adjust_window_size(PTInstVar pvar, Channel_t *c)
5421    {
5422            const unsigned int window_size = CHAN_SES_PACKET_DEFAULT;
5423            buffer_t *msg;
5424            unsigned char *outmsg;
5425            int len;
5426    
5427            // ローカルのwindow sizeにまだ余裕があるなら、何もしない。
5428            if (c->local_window > window_size)
5429                    return;
5430    
5431            {
5432                    // pty open
5433                    msg = buffer_init();
5434                    if (msg == NULL) {
5435                            // TODO: error check
5436                            return;
5437                    }
5438                    buffer_put_int(msg, c->remote_id);  
5439                    buffer_put_int(msg, window_size - c->local_window);  
5440    
5441                    len = buffer_len(msg);
5442                    outmsg = begin_send_packet(pvar, SSH2_MSG_CHANNEL_WINDOW_ADJUST, len);
5443                    memcpy(outmsg, buffer_ptr(msg), len);
5444                    finish_send_packet(pvar);
5445                    buffer_free(msg);
5446    
5447                    // クライアントのwindow sizeを増やす
5448                    c->local_window = window_size;
5449            }
5450    
5451    }
5452    
5453  static BOOL handle_SSH2_channel_data(PTInstVar pvar)  static BOOL handle_SSH2_channel_data(PTInstVar pvar)
5454  {        {      
5455          int len;          int len;
5456          char *data;          char *data;
5457          int id;          int id;
5458          unsigned int strlen;          unsigned int strlen;
5459            Channel_t *c;
5460    
5461          // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード          // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード
5462          data = pvar->ssh_state.payload;          data = pvar->ssh_state.payload;
# Line 5313  static BOOL handle_SSH2_channel_data(PTI Line 5468  static BOOL handle_SSH2_channel_data(PTI
5468          // channel number          // channel number
5469          id = get_uint32_MSBfirst(data);          id = get_uint32_MSBfirst(data);
5470          data += 4;          data += 4;
5471    
5472            c = ssh2_channel_lookup(id);
5473            if (c == NULL) {
5474                    // TODO:
5475                    return FALSE;
5476            }
5477    
5478          // string length          // string length
5479          strlen = get_uint32_MSBfirst(data);          strlen = get_uint32_MSBfirst(data);
5480          data += 4;          data += 4;
5481    
5482          // バッファサイズのチェック          // バッファサイズのチェック
5483          if (strlen > pvar->local_window_max) {          if (strlen > c->local_window_max) {
5484                  // TODO: logging                  // TODO: logging
5485          }          }
5486          if (strlen > pvar->local_window) {          if (strlen > c->local_window) {
5487                  // TODO: logging                  // TODO: logging
5488                  // local window sizeより大きなパケットは捨てる                  // local window sizeより大きなパケットは捨てる
5489                  return FALSE;                  return FALSE;
# Line 5334  static BOOL handle_SSH2_channel_data(PTI Line 5496  static BOOL handle_SSH2_channel_data(PTI
5496          //debug_print(200, data, strlen);          //debug_print(200, data, strlen);
5497    
5498          // ウィンドウサイズの調整          // ウィンドウサイズの調整
5499          pvar->local_window -= strlen;          c->local_window -= strlen;
5500    
5501          do_SSH2_adjust_window_size(pvar);          do_SSH2_adjust_window_size(pvar, c);
5502    
5503          return TRUE;          return TRUE;
5504  }  }
# Line 5400  static BOOL handle_SSH2_channel_request( Line 5562  static BOOL handle_SSH2_channel_request(
5562          int success = 0;          int success = 0;
5563          char *emsg = "exit-status";          char *emsg = "exit-status";
5564          int estat = 0;          int estat = 0;
5565            Channel_t *c;
5566    
5567          // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード          // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード
5568          data = pvar->ssh_state.payload;          data = pvar->ssh_state.payload;
# Line 5411  static BOOL handle_SSH2_channel_request( Line 5574  static BOOL handle_SSH2_channel_request(
5574          // ID(4) + string(any) + reply(1) + exit status(4)          // ID(4) + string(any) + reply(1) + exit status(4)
5575          id = get_uint32_MSBfirst(data);          id = get_uint32_MSBfirst(data);
5576          data += 4;          data += 4;
5577            c = ssh2_channel_lookup(id);
5578            if (c == NULL) {
5579                    // TODO:
5580                    return FALSE;
5581            }
5582    
5583          buflen = get_uint32_MSBfirst(data);          buflen = get_uint32_MSBfirst(data);
5584          data += 4;          data += 4;
# Line 5443  static BOOL handle_SSH2_channel_request( Line 5611  static BOOL handle_SSH2_channel_request(
5611                          // TODO: error check                          // TODO: error check
5612                          return FALSE;                          return FALSE;
5613                  }                  }
5614                  buffer_put_int(msg, pvar->remote_id);                    buffer_put_int(msg, c->remote_id);  
5615    
5616                  len = buffer_len(msg);                  len = buffer_len(msg);
5617                  outmsg = begin_send_packet(pvar, type, len);                  outmsg = begin_send_packet(pvar, type, len);
# Line 5462  static BOOL handle_SSH2_window_adjust(PT Line 5630  static BOOL handle_SSH2_window_adjust(PT
5630          char *data;          char *data;
5631          int id;          int id;
5632          unsigned int adjust;          unsigned int adjust;
5633            Channel_t *c;
5634    
5635          // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード          // 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード
5636          data = pvar->ssh_state.payload;          data = pvar->ssh_state.payload;
# Line 5474  static BOOL handle_SSH2_window_adjust(PT Line 5643  static BOOL handle_SSH2_window_adjust(PT
5643          id = get_uint32_MSBfirst(data);          id = get_uint32_MSBfirst(data);
5644          data += 4;          data += 4;
5645    
5646            c = ssh2_channel_lookup(id);
5647            if (c == NULL)
5648                    return FALSE;
5649    
5650          adjust = get_uint32_MSBfirst(data);          adjust = get_uint32_MSBfirst(data);
5651          data += 4;          data += 4;
5652    
5653          // window sizeの調整          // window sizeの調整
5654          pvar->remote_window += adjust;          c->remote_window += adjust;
5655    
5656          return TRUE;          return TRUE;
5657  }  }
5658    
5659  /*  /*
5660   * $Log: not supported by cvs2svn $   * $Log: not supported by cvs2svn $
5661     * Revision 1.24  2005/03/28 13:52:05  yutakakn
5662     * SSH2_MSG_CHANNEL_REQUEST送信時において、wantconfirmをfalseにした(サーバからのリプライを期待しない)。
5663     * NetScreen(HITACHI) workaround対応。
5664     *
5665   * Revision 1.23  2005/03/27 04:39:55  yutakakn   * Revision 1.23  2005/03/27 04:39:55  yutakakn
5666   * SSH2のログ採取(verbose)のデータを追加した。   * SSH2のログ採取(verbose)のデータを追加した。
5667   *   *

Legend:
Removed from v.2806  
changed lines
  Added in v.2809

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