Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/ttssh2/ttxssh/pkt.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6841 - (hide annotations) (download) (as text)
Tue Jul 4 15:02:28 2017 UTC (6 years, 8 months ago) by doda
File MIME type: text/x-csrc
File size: 9166 byte(s)
TeraTerm Project としてのライセンス表記を追加

・Tera Term 本体分を横 80 桁に収まるように改行位置を調整
・ttssh 関連の分を追加
1 maya 3227 /*
2 doda 6841 * Copyright (c) 1998-2001, Robert O'Callahan
3     * (C) 2004-2017 TeraTerm Project
4     * All rights reserved.
5     *
6     * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9     *
10     * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17     *
18     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (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 maya 3227
30     /*
31     This code is copyright (C) 1998-1999 Robert O'Callahan.
32     See LICENSE.TXT for the license.
33     */
34    
35     #include "ttxssh.h"
36     #include "util.h"
37     #include "pkt.h"
38    
39     //#define READAMOUNT 60000
40     // 60000 -> 65536 ���g���BSSH2����window�������s�������ASSH2��window size��
41     // �������������K�v�������B(2004.10.17 yutaka)
42     //#define READAMOUNT 65536
43     // 65536 -> 131072 ���g���B(2007.10.29 maya)
44     #define READAMOUNT CHAN_SES_WINDOW_DEFAULT
45    
46     void PKT_init(PTInstVar pvar)
47     {
48     buf_create(&pvar->pkt_state.buf, &pvar->pkt_state.buflen);
49     pvar->pkt_state.datastart = 0;
50     pvar->pkt_state.datalen = 0;
51     pvar->pkt_state.seen_server_ID = FALSE;
52     pvar->pkt_state.seen_newline = FALSE;
53     pvar->pkt_state.predecrypted_packet = FALSE;
54     }
55    
56     /* Read some data, leave no more than up_to_amount bytes in the buffer,
57     return the number of bytes read or -1 on error or blocking. */
58     static int recv_data(PTInstVar pvar, unsigned long up_to_amount)
59     {
60     int amount_read;
61    
62     /* Shuffle data to the start of the buffer */
63     if (pvar->pkt_state.datastart != 0) {
64     memmove(pvar->pkt_state.buf,
65     pvar->pkt_state.buf + pvar->pkt_state.datastart,
66     pvar->pkt_state.datalen);
67     pvar->pkt_state.datastart = 0;
68     }
69    
70     buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
71     up_to_amount);
72    
73     _ASSERT(pvar->pkt_state.buf != NULL);
74    
75     amount_read = (pvar->Precv) (pvar->socket,
76     pvar->pkt_state.buf +
77     pvar->pkt_state.datalen,
78     up_to_amount - pvar->pkt_state.datalen,
79     0);
80    
81     if (amount_read > 0) {
82     /* Update seen_newline if necessary */
83     if (!pvar->pkt_state.seen_server_ID
84     && !pvar->pkt_state.seen_newline) {
85     int i;
86    
87     for (i = 0; i < amount_read; i++) {
88     if (pvar->pkt_state.buf[pvar->pkt_state.datalen + i] ==
89     '\n') {
90     pvar->pkt_state.seen_newline = 1;
91     }
92     }
93     }
94    
95     pvar->pkt_state.datalen += amount_read;
96     }
97    
98     return amount_read;
99     }
100    
101    
102     // ���s�R�[�h���o��������������
103     static int recv_line_data(PTInstVar pvar)
104     {
105     int amount_read;
106     char buf[256];
107     size_t up_to_amount = sizeof(buf);
108     int i;
109    
110     /* Shuffle data to the start of the buffer */
111     if (pvar->pkt_state.datastart != 0) {
112     memmove(pvar->pkt_state.buf,
113     pvar->pkt_state.buf + pvar->pkt_state.datastart,
114     pvar->pkt_state.datalen);
115     pvar->pkt_state.datastart = 0;
116     }
117    
118     buf_ensure_size(&pvar->pkt_state.buf, &pvar->pkt_state.buflen,
119     up_to_amount);
120    
121     for (i = 0 ; i < (int)up_to_amount ; i++) {
122     amount_read = (pvar->Precv) (pvar->socket,
123     &buf[i], 1, 0);
124     if (amount_read != 1) {
125     return 0; // error
126     }
127    
128     pvar->pkt_state.datalen += amount_read;
129    
130     if (buf[i] == '\n') { // 0x0a
131     buf[i+1] = 0;
132     break;
133     }
134     }
135     amount_read = i + 1; // ���������T�C�Y�iLF�������j
136     memcpy(pvar->pkt_state.buf, buf, amount_read);
137    
138     pvar->pkt_state.seen_newline = 1;
139    
140     return amount_read;
141     }
142    
143    
144     /* This function does two things:
145     -- reads data from the sshd and feeds the SSH protocol packets to ssh.c
146     -- copies any available decrypted session data into the application buffer
147     */
148 doda 6801 int PKT_recv(PTInstVar pvar, char *buf, int buflen)
149 maya 3227 {
150     int amount_in_buf = 0;
151     BOOL connection_closed = FALSE;
152    
153     while (SSH_is_any_payload(pvar) ? buflen > 0 : !connection_closed) {
154     if (SSH_is_any_payload(pvar)) {
155     /* ssh.c has some session data for us to give to Tera Term. */
156     int grabbed = SSH_extract_payload(pvar, buf, buflen);
157    
158     amount_in_buf += grabbed;
159     buf += grabbed;
160     buflen -= grabbed;
161    
162     } else if (!pvar->pkt_state.seen_server_ID &&
163     (pvar->pkt_state.seen_newline
164     || pvar->pkt_state.datalen >= 255)) {
165     /* We're looking for the initial ID string and either we've seen the
166     terminating newline, or we've exceeded the limit at which we should see
167     a newline. */
168     unsigned int i;
169    
170     for (i = 0;
171     pvar->pkt_state.buf[i] != '\n'
172     && i < pvar->pkt_state.datalen; i++) {
173     }
174     if (pvar->pkt_state.buf[i] == '\n') {
175     i++;
176     }
177    
178     // SSH�T�[�o���o�[�W�����`�F�b�N���s��
179     if (SSH_handle_server_ID(pvar, pvar->pkt_state.buf, i)) {
180     pvar->pkt_state.seen_server_ID = 1;
181    
182     if (SSHv1(pvar)) {
183    
184     } else { // for SSH2(yutaka)
185     // send Key Exchange Init
186     SSH2_send_kexinit(pvar);
187     }
188    
189 maya 4549 } else {
190     // reset flag to re-read server ID (2008.1.24 yutaka)
191     pvar->pkt_state.seen_newline = 0;
192 maya 3227
193     }
194    
195     pvar->pkt_state.datastart += i;
196     pvar->pkt_state.datalen -= i;
197    
198     } else if (pvar->pkt_state.seen_server_ID
199     && pvar->pkt_state.datalen >=
200     (unsigned int) SSH_get_min_packet_size(pvar)) {
201 doda 6801 char *data =
202 maya 3227 pvar->pkt_state.buf + pvar->pkt_state.datastart;
203     uint32 padding;
204     uint32 pktsize;
205     uint32 total_packet_size;
206    
207     //debug_print(10, data, pvar->pkt_state.datalen);
208    
209 doda 6771 // �������p�P�b�g�������������������B
210 maya 3227 if (!pvar->pkt_state.predecrypted_packet) {
211     SSH_predecrpyt_packet(pvar, data);
212 doda 6771 pvar->pkt_state.predecrypted_packet = TRUE;
213 maya 3227 }
214    
215     if (SSHv1(pvar)) {
216     uint32 realpktsize = get_uint32_MSBfirst(data);
217    
218     padding = 8 - (realpktsize % 8);
219     pktsize = realpktsize + padding;
220     } else {
221     // SSH2���p�P�b�g�������� packet-size(4)+padding(1)+type(1) �������B
222     pktsize = get_uint32_MSBfirst(data);
223     padding = (unsigned char) data[4];
224     }
225    
226     // �p�P�b�g(TCP�y�C���[�h)���S�����T�C�Y���ASSH�y�C���[�h�{4�i�{MAC�j�������B
227     // +4���ASSH�y�C���[�h���T�C�Y���i�[�������������iint�^�j�B
228     total_packet_size = pktsize + 4 + SSH_get_clear_MAC_size(pvar);
229    
230     if (total_packet_size <= pvar->pkt_state.datalen) {
231     /* the data must be 4 byte aligned. */
232     SSH_handle_packet(pvar, data, pktsize, padding);
233     pvar->pkt_state.predecrypted_packet = FALSE;
234    
235     pvar->pkt_state.datastart += total_packet_size;
236     pvar->pkt_state.datalen -= total_packet_size;
237    
238     } else if (total_packet_size > PACKET_MAX_SIZE) {
239     // 4MB���������������p�P�b�g�����������A�����I�������B
240     // ���������f�[�^�������������s�����A���F�����������������B
241     UTIL_get_lang_msg("MSG_PKT_OVERSIZED_ERROR", pvar,
242 maya 4549 "Oversized packet received from server; connection will close.");
243 maya 5678 notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
244 maya 3227 } else {
245     int amount_read =
246     recv_data(pvar, max(total_packet_size, READAMOUNT));
247    
248     if (amount_read == SOCKET_ERROR) {
249     if (amount_in_buf == 0) {
250     return SOCKET_ERROR;
251     } else {
252     return amount_in_buf;
253     }
254     } else {
255     if (amount_read == 0) {
256     connection_closed = TRUE;
257     }
258     }
259     }
260    
261    
262     } else {
263     // �p�P�b�g�����M�i����60KB�j
264     int amount_read;
265    
266     if (pvar->pkt_state.seen_server_ID == 0) {
267     //amount_read = recv_line_data(pvar);
268     amount_read = recv_data(pvar, READAMOUNT);
269    
270     } else {
271     amount_read = recv_data(pvar, READAMOUNT);
272    
273     }
274    
275     if (amount_read == SOCKET_ERROR) {
276     if (amount_in_buf == 0) {
277     return SOCKET_ERROR;
278     } else {
279     return amount_in_buf;
280     }
281     } else if (amount_read == 0) {
282     connection_closed = TRUE;
283     }
284     }
285    
286     if (pvar->fatal_error) {
287     return amount_in_buf;
288     }
289     }
290    
291     if (SSH_is_any_payload(pvar)) {
292     PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
293     pvar->socket, MAKELPARAM(FD_READ, 0));
294     }
295    
296     return amount_in_buf;
297     }
298    
299     void PKT_end(PTInstVar pvar)
300     {
301     buf_destroy(&pvar->pkt_state.buf, &pvar->pkt_state.buflen);
302     }

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