| 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; /* ロック用変数 */ |
| 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) |
| 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); |
| 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 |
{ |
{ |
| 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(); |
| 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); |
| 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 |
| 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); |
| 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 |
|
|
| 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; |
| 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 }; |
| 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 |
|
|
| 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; |
| 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(); |
| 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); |
| 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 |
| 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); |
| 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]; |
| 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) |
| 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; |
| 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; |
| 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 |
} |
} |
| 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; |
| 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; |
| 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); |
| 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; |
| 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 |
* |
* |