Coverage Report

Created: 2026-09-04 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libssh2/src/packet.c
Line
Count
Source
1
/* Copyright (C) Sara Golemon <sarag@libssh2.org>
2
 * Copyright (C) Mikhail Gusarov
3
 * Copyright (C) Daniel Stenberg
4
 * Copyright (C) Simon Josefsson
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions are met:
9
 *
10
 * 1. Redistributions of source code must retain the above copyright notice,
11
 *    this list of conditions and the following disclaimer.
12
 *
13
 * 2. Redistributions in binary form must reproduce the above copyright notice,
14
 *    this list of conditions and the following disclaimer in the documentation
15
 *    and/or other materials provided with the distribution.
16
 *
17
 * 3. Neither the name of the copyright holder nor the names of its
18
 *    contributors may be used to endorse or promote products derived from this
19
 *    software without specific prior written permission.
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
 * POSSIBILITY OF SUCH DAMAGE.
32
 *
33
 * SPDX-License-Identifier: BSD-3-Clause
34
 */
35
36
#include "libssh2_priv.h"
37
38
#ifdef HAVE_UNISTD_H
39
#include <unistd.h>
40
#endif
41
42
#include "transport.h"
43
#include "channel.h"
44
#include "packet.h"
45
46
/*
47
 * Queue a connection request for a listener
48
 */
49
static SSH2_INLINE int packet_queue_listener(
50
    LIBSSH2_SESSION *session,
51
    unsigned char *data, size_t datalen,
52
    struct packet_queue_listener_state *listen_state)
53
255
{
54
    /*
55
     * Look for a matching listener
56
     */
57
    /* 17 = packet_type(1) + channel(4) + reason(4) + descr(4) + lang(4) */
58
255
    size_t packet_len = 17 + strlen(FwdNotReq);
59
255
    unsigned char *p;
60
255
    LIBSSH2_LISTENER *listn = ssh2_list_first(&session->listeners);
61
255
    uint32_t failure_code = SSH_OPEN_ADMINISTRATIVELY_PROHIBITED;
62
255
    int rc;
63
64
255
    if(listen_state->state == ssh2_NB_state_idle) {
65
255
        size_t offset = sizeof("forwarded-tcpip") - 1 + 5;
66
255
        size_t temp_len = 0;
67
255
        struct string_buf buf;
68
255
        buf.data = data;
69
255
        buf.dataptr = buf.data;
70
255
        buf.len = datalen;
71
72
255
        if(datalen < offset + 12) /* 3 * 4-byte */
73
5
            return ssh2_err(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY,
74
5
                            "Unexpected packet size");
75
76
250
        buf.dataptr += offset;
77
78
250
        if(ssh2_get_u32(&buf, &listen_state->sender_channel))
79
0
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
80
0
                            "Data too short extracting channel");
81
250
        if(ssh2_get_u32(&buf, &listen_state->initial_window_size))
82
0
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
83
0
                            "Data too short extracting window size");
84
250
        if(ssh2_get_u32(&buf, &listen_state->packet_size))
85
0
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
86
0
                            "Data too short extracting packet");
87
250
        if(ssh2_get_string(&buf, &listen_state->host, &temp_len))
88
26
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
89
26
                            "Data too short extracting host");
90
224
        listen_state->host_len = (uint32_t)temp_len;
91
92
224
        if(ssh2_get_u32(&buf, &listen_state->port))
93
1
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
94
1
                            "Data too short extracting port");
95
223
        if(ssh2_get_string(&buf, &listen_state->shost, &temp_len))
96
7
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
97
7
                            "Data too short extracting shost");
98
216
        listen_state->shost_len = (uint32_t)temp_len;
99
100
216
        if(ssh2_get_u32(&buf, &listen_state->sport))
101
5
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
102
5
                            "Data too short extracting sport");
103
104
211
        ssh2_deb((session, LIBSSH2_TRACE_CONN,
105
211
                  "Remote received connection from %.*s:%u to %.*s:%u",
106
211
                  (int)listen_state->shost_len, listen_state->shost,
107
211
                  listen_state->sport,
108
211
                  (int)listen_state->host_len, listen_state->host,
109
211
                  listen_state->port));
110
111
211
        listen_state->state = ssh2_NB_state_allocated;
112
211
    }
113
114
211
    if(listen_state->state != ssh2_NB_state_sent) {
115
211
        while(listn) {
116
0
            if(listn->port == (int)listen_state->port &&
117
0
               strlen(listn->host) == listen_state->host_len &&
118
0
               !memcmp(listn->host, listen_state->host,
119
0
                       listen_state->host_len)) {
120
                /* This is our listener */
121
0
                LIBSSH2_CHANNEL *channel = NULL;
122
0
                listen_state->channel = NULL;
123
124
0
                if(listen_state->state == ssh2_NB_state_allocated) {
125
0
                    if(listn->queue_maxsize &&
126
0
                       (listn->queue_maxsize <= listn->queue_size)) {
127
                        /* Queue is full */
128
0
                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
129
0
                        ssh2_deb((session, LIBSSH2_TRACE_CONN,
130
0
                                  "Listener queue full, ignoring"));
131
0
                        listen_state->state = ssh2_NB_state_sent;
132
0
                        break;
133
0
                    }
134
135
0
                    channel = SSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));
136
0
                    if(!channel) {
137
0
                        ssh2_err(session, LIBSSH2_ERROR_ALLOC,
138
0
                                 "Unable to allocate a channel for "
139
0
                                 "new connection");
140
0
                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
141
0
                        listen_state->state = ssh2_NB_state_sent;
142
0
                        break;
143
0
                    }
144
0
                    listen_state->channel = channel;
145
146
0
                    channel->session = session;
147
0
                    channel->channel_type_len = sizeof("forwarded-tcpip") - 1;
148
0
                    channel->channel_type =
149
0
                        SSH2_ALLOC(session, channel->channel_type_len + 1);
150
0
                    if(!channel->channel_type) {
151
0
                        ssh2_err(session, LIBSSH2_ERROR_ALLOC,
152
0
                                 "Unable to allocate a channel for "
153
0
                                 "new connection");
154
0
                        SSH2_FREE(session, channel);
155
0
                        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
156
0
                        listen_state->state = ssh2_NB_state_sent;
157
0
                        break;
158
0
                    }
159
0
                    memcpy(channel->channel_type, "forwarded-tcpip",
160
0
                           channel->channel_type_len + 1);
161
162
0
                    channel->remote.id = listen_state->sender_channel;
163
0
                    channel->remote.window_size_initial =
164
0
                        LIBSSH2_CHANNEL_WINDOW_DEFAULT;
165
0
                    channel->remote.window_size =
166
0
                        LIBSSH2_CHANNEL_WINDOW_DEFAULT;
167
0
                    channel->remote.packet_size =
168
0
                        LIBSSH2_CHANNEL_PACKET_DEFAULT;
169
170
0
                    channel->local.id = ssh2_channel_nextid(session);
171
0
                    channel->local.window_size_initial =
172
0
                        listen_state->initial_window_size;
173
0
                    channel->local.window_size =
174
0
                        listen_state->initial_window_size;
175
0
                    channel->local.packet_size = listen_state->packet_size;
176
177
0
                    ssh2_deb((session, LIBSSH2_TRACE_CONN,
178
0
                              "Connection queued: channel %u/%u "
179
0
                              "win %u/%u packet %u/%u",
180
0
                              channel->local.id, channel->remote.id,
181
0
                              channel->local.window_size,
182
0
                              channel->remote.window_size,
183
0
                              channel->local.packet_size,
184
0
                              channel->remote.packet_size));
185
186
0
                    p = listen_state->packet;
187
0
                    *(p++) = SSH_MSG_CHANNEL_OPEN_CONFIRMATION;
188
0
                    ssh2_store_u32(&p, channel->remote.id);
189
0
                    ssh2_store_u32(&p, channel->local.id);
190
0
                    ssh2_store_u32(&p, channel->remote.window_size_initial);
191
0
                    ssh2_store_u32(&p, channel->remote.packet_size);
192
193
0
                    listen_state->state = ssh2_NB_state_created;
194
0
                }
195
196
0
                if(listen_state->state == ssh2_NB_state_created) {
197
0
                    rc = ssh2_transport_send(session, listen_state->packet,
198
0
                                             17, NULL, 0);
199
0
                    if(rc == LIBSSH2_ERROR_EAGAIN)
200
0
                        return rc;
201
0
                    else if(rc) {
202
0
                        listen_state->state = ssh2_NB_state_idle;
203
0
                        return ssh2_err(session, rc,
204
0
                                        "Unable to send channel "
205
0
                                        "open confirmation");
206
0
                    }
207
208
                    /* Link the channel into the end of the queue list */
209
0
                    if(listen_state->channel) {
210
0
                        ssh2_list_add(&listn->queue,
211
0
                                      &listen_state->channel->node);
212
0
                        listn->queue_size++;
213
0
                    }
214
215
0
                    listen_state->state = ssh2_NB_state_idle;
216
0
                    return 0;
217
0
                }
218
0
            }
219
220
0
            listn = ssh2_list_next(&listn->node);
221
0
        }
222
223
211
        listen_state->state = ssh2_NB_state_sent;
224
211
    }
225
226
    /* We are not listening to you */
227
211
    p = listen_state->packet;
228
211
    *(p++) = SSH_MSG_CHANNEL_OPEN_FAILURE;
229
211
    ssh2_store_u32(&p, listen_state->sender_channel);
230
211
    ssh2_store_u32(&p, failure_code);
231
211
    ssh2_store_str(&p, FwdNotReq, strlen(FwdNotReq));
232
211
    ssh2_htonu32(p, 0);
233
234
211
    rc = ssh2_transport_send(session, listen_state->packet,
235
211
                             packet_len, NULL, 0);
236
211
    if(rc == LIBSSH2_ERROR_EAGAIN)
237
0
        return rc;
238
211
    else if(rc) {
239
0
        listen_state->state = ssh2_NB_state_idle;
240
0
        return ssh2_err(session, rc, "Unable to send open failure");
241
0
    }
242
211
    listen_state->state = ssh2_NB_state_idle;
243
211
    return 0;
244
211
}
245
246
/*
247
 * Accept a forwarded X11 connection
248
 */
249
static SSH2_INLINE int packet_x11_open(
250
    LIBSSH2_SESSION *session,
251
    unsigned char *data, size_t datalen,
252
    struct packet_x11_open_state *x11open_state)
253
1.09k
{
254
1.09k
    uint32_t failure_code = SSH_OPEN_CONNECT_FAILED;
255
    /* 17 = packet_type(1) + channel(4) + reason(4) + descr(4) + lang(4) */
256
1.09k
    size_t packet_len = 17 + strlen(X11FwdUnAvil);
257
1.09k
    unsigned char *p;
258
1.09k
    LIBSSH2_CHANNEL *channel = x11open_state->channel;
259
1.09k
    int rc;
260
261
1.09k
    if(x11open_state->state == ssh2_NB_state_idle) {
262
1.09k
        size_t offset = sizeof("x11") - 1 + 5;
263
1.09k
        size_t temp_len = 0;
264
1.09k
        unsigned char *temp_buf = NULL;
265
1.09k
        struct string_buf buf;
266
1.09k
        buf.data = data;
267
1.09k
        buf.dataptr = buf.data;
268
1.09k
        buf.len = datalen;
269
270
1.09k
        if(datalen < offset + 12) { /* 3 * 4-byte */
271
295
            ssh2_err(session, LIBSSH2_ERROR_INVAL, "unexpected data length");
272
295
            failure_code = SSH_OPEN_CONNECT_FAILED;
273
295
            goto x11_exit;
274
295
        }
275
276
804
        buf.dataptr += offset;
277
278
804
        if(ssh2_get_u32(&buf, &x11open_state->sender_channel)) {
279
0
            ssh2_err(session, LIBSSH2_ERROR_INVAL,
280
0
                     "unexpected sender channel size");
281
0
            failure_code = SSH_OPEN_CONNECT_FAILED;
282
0
            goto x11_exit;
283
0
        }
284
804
        if(ssh2_get_u32(&buf, &x11open_state->initial_window_size)) {
285
0
            ssh2_err(session, LIBSSH2_ERROR_INVAL, "unexpected window size");
286
0
            failure_code = SSH_OPEN_CONNECT_FAILED;
287
0
            goto x11_exit;
288
0
        }
289
804
        if(ssh2_get_u32(&buf, &x11open_state->packet_size)) {
290
0
            ssh2_err(session, LIBSSH2_ERROR_INVAL, "unexpected packet size");
291
0
            failure_code = SSH_OPEN_CONNECT_FAILED;
292
0
            goto x11_exit;
293
0
        }
294
295
804
        if(ssh2_get_string(&buf, &temp_buf, &temp_len)) {
296
343
            ssh2_err(session, LIBSSH2_ERROR_INVAL, "unexpected host size");
297
343
            failure_code = SSH_OPEN_CONNECT_FAILED;
298
343
            goto x11_exit;
299
343
        }
300
461
        x11open_state->shost_len = (uint32_t)temp_len;
301
461
        x11open_state->shost =
302
461
            SSH2_ALLOC(session, x11open_state->shost_len + 1);
303
461
        if(!x11open_state->shost) {
304
0
            ssh2_err(session, LIBSSH2_ERROR_ALLOC,
305
0
                     "Unable to allocate memory for shost");
306
0
            failure_code = SSH_OPEN_CONNECT_FAILED;
307
0
            goto x11_exit;
308
0
        }
309
461
        memcpy(x11open_state->shost, temp_buf, x11open_state->shost_len);
310
461
        x11open_state->shost[x11open_state->shost_len] = '\0';
311
312
461
        if(ssh2_get_u32(&buf, &x11open_state->sport)) {
313
249
            ssh2_err(session, LIBSSH2_ERROR_INVAL, "unexpected port size");
314
249
            failure_code = SSH_OPEN_CONNECT_FAILED;
315
249
            goto x11_exit;
316
249
        }
317
318
212
        ssh2_deb((session, LIBSSH2_TRACE_CONN,
319
212
                  "X11 Connection Received from %s:%u on channel %u",
320
212
                  x11open_state->shost, x11open_state->sport,
321
212
                  x11open_state->sender_channel));
322
323
212
        x11open_state->state = ssh2_NB_state_allocated;
324
212
    }
325
326
212
    if(session->x11) {
327
0
        if(x11open_state->state == ssh2_NB_state_allocated) {
328
0
            channel = SSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));
329
0
            if(!channel) {
330
0
                ssh2_err(session, LIBSSH2_ERROR_ALLOC,
331
0
                         "allocate a channel for new connection");
332
0
                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
333
0
                goto x11_exit;
334
0
            }
335
336
0
            channel->session = session;
337
0
            channel->channel_type_len = sizeof("x11") - 1;
338
0
            channel->channel_type =
339
0
                SSH2_ALLOC(session, channel->channel_type_len + 1);
340
0
            if(!channel->channel_type) {
341
0
                ssh2_err(session, LIBSSH2_ERROR_ALLOC,
342
0
                         "allocate a channel for new connection");
343
0
                SSH2_FREE(session, channel);
344
0
                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
345
0
                goto x11_exit;
346
0
            }
347
0
            memcpy(channel->channel_type, "x11",
348
0
                   channel->channel_type_len + 1);
349
350
0
            channel->remote.id = x11open_state->sender_channel;
351
0
            channel->remote.window_size_initial =
352
0
                LIBSSH2_CHANNEL_WINDOW_DEFAULT;
353
0
            channel->remote.window_size = LIBSSH2_CHANNEL_WINDOW_DEFAULT;
354
0
            channel->remote.packet_size = LIBSSH2_CHANNEL_PACKET_DEFAULT;
355
356
0
            channel->local.id = ssh2_channel_nextid(session);
357
0
            channel->local.window_size_initial =
358
0
                x11open_state->initial_window_size;
359
0
            channel->local.window_size = x11open_state->initial_window_size;
360
0
            channel->local.packet_size = x11open_state->packet_size;
361
362
0
            ssh2_deb((session, LIBSSH2_TRACE_CONN,
363
0
                      "X11 Connection established: channel %u/%u "
364
0
                      "win %u/%u packet %u/%u",
365
0
                      channel->local.id, channel->remote.id,
366
0
                      channel->local.window_size,
367
0
                      channel->remote.window_size,
368
0
                      channel->local.packet_size,
369
0
                      channel->remote.packet_size));
370
0
            p = x11open_state->packet;
371
0
            *(p++) = SSH_MSG_CHANNEL_OPEN_CONFIRMATION;
372
0
            ssh2_store_u32(&p, channel->remote.id);
373
0
            ssh2_store_u32(&p, channel->local.id);
374
0
            ssh2_store_u32(&p, channel->remote.window_size_initial);
375
0
            ssh2_store_u32(&p, channel->remote.packet_size);
376
377
0
            x11open_state->state = ssh2_NB_state_created;
378
0
        }
379
380
0
        if(x11open_state->state == ssh2_NB_state_created) {
381
0
            rc = ssh2_transport_send(session, x11open_state->packet, 17,
382
0
                                     NULL, 0);
383
0
            if(rc == LIBSSH2_ERROR_EAGAIN)
384
0
                return rc;
385
0
            else if(rc) {
386
0
                SSH2_SAFEFREE(session, x11open_state->shost);
387
0
                x11open_state->state = ssh2_NB_state_idle;
388
0
                return ssh2_err(session, LIBSSH2_ERROR_SOCKET_SEND,
389
0
                                "Unable to send channel open confirmation");
390
0
            }
391
392
            /* Link the channel into the session */
393
0
            ssh2_list_add(&session->channels, &channel->node);
394
395
            /*
396
             * Pass control to the callback, they may turn right around and
397
             * free the channel, or actually use it
398
             */
399
0
            SSH2_X11_OPEN(channel, (char *)x11open_state->shost,
400
0
                          x11open_state->sport);
401
402
0
            SSH2_SAFEFREE(session, x11open_state->shost);
403
0
            x11open_state->state = ssh2_NB_state_idle;
404
0
            return 0;
405
0
        }
406
0
    }
407
212
    else
408
212
        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
409
    /* fall-through */
410
1.09k
x11_exit:
411
1.09k
    SSH2_SAFEFREE(session, x11open_state->shost);
412
413
1.09k
    p = x11open_state->packet;
414
1.09k
    *(p++) = SSH_MSG_CHANNEL_OPEN_FAILURE;
415
1.09k
    ssh2_store_u32(&p, x11open_state->sender_channel);
416
1.09k
    ssh2_store_u32(&p, failure_code);
417
1.09k
    ssh2_store_str(&p, X11FwdUnAvil, strlen(X11FwdUnAvil));
418
1.09k
    ssh2_htonu32(p, 0);
419
420
1.09k
    rc = ssh2_transport_send(session, x11open_state->packet, packet_len,
421
1.09k
                             NULL, 0);
422
1.09k
    if(rc == LIBSSH2_ERROR_EAGAIN)
423
0
        return rc;
424
1.09k
    else if(rc) {
425
0
        x11open_state->state = ssh2_NB_state_idle;
426
0
        return ssh2_err(session, rc, "Unable to send open failure");
427
0
    }
428
1.09k
    x11open_state->state = ssh2_NB_state_idle;
429
1.09k
    return 0;
430
1.09k
}
431
432
/*
433
 * Open a connection to authentication agent
434
 */
435
static SSH2_INLINE int packet_authagent_open(
436
    LIBSSH2_SESSION *session,
437
    unsigned char *data, size_t datalen,
438
    struct packet_authagent_state *authagent_state)
439
243
{
440
243
    uint32_t failure_code = SSH_OPEN_CONNECT_FAILED;
441
    /* 17 = packet_type(1) + channel(4) + reason(4) + descr(4) + lang(4) */
442
243
    size_t packet_len = 17 + strlen(AuthAgentUnavail);
443
243
    unsigned char *p;
444
243
    LIBSSH2_CHANNEL *channel = authagent_state->channel;
445
243
    int rc;
446
243
    struct string_buf buf;
447
243
    size_t offset = sizeof("auth-agent@openssh.com") - 1 + 5;
448
449
243
    buf.data = data;
450
243
    buf.dataptr = buf.data;
451
243
    buf.len = datalen;
452
453
243
    if(datalen < offset + 12) /* 27-byte header + 3 * 4-byte */
454
9
        return ssh2_err(session, LIBSSH2_ERROR_OUT_OF_BOUNDARY,
455
9
                        "Unexpected packet size");
456
457
234
    buf.dataptr += offset;
458
459
234
    if(authagent_state->state == ssh2_NB_state_idle) {
460
234
        if(ssh2_get_u32(&buf, &authagent_state->sender_channel))
461
0
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
462
0
                            "Data too short extracting channel");
463
234
        if(ssh2_get_u32(&buf, &authagent_state->initial_window_size))
464
0
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
465
0
                            "Data too short extracting window size");
466
234
        if(ssh2_get_u32(&buf, &authagent_state->packet_size))
467
0
            return ssh2_err(session, LIBSSH2_ERROR_BUFFER_TOO_SMALL,
468
0
                            "Data too short extracting packet");
469
470
234
        ssh2_deb((session, LIBSSH2_TRACE_CONN,
471
234
                  "Auth Agent Connection Received on channel %u",
472
234
                  authagent_state->sender_channel));
473
474
234
        authagent_state->state = ssh2_NB_state_allocated;
475
234
    }
476
477
234
    if(session->authagent) {
478
0
        if(authagent_state->state == ssh2_NB_state_allocated) {
479
0
            channel = SSH2_CALLOC(session, sizeof(LIBSSH2_CHANNEL));
480
0
            authagent_state->channel = channel;
481
482
0
            if(!channel) {
483
0
                ssh2_err(session, LIBSSH2_ERROR_ALLOC,
484
0
                         "allocate a channel for new connection");
485
0
                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
486
0
                goto authagent_exit;
487
0
            }
488
489
0
            channel->session = session;
490
0
            channel->channel_type_len = sizeof("auth agent") - 1;
491
0
            channel->channel_type =
492
0
                SSH2_ALLOC(session, channel->channel_type_len + 1);
493
0
            if(!channel->channel_type) {
494
0
                ssh2_err(session, LIBSSH2_ERROR_ALLOC,
495
0
                         "allocate a channel for new connection");
496
0
                SSH2_FREE(session, channel);
497
0
                failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
498
0
                goto authagent_exit;
499
0
            }
500
0
            memcpy(channel->channel_type, "auth agent",
501
0
                   channel->channel_type_len + 1);
502
503
0
            channel->remote.id = authagent_state->sender_channel;
504
0
            channel->remote.window_size_initial =
505
0
                LIBSSH2_CHANNEL_WINDOW_DEFAULT;
506
0
            channel->remote.window_size = LIBSSH2_CHANNEL_WINDOW_DEFAULT;
507
0
            channel->remote.packet_size = LIBSSH2_CHANNEL_PACKET_DEFAULT;
508
509
0
            channel->local.id = ssh2_channel_nextid(session);
510
0
            channel->local.window_size_initial =
511
0
                authagent_state->initial_window_size;
512
0
            channel->local.window_size = authagent_state->initial_window_size;
513
0
            channel->local.packet_size = authagent_state->packet_size;
514
515
0
            ssh2_deb((session, LIBSSH2_TRACE_CONN,
516
0
                      "Auth Agent Connection established: channel "
517
0
                      "%u/%u win %u/%u packet %u/%u",
518
0
                      channel->local.id, channel->remote.id,
519
0
                      channel->local.window_size,
520
0
                      channel->remote.window_size,
521
0
                      channel->local.packet_size,
522
0
                      channel->remote.packet_size));
523
524
0
            p = authagent_state->packet;
525
0
            *(p++) = SSH_MSG_CHANNEL_OPEN_CONFIRMATION;
526
0
            ssh2_store_u32(&p, channel->remote.id);
527
0
            ssh2_store_u32(&p, channel->local.id);
528
0
            ssh2_store_u32(&p, channel->remote.window_size_initial);
529
0
            ssh2_store_u32(&p, channel->remote.packet_size);
530
531
0
            authagent_state->state = ssh2_NB_state_created;
532
0
        }
533
534
0
        if(authagent_state->state == ssh2_NB_state_created) {
535
0
            rc = ssh2_transport_send(session, authagent_state->packet, 17,
536
0
                                     NULL, 0);
537
0
            if(rc == LIBSSH2_ERROR_EAGAIN)
538
0
                return rc;
539
0
            else if(rc) {
540
0
                authagent_state->state = ssh2_NB_state_idle;
541
0
                return ssh2_err(session, LIBSSH2_ERROR_SOCKET_SEND,
542
0
                                "Unable to send channel open confirmation");
543
0
            }
544
545
            /* Link the channel into the session */
546
0
            ssh2_list_add(&session->channels, &channel->node);
547
548
            /* mess with stuff so we do not keep reading the same packet
549
               over and over */
550
0
            session->packet.total_num = 0;
551
0
            session->fullpacket_state = ssh2_NB_state_idle;
552
553
            /* Pass control to the callback, they may turn right around and
554
               and free the channel, or actually use it */
555
556
0
            SSH2_AUTHAGENT(channel);
557
558
0
            authagent_state->state = ssh2_NB_state_idle;
559
0
            return 0;
560
0
        }
561
0
    }
562
234
    else
563
234
        failure_code = SSH_OPEN_RESOURCE_SHORTAGE;
564
565
    /* fall-through */
566
234
authagent_exit:
567
234
    p = authagent_state->packet;
568
234
    *(p++) = SSH_MSG_CHANNEL_OPEN_FAILURE;
569
234
    ssh2_store_u32(&p, authagent_state->sender_channel);
570
234
    ssh2_store_u32(&p, failure_code);
571
234
    ssh2_store_str(&p, AuthAgentUnavail, strlen(AuthAgentUnavail));
572
234
    ssh2_htonu32(p, 0);
573
574
234
    rc = ssh2_transport_send(session, authagent_state->packet, packet_len,
575
234
                             NULL, 0);
576
234
    if(rc == LIBSSH2_ERROR_EAGAIN)
577
0
        return rc;
578
234
    else if(rc) {
579
0
        authagent_state->state = ssh2_NB_state_idle;
580
0
        return ssh2_err(session, rc, "Unable to send open failure");
581
0
    }
582
234
    authagent_state->state = ssh2_NB_state_idle;
583
234
    return 0;
584
234
}
585
586
/*
587
 * Create a new packet and attach it to the brigade. Called from the transport
588
 * layer when it has received a packet.
589
 *
590
 * The input pointer 'data' is pointing to allocated data that in this function
591
 * is freed unless return the code is LIBSSH2_ERROR_EAGAIN.
592
 *
593
 * This function is always called with 'datalen' greater than zero.
594
 */
595
int ssh2_packet_add(LIBSSH2_SESSION *session, unsigned char *data,
596
                    size_t datalen, int macstate, uint32_t seq)
597
95.8k
{
598
95.8k
    int rc = 0;
599
95.8k
    char *message = NULL;
600
95.8k
    char *language = NULL;
601
95.8k
    size_t message_len = 0;
602
95.8k
    size_t language_len = 0;
603
95.8k
    LIBSSH2_CHANNEL *channelp = NULL;
604
95.8k
    size_t data_head = 0;
605
95.8k
    unsigned char msg = data[0];
606
607
95.8k
    uint32_t channel = 0;
608
95.8k
    uint32_t len = 0;
609
95.8k
    unsigned char want_reply = 0;
610
611
95.8k
    switch(session->packAdd_state) {
612
95.8k
    case ssh2_NB_state_idle:
613
95.8k
        ssh2_deb((session, LIBSSH2_TRACE_TRANS,
614
95.8k
                  "Packet type %u received, length=%ld",
615
95.8k
                  (unsigned int)msg, (long)datalen));
616
617
95.8k
        if(macstate == SSH2_MAC_INVALID &&
618
0
           (!session->macerror ||
619
0
            SSH2_MACERROR(session, (char *)data, datalen))) {
620
            /* Bad MAC input, but no callback set or non-zero return from the
621
               callback */
622
0
            SSH2_FREE(session, data);
623
0
            return ssh2_err(session, LIBSSH2_ERROR_INVALID_MAC,
624
0
                            "Invalid MAC received");
625
0
        }
626
95.8k
        session->packAdd_state = ssh2_NB_state_allocated;
627
95.8k
        break;
628
0
    case ssh2_NB_state_jump1:
629
0
        goto ssh2_packet_add_jump_point1;
630
0
    case ssh2_NB_state_jump2:
631
0
        goto ssh2_packet_add_jump_point2;
632
0
    case ssh2_NB_state_jump3:
633
0
        goto ssh2_packet_add_jump_point3;
634
0
    case ssh2_NB_state_jump4:
635
0
        goto ssh2_packet_add_jump_point4;
636
0
    case ssh2_NB_state_jump5:
637
0
        goto ssh2_packet_add_jump_point5;
638
0
    case ssh2_NB_state_jumpauthagent:
639
0
        goto ssh2_packet_add_jump_authagent;
640
0
    default: /* nothing to do */
641
0
        break;
642
95.8k
    }
643
644
95.8k
    if(session->state & SSH2_STATE_INITIAL_KEX) {
645
49.8k
        if(msg == SSH_MSG_KEXINIT) {
646
2.24k
            if(!session->kex_strict) {
647
2.24k
                if(datalen < 17) {
648
15
                    SSH2_FREE(session, data);
649
15
                    session->packAdd_state = ssh2_NB_state_idle;
650
15
                    return ssh2_err(session,
651
15
                                    LIBSSH2_ERROR_BUFFER_TOO_SMALL,
652
15
                                    "Data too short extracting kex");
653
15
                }
654
2.23k
                else {
655
2.23k
                    static const char strict[] =
656
2.23k
                        "kex-strict-s-v00@openssh.com";
657
2.23k
                    struct string_buf buf;
658
2.23k
                    char *algs = NULL;
659
2.23k
                    size_t algs_len = 0;
660
661
2.23k
                    buf.data = data;
662
2.23k
                    buf.dataptr = buf.data;
663
2.23k
                    buf.len = datalen;
664
2.23k
                    buf.dataptr += 17; /* advance past type and cookie */
665
666
2.23k
                    if(ssh2_get_chars(&buf, &algs, &algs_len)) {
667
6
                        SSH2_FREE(session, data);
668
6
                        session->packAdd_state = ssh2_NB_state_idle;
669
6
                        return ssh2_err(session,
670
6
                                        LIBSSH2_ERROR_BUFFER_TOO_SMALL,
671
6
                                        "Algs too short");
672
6
                    }
673
674
2.22k
                    if(algs_len == 0 ||
675
2.19k
                       ssh2_kex_agree_instr(algs, algs_len,
676
2.19k
                                            strict, sizeof(strict) - 1)) {
677
227
                        session->kex_strict = 1;
678
227
                    }
679
2.22k
                }
680
2.24k
            }
681
682
2.22k
            if(session->kex_strict && seq) {
683
12
                SSH2_FREE(session, data);
684
12
                session->socket_state = SSH2_SOCKET_DISCONNECTED;
685
12
                session->packAdd_state = ssh2_NB_state_idle;
686
12
                libssh2_session_disconnect(session, "strict KEX violation: "
687
12
                                           "KEXINIT was not the first packet");
688
689
12
                return ssh2_err(session, LIBSSH2_ERROR_SOCKET_DISCONNECT,
690
12
                                "strict KEX violation: "
691
12
                                "KEXINIT was not the first packet");
692
12
            }
693
2.22k
        }
694
695
49.8k
        if(session->kex_strict && session->fullpacket_required_type &&
696
231
           session->fullpacket_required_type != msg) {
697
13
            SSH2_FREE(session, data);
698
13
            session->socket_state = SSH2_SOCKET_DISCONNECTED;
699
13
            session->packAdd_state = ssh2_NB_state_idle;
700
13
            libssh2_session_disconnect(session, "strict KEX violation: "
701
13
                                       "unexpected packet type");
702
703
13
            return ssh2_err(session, LIBSSH2_ERROR_SOCKET_DISCONNECT,
704
13
                            "strict KEX violation: unexpected packet type");
705
13
        }
706
49.8k
    }
707
708
95.7k
    if(session->packAdd_state == ssh2_NB_state_allocated) {
709
        /* A couple exceptions to the packet adding rule: */
710
95.7k
        switch(msg) {
711
712
            /*
713
               byte      SSH_MSG_DISCONNECT
714
               uint32    reason code
715
               string    description in ISO-10646 UTF-8 encoding [RFC3629]
716
               string    language tag [RFC3066]
717
             */
718
719
34
        case SSH_MSG_DISCONNECT:
720
34
            if(datalen >= 5) {
721
29
                uint32_t reason = 0;
722
29
                struct string_buf buf;
723
29
                buf.data = data;
724
29
                buf.dataptr = buf.data;
725
29
                buf.len = datalen;
726
29
                buf.dataptr++; /* advance past type */
727
728
29
                ssh2_get_u32(&buf, &reason);
729
29
                ssh2_get_chars(&buf, &message, &message_len);
730
29
                ssh2_get_chars(&buf, &language, &language_len);
731
732
29
                if(session->ssh_msg_disconnect)
733
0
                    SSH2_DISCONNECT(session, reason, message, message_len,
734
29
                                    language, language_len);
735
736
29
                ssh2_deb((session, LIBSSH2_TRACE_TRANS,
737
29
                          "Disconnect(%u): %.*s(%.*s)", reason,
738
29
                          (int)message_len, message, (int)language_len,
739
29
                          language));
740
29
            }
741
742
34
            SSH2_FREE(session, data);
743
34
            session->socket_state = SSH2_SOCKET_DISCONNECTED;
744
34
            session->packAdd_state = ssh2_NB_state_idle;
745
34
            return ssh2_err(session, LIBSSH2_ERROR_SOCKET_DISCONNECT,
746
34
                            "socket disconnect");
747
            /*
748
               byte      SSH_MSG_IGNORE
749
               string    data
750
             */
751
752
2.13k
        case SSH_MSG_IGNORE:
753
2.13k
            if(datalen >= 2) {
754
254
                if(session->ssh_msg_ignore)
755
0
                    SSH2_IGNORE(session, (char *)data + 1, datalen - 1);
756
254
            }
757
1.87k
            else if(session->ssh_msg_ignore) {
758
0
                SSH2_IGNORE(session, "", 0);
759
0
            }
760
2.13k
            SSH2_FREE(session, data);
761
2.13k
            session->packAdd_state = ssh2_NB_state_idle;
762
2.13k
            return 0;
763
764
            /*
765
               byte      SSH_MSG_DEBUG
766
               boolean   always_display
767
               string    message in ISO-10646 UTF-8 encoding [RFC3629]
768
               string    language tag [RFC3066]
769
             */
770
771
1.17k
        case SSH_MSG_DEBUG:
772
1.17k
            if(datalen >= 2) {
773
782
                int always_display = data[1];
774
775
782
                if(datalen >= 6) {
776
494
                    struct string_buf buf;
777
494
                    buf.data = data;
778
494
                    buf.dataptr = buf.data;
779
494
                    buf.len = datalen;
780
494
                    buf.dataptr += 2; /* advance past type & always display */
781
782
494
                    ssh2_get_chars(&buf, &message, &message_len);
783
494
                    ssh2_get_chars(&buf, &language, &language_len);
784
494
                }
785
786
782
                if(session->ssh_msg_debug)
787
0
                    SSH2_DEBUG(session, always_display, message, message_len,
788
782
                               language, language_len);
789
782
            }
790
791
1.17k
            ssh2_deb((session, LIBSSH2_TRACE_TRANS, "Debug Packet: %.*s",
792
1.17k
                      (int)message_len, message));
793
1.17k
            SSH2_FREE(session, data);
794
1.17k
            session->packAdd_state = ssh2_NB_state_idle;
795
1.17k
            return 0;
796
797
            /*
798
               byte      SSH_MSG_EXT_INFO
799
               uint32    nr-extensions
800
               [repeat   "nr-extensions" times]
801
               string    extension-name  [RFC8308]
802
               string    extension-value (binary)
803
             */
804
805
1.20k
        case SSH_MSG_EXT_INFO:
806
1.20k
            if(datalen >= 5) {
807
943
                uint32_t nr_extensions = 0;
808
943
                struct string_buf buf;
809
943
                buf.data = data;
810
943
                buf.dataptr = buf.data;
811
943
                buf.len = datalen;
812
943
                buf.dataptr += 1; /* advance past type */
813
814
943
                if(ssh2_get_u32(&buf, &nr_extensions) != 0 ||
815
943
                   nr_extensions >= 1024)
816
60
                    rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
817
60
                                  "Invalid extension info received");
818
819
2.02k
                while(rc == 0 && nr_extensions > 0) {
820
821
1.70k
                    size_t name_len = 0;
822
1.70k
                    size_t value_len = 0;
823
1.70k
                    unsigned char *name = NULL;
824
1.70k
                    unsigned char *value = NULL;
825
826
1.70k
                    nr_extensions -= 1;
827
828
1.70k
                    if(ssh2_get_string(&buf, &name, &name_len))
829
535
                        break;
830
1.17k
                    if(ssh2_get_string(&buf, &value, &value_len))
831
93
                        break;
832
833
1.07k
                    if(name && value)
834
1.07k
                        ssh2_deb((session, LIBSSH2_TRACE_KEX,
835
1.07k
                                  "Server to Client extension %.*s: %.*s",
836
1.07k
                                  (int)name_len, name, (int)value_len, value));
837
838
1.07k
                    if(SSH2_IS_LITERAL(name, name_len, "server-sig-algs")) {
839
234
                        if(session->server_sign_algorithms)
840
222
                            SSH2_FREE(session,
841
234
                                      session->server_sign_algorithms);
842
843
234
                        session->server_sign_algorithms =
844
234
                            SSH2_ALLOC(session, value_len + 1);
845
846
234
                        if(value && session->server_sign_algorithms) {
847
234
                            memcpy(session->server_sign_algorithms,
848
234
                                   value, value_len);
849
234
                            session->server_sign_algorithms[value_len] = '\0';
850
234
                        }
851
0
                        else
852
0
                            rc = ssh2_err(session, LIBSSH2_ERROR_ALLOC,
853
0
                                          "memory for server sign algo");
854
234
                    }
855
1.07k
                }
856
943
            }
857
858
1.20k
            SSH2_FREE(session, data);
859
1.20k
            session->packAdd_state = ssh2_NB_state_idle;
860
1.20k
            return rc;
861
862
            /*
863
               byte      SSH_MSG_GLOBAL_REQUEST
864
               string    request name in US-ASCII only
865
               boolean   want reply
866
               ....      request-specific data follows
867
             */
868
869
3.10k
        case SSH_MSG_GLOBAL_REQUEST:
870
3.10k
            if(datalen >= 5) {
871
2.86k
                want_reply = 0;
872
2.86k
                len = ssh2_ntohu32(data + 1);
873
2.86k
                if(len <= (UINT_MAX - 6) && datalen >= (6 + len)) {
874
2.07k
                    want_reply = data[5 + len];
875
2.07k
                    ssh2_deb((session, LIBSSH2_TRACE_CONN,
876
2.07k
                              "Received global request type %.*s (wr %X)",
877
2.07k
                              (int)len, data + 5, want_reply));
878
2.07k
                }
879
880
2.86k
                if(want_reply) {
881
1.88k
                    static const unsigned char packet =
882
1.88k
                        SSH_MSG_REQUEST_FAILURE;
883
1.88k
ssh2_packet_add_jump_point5:
884
1.88k
                    session->packAdd_state = ssh2_NB_state_jump5;
885
1.88k
                    rc = ssh2_transport_send(session, &packet, 1, NULL, 0);
886
1.88k
                    if(rc == LIBSSH2_ERROR_EAGAIN)
887
0
                        return rc;
888
1.88k
                }
889
2.86k
            }
890
3.10k
            SSH2_FREE(session, data);
891
3.10k
            session->packAdd_state = ssh2_NB_state_idle;
892
3.10k
            return 0;
893
894
            /*
895
               byte      SSH_MSG_CHANNEL_EXTENDED_DATA
896
               uint32    recipient channel
897
               uint32    data_type_code
898
               string    data
899
             */
900
901
614
        case SSH_MSG_CHANNEL_EXTENDED_DATA:
902
            /* streamid(4) */
903
614
            data_head += 4;
904
905
614
            SSH2_FALLTHROUGH();
906
907
            /*
908
               byte      SSH_MSG_CHANNEL_DATA
909
               uint32    recipient channel
910
               string    data
911
             */
912
913
3.21k
        case SSH_MSG_CHANNEL_DATA:
914
            /* packet_type(1) + channelno(4) + datalen(4) */
915
3.21k
            data_head += 9;
916
917
3.21k
            if(datalen >= data_head)
918
500
                channelp =
919
500
                    ssh2_channel_locate(session, ssh2_ntohu32(data + 1));
920
921
3.21k
            if(!channelp) {
922
3.21k
                ssh2_err(session, LIBSSH2_ERROR_CHANNEL_UNKNOWN,
923
3.21k
                         "Packet received for unknown channel");
924
3.21k
                SSH2_FREE(session, data);
925
3.21k
                session->packAdd_state = ssh2_NB_state_idle;
926
3.21k
                return 0;
927
3.21k
            }
928
0
#ifdef LIBSSH2DEBUG
929
0
            {
930
0
                uint32_t stream_id = 0;
931
0
                if(msg == SSH_MSG_CHANNEL_EXTENDED_DATA)
932
0
                    stream_id = ssh2_ntohu32(data + 5);
933
934
0
                ssh2_deb((session, LIBSSH2_TRACE_CONN,
935
0
                          "%ld bytes packet_add() for %u/%u/%u",
936
0
                          (long)(datalen - data_head),
937
0
                          channelp->local.id,
938
0
                          channelp->remote.id,
939
0
                          stream_id));
940
0
            }
941
0
#endif
942
0
            if(channelp->remote.extended_data_ignore_mode ==
943
0
               LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE &&
944
0
               msg == SSH_MSG_CHANNEL_EXTENDED_DATA) {
945
                /* Pretend we did not receive this */
946
0
                ssh2_deb((session, LIBSSH2_TRACE_CONN,
947
0
                          "Ignoring extended data and refunding %ld bytes",
948
0
                          (long)(datalen - 13)));
949
0
                if(channelp->read_avail + datalen - data_head >=
950
0
                   channelp->remote.window_size)
951
0
                    datalen = channelp->remote.window_size -
952
0
                        channelp->read_avail + data_head;
953
954
0
                channelp->remote.window_size -=
955
0
                    (uint32_t)(datalen - data_head);
956
0
                ssh2_deb((session, LIBSSH2_TRACE_CONN,
957
0
                          "shrinking window size by %ld bytes to %u, "
958
0
                          "read_avail %ld",
959
0
                          (long)(datalen - data_head),
960
0
                          channelp->remote.window_size,
961
0
                          (long)channelp->read_avail));
962
963
0
                session->packAdd_channelp = channelp;
964
965
                /* Adjust the window based on the block we ignore */
966
0
ssh2_packet_add_jump_point1:
967
0
                session->packAdd_state = ssh2_NB_state_jump1;
968
0
                rc = ssh2_channel_receive_window_adjust(session->
969
0
                                                        packAdd_channelp,
970
0
                                                      (uint32_t)(datalen - 13),
971
0
                                                        1, NULL);
972
0
                if(rc == LIBSSH2_ERROR_EAGAIN)
973
0
                    return rc;
974
975
                /* free only now that the window adjust is done: 'data' aliases
976
                   session->packet.payload, which the transport layer re-passes
977
                   to us if the adjust returns EAGAIN, so an earlier free would
978
                   leave that pointer dangling */
979
0
                SSH2_FREE(session, data);
980
0
                session->packAdd_state = ssh2_NB_state_idle;
981
0
                return 0;
982
0
            }
983
984
            /*
985
             * REMEMBER! remote means remote as source of data,
986
             * NOT remote window!
987
             */
988
0
            if(channelp->remote.packet_size < (datalen - data_head)) {
989
                /*
990
                 * Spec says we MAY ignore bytes sent beyond
991
                 * packet_size
992
                 */
993
0
                ssh2_err(session, LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED,
994
0
                         "Packet contains more data than we offered"
995
0
                         " to receive, truncating");
996
0
                datalen = channelp->remote.packet_size + data_head;
997
0
            }
998
0
            if(channelp->remote.window_size <= channelp->read_avail) {
999
                /*
1000
                 * Spec says we MAY ignore bytes sent beyond
1001
                 * window_size
1002
                 */
1003
0
                ssh2_err(session, LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED,
1004
0
                         "The current receive window is full, data ignored");
1005
0
                SSH2_FREE(session, data);
1006
0
                session->packAdd_state = ssh2_NB_state_idle;
1007
0
                return 0;
1008
0
            }
1009
            /* Reset EOF status */
1010
0
            channelp->remote.eof = 0;
1011
1012
0
            if(channelp->read_avail + datalen - data_head >
1013
0
               channelp->remote.window_size) {
1014
0
                ssh2_err(session, LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED,
1015
0
                         "Remote sent more data than current "
1016
0
                         "window allows, truncating");
1017
0
                datalen = channelp->remote.window_size -
1018
0
                    channelp->read_avail + data_head;
1019
0
            }
1020
1021
            /* Update the read_avail counter. The window size is
1022
             * updated once the data is actually read from the queue
1023
             * from an upper layer */
1024
0
            channelp->read_avail += datalen - data_head;
1025
1026
0
            ssh2_deb((session, LIBSSH2_TRACE_CONN,
1027
0
                      "increasing read_avail by %ld bytes to %ld/%u",
1028
0
                      (long)(datalen - data_head),
1029
0
                      (long)channelp->read_avail,
1030
0
                      channelp->remote.window_size));
1031
1032
0
            break;
1033
1034
            /*
1035
               byte      SSH_MSG_CHANNEL_EOF
1036
               uint32    recipient channel
1037
             */
1038
1039
582
        case SSH_MSG_CHANNEL_EOF:
1040
582
            if(datalen >= 5)
1041
319
                channelp =
1042
319
                    ssh2_channel_locate(session, ssh2_ntohu32(data + 1));
1043
582
            if(!channelp)
1044
                /* We may have freed already, quietly ignore this... */
1045
582
                ;
1046
0
            else {
1047
0
                ssh2_deb((session, LIBSSH2_TRACE_CONN,
1048
0
                          "EOF received for channel %u/%u",
1049
0
                          channelp->local.id, channelp->remote.id));
1050
0
                channelp->remote.eof = 1;
1051
0
            }
1052
582
            SSH2_FREE(session, data);
1053
582
            session->packAdd_state = ssh2_NB_state_idle;
1054
582
            return 0;
1055
1056
            /*
1057
               byte      SSH_MSG_CHANNEL_REQUEST
1058
               uint32    recipient channel
1059
               string    request type in US-ASCII characters only
1060
               boolean   want reply
1061
               ....      type-specific data follows
1062
             */
1063
1064
19.7k
        case SSH_MSG_CHANNEL_REQUEST:
1065
19.7k
            if(datalen >= 9) {
1066
1.42k
                unsigned char *request;
1067
1.42k
                size_t r_len;
1068
1.42k
                struct string_buf buf;
1069
1.42k
                buf.data = data;
1070
1.42k
                buf.dataptr = buf.data;
1071
1.42k
                buf.len = datalen;
1072
1073
1.42k
                buf.dataptr++; /* Advance past packet type */
1074
1075
1.42k
                if(ssh2_get_u32(&buf, &channel)) {
1076
0
                    rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
1077
0
                                  "Unexpected channel value.");
1078
0
                    goto clean_exit;
1079
0
                }
1080
1081
1.42k
                if(ssh2_get_string(&buf, &request, &r_len)) {
1082
25
                    rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
1083
25
                                  "Unexpected request value.");
1084
25
                    goto clean_exit;
1085
25
                }
1086
1087
1.40k
                len = (uint32_t)r_len;
1088
1089
1.40k
                if(ssh2_get_byte(&buf, &want_reply)) {
1090
3
                    rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
1091
3
                                  "Unexpected want reply value.");
1092
3
                    goto clean_exit;
1093
3
                }
1094
1095
1.40k
                ssh2_deb((session, LIBSSH2_TRACE_CONN,
1096
1.40k
                          "Channel %u received request type %.*s (wr %X)",
1097
1.40k
                          channel, (int)len, request, want_reply));
1098
1099
1.40k
                if(SSH2_IS_LITERAL(request, len, "exit-status")) {
1100
                    /* we have got "exit-status" packet. Set the session value.
1101
                     */
1102
233
                    if(datalen >= 20)
1103
233
                        channelp = ssh2_channel_locate(session, channel);
1104
1105
233
                    if(channelp) {
1106
1107
0
                        uint32_t status = 0;
1108
0
                        if(ssh2_get_u32(&buf, &status))
1109
0
                            rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
1110
0
                                          "exit-signal status error");
1111
0
                        else
1112
0
                            channelp->exit_status_received = 1;
1113
1114
0
                        channelp->exit_status = (int)status;
1115
1116
0
                        ssh2_deb((session, LIBSSH2_TRACE_CONN,
1117
0
                                  "Exit status %d received for channel %u/%u",
1118
0
                                  channelp->exit_status,
1119
0
                                  channelp->local.id,
1120
0
                                  channelp->remote.id));
1121
0
                    }
1122
233
                }
1123
1.16k
                else if(SSH2_IS_LITERAL(request, len, "exit-signal")) {
1124
                    /* command terminated due to signal */
1125
417
                    if(datalen >= 20)
1126
417
                        channelp = ssh2_channel_locate(session, channel);
1127
1128
417
                    if(channelp) {
1129
                        /* signal name (without SIG prefix) */
1130
0
                        unsigned char *sig_name = NULL;
1131
0
                        size_t sig_len = 0;
1132
0
                        if(ssh2_get_string(&buf, &sig_name, &sig_len))
1133
0
                            rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
1134
0
                                          "signal name protocol error");
1135
1136
0
                        if(sig_len > UINT32_MAX - 1)
1137
0
                            rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
1138
0
                                          "signal name out of bounds");
1139
0
                        else if(sig_len > 0) {
1140
0
                            if(channelp->exit_signal)
1141
0
                                SSH2_FREE(session, channelp->exit_signal);
1142
0
                            channelp->exit_signal =
1143
0
                                SSH2_ALLOC(session, sig_len + 1);
1144
0
                            if(channelp->exit_signal) {
1145
0
                                memcpy(channelp->exit_signal,
1146
0
                                       sig_name, sig_len);
1147
0
                                channelp->exit_signal[sig_len] = '\0';
1148
1149
0
                                ssh2_deb((session, LIBSSH2_TRACE_CONN,
1150
0
                                          "Exit signal %s received for "
1151
0
                                          "channel %u/%u",
1152
0
                                          channelp->exit_signal,
1153
0
                                          channelp->local.id,
1154
0
                                          channelp->remote.id));
1155
0
                            }
1156
0
                            else
1157
0
                                rc = ssh2_err(session, LIBSSH2_ERROR_ALLOC,
1158
0
                                              "exit signal alloc error");
1159
0
                        }
1160
0
                        else if(channelp->exit_signal)
1161
0
                            SSH2_SAFEFREE(session, channelp->exit_signal);
1162
0
                    }
1163
417
                }
1164
1165
1.40k
                if(want_reply) {
1166
1.11k
                    unsigned char packet[5];
1167
1.11k
ssh2_packet_add_jump_point4:
1168
1.11k
                    session->packAdd_state = ssh2_NB_state_jump4;
1169
1.11k
                    packet[0] = SSH_MSG_CHANNEL_FAILURE;
1170
1.11k
                    memcpy(&packet[1], data + 1, 4);
1171
1.11k
                    rc = ssh2_transport_send(session, packet, 5, NULL, 0);
1172
1.11k
                    if(rc == LIBSSH2_ERROR_EAGAIN)
1173
0
                        return rc;
1174
1.11k
                }
1175
1.40k
            }
1176
1177
19.7k
clean_exit:
1178
1179
19.7k
            SSH2_FREE(session, data);
1180
19.7k
            session->packAdd_state = ssh2_NB_state_idle;
1181
19.7k
            return rc;
1182
1183
            /*
1184
               byte      SSH_MSG_CHANNEL_CLOSE
1185
               uint32    recipient channel
1186
             */
1187
1188
26.0k
        case SSH_MSG_CHANNEL_CLOSE:
1189
26.0k
            if(datalen >= 5)
1190
344
                channelp =
1191
344
                    ssh2_channel_locate(session, ssh2_ntohu32(data + 1));
1192
26.0k
            if(!channelp) {
1193
                /* We may have freed already, quietly ignore this... */
1194
26.0k
                SSH2_FREE(session, data);
1195
26.0k
                session->packAdd_state = ssh2_NB_state_idle;
1196
26.0k
                return 0;
1197
26.0k
            }
1198
0
            ssh2_deb((session, LIBSSH2_TRACE_CONN,
1199
0
                      "Close received for channel %u/%u",
1200
0
                      channelp->local.id, channelp->remote.id));
1201
1202
0
            channelp->remote.close = 1;
1203
0
            channelp->remote.eof = 1;
1204
1205
0
            SSH2_FREE(session, data);
1206
0
            session->packAdd_state = ssh2_NB_state_idle;
1207
0
            return 0;
1208
1209
            /*
1210
               byte      SSH_MSG_CHANNEL_OPEN
1211
               string    "session"
1212
               uint32    sender channel
1213
               uint32    initial window size
1214
               uint32    maximum packet size
1215
             */
1216
1217
15.7k
        case SSH_MSG_CHANNEL_OPEN:
1218
15.7k
            if(datalen < 17)
1219
712
                ;
1220
15.0k
            else if(datalen >= (sizeof("forwarded-tcpip") - 1 + 5) &&
1221
2.47k
                    ssh2_ntohu32(data + 1) == sizeof("forwarded-tcpip") - 1 &&
1222
595
                    !memcmp(data + 5, "forwarded-tcpip",
1223
595
                            sizeof("forwarded-tcpip") - 1)) {
1224
1225
                /* init the state struct */
1226
255
                memset(&session->packAdd_Qlstn_state, 0,
1227
255
                       sizeof(session->packAdd_Qlstn_state));
1228
1229
255
ssh2_packet_add_jump_point2:
1230
255
                session->packAdd_state = ssh2_NB_state_jump2;
1231
255
                rc = packet_queue_listener(session, data, datalen,
1232
255
                                           &session->packAdd_Qlstn_state);
1233
255
            }
1234
14.7k
            else if(datalen >= (sizeof("x11") - 1 + 5) &&
1235
14.7k
                    ssh2_ntohu32(data + 1) == sizeof("x11") - 1 &&
1236
12.4k
                    !memcmp(data + 5, "x11", sizeof("x11") - 1)) {
1237
1238
                /* init the state struct */
1239
1.09k
                memset(&session->packAdd_x11open_state, 0,
1240
1.09k
                       sizeof(session->packAdd_x11open_state));
1241
1242
1.09k
ssh2_packet_add_jump_point3:
1243
1.09k
                session->packAdd_state = ssh2_NB_state_jump3;
1244
1.09k
                rc = packet_x11_open(session, data, datalen,
1245
1.09k
                                     &session->packAdd_x11open_state);
1246
1.09k
            }
1247
13.6k
            else if(datalen >= (sizeof("auth-agent@openssh.com") - 1 + 5) &&
1248
960
                    ssh2_ntohu32(data + 1) ==
1249
960
                        sizeof("auth-agent@openssh.com") - 1 &&
1250
521
                    !memcmp(data + 5, "auth-agent@openssh.com",
1251
521
                            sizeof("auth-agent@openssh.com") - 1)) {
1252
1253
                /* init the state struct */
1254
243
                memset(&session->packAdd_authagent_state, 0,
1255
243
                       sizeof(session->packAdd_authagent_state));
1256
1257
243
ssh2_packet_add_jump_authagent:
1258
243
                session->packAdd_state = ssh2_NB_state_jumpauthagent;
1259
243
                rc = packet_authagent_open(session, data, datalen,
1260
243
                                           &session->packAdd_authagent_state);
1261
243
            }
1262
15.7k
            if(rc == LIBSSH2_ERROR_EAGAIN)
1263
0
                return rc;
1264
1265
15.7k
            SSH2_FREE(session, data);
1266
15.7k
            session->packAdd_state = ssh2_NB_state_idle;
1267
15.7k
            return rc;
1268
1269
            /*
1270
               byte      SSH_MSG_CHANNEL_WINDOW_ADJUST
1271
               uint32    recipient channel
1272
               uint32    bytes to add
1273
             */
1274
464
        case SSH_MSG_CHANNEL_WINDOW_ADJUST:
1275
464
            if(datalen < 9)
1276
241
                ;
1277
223
            else {
1278
223
                uint32_t bytestoadd = ssh2_ntohu32(data + 5);
1279
223
                channelp =
1280
223
                    ssh2_channel_locate(session, ssh2_ntohu32(data + 1));
1281
223
                if(channelp) {
1282
0
                    if(bytestoadd > UINT32_MAX - channelp->local.window_size)
1283
0
                        rc = ssh2_err(session, LIBSSH2_ERROR_PROTO,
1284
0
                                      "Window adjust out of bounds");
1285
0
                    else {
1286
0
                        channelp->local.window_size += bytestoadd;
1287
1288
0
                        ssh2_deb((session, LIBSSH2_TRACE_CONN,
1289
0
                                  "Window adjust for channel %u/%u, "
1290
0
                                  "adding %u bytes, new window_size=%u",
1291
0
                                  channelp->local.id,
1292
0
                                  channelp->remote.id,
1293
0
                                  bytestoadd,
1294
0
                                  channelp->local.window_size));
1295
0
                    }
1296
0
                }
1297
223
            }
1298
1299
464
            SSH2_FREE(session, data);
1300
464
            session->packAdd_state = ssh2_NB_state_idle;
1301
464
            return rc;
1302
22.3k
        default:
1303
22.3k
            break;
1304
95.7k
        }
1305
1306
22.3k
        session->packAdd_state = ssh2_NB_state_sent;
1307
22.3k
    }
1308
1309
22.3k
    if(session->packAdd_state == ssh2_NB_state_sent) {
1310
22.3k
        struct packet *packetp = SSH2_ALLOC(session, sizeof(struct packet));
1311
22.3k
        if(!packetp) {
1312
0
            ssh2_deb((session, LIBSSH2_ERROR_ALLOC, "memory for packet"));
1313
0
            SSH2_FREE(session, data);
1314
0
            session->packAdd_state = ssh2_NB_state_idle;
1315
0
            return LIBSSH2_ERROR_ALLOC;
1316
0
        }
1317
22.3k
        packetp->data = data;
1318
22.3k
        packetp->data_len = datalen;
1319
22.3k
        packetp->data_head = data_head;
1320
1321
22.3k
        ssh2_list_add(&session->packets, &packetp->node);
1322
1323
22.3k
        session->packAdd_state = ssh2_NB_state_sent1;
1324
22.3k
    }
1325
1326
22.3k
    if((msg == SSH_MSG_KEXINIT &&
1327
11.9k
        !(session->state & SSH2_STATE_EXCHANGING_KEYS)) ||
1328
12.6k
       session->packAdd_state == ssh2_NB_state_sent2) {
1329
1330
9.64k
        if(session->packAdd_state == ssh2_NB_state_sent1) {
1331
            /*
1332
             * Remote wants new keys.
1333
             * It is already in the brigade,
1334
             * let's call back into ourselves
1335
             */
1336
9.64k
            ssh2_deb((session, LIBSSH2_TRACE_TRANS, "Renegotiating Keys"));
1337
1338
9.64k
            session->packAdd_state = ssh2_NB_state_sent2;
1339
9.64k
        }
1340
1341
        /*
1342
         * The KEXINIT message has been added to the queue.  The packAdd and
1343
         * readPack states need to be reset because ssh2_kex_exchange()
1344
         * (eventually) calls upon ssh2_transport_read() to read the rest of
1345
         * the key exchange conversation.
1346
         */
1347
9.64k
        session->readPack_state = ssh2_NB_state_idle;
1348
9.64k
        session->packet.total_num = 0;
1349
9.64k
        session->packAdd_state = ssh2_NB_state_idle;
1350
9.64k
        session->fullpacket_state = ssh2_NB_state_idle;
1351
1352
9.64k
        memset(&session->startup_key_state, 0,
1353
9.64k
               sizeof(session->startup_key_state));
1354
1355
        /*
1356
         * If there was a key reexchange failure, let's hope we did not
1357
         * send NEWKEYS yet, otherwise remote drops us like a rock
1358
         */
1359
9.64k
        rc = ssh2_kex_exchange(session, 1, &session->startup_key_state);
1360
9.64k
        if(rc == LIBSSH2_ERROR_EAGAIN)
1361
0
            return rc;
1362
9.64k
    }
1363
1364
22.3k
    session->packAdd_state = ssh2_NB_state_idle;
1365
22.3k
    return 0;
1366
22.3k
}
1367
1368
/*
1369
 * Scan the brigade for a matching packet type, optionally poll the socket for
1370
 * a packet first
1371
 */
1372
int ssh2_packet_ask(LIBSSH2_SESSION *session, unsigned char packet_type,
1373
                    unsigned char **data, size_t *data_len,
1374
                    int match_ofs, const unsigned char *match_buf,
1375
                    size_t match_len)
1376
200k
{
1377
200k
    struct packet *packet = ssh2_list_first(&session->packets);
1378
1379
200k
    ssh2_deb((session, LIBSSH2_TRACE_TRANS, "Looking for packet of type: %u",
1380
200k
              (unsigned int)packet_type));
1381
1382
683k
    while(packet) {
1383
500k
        if(packet->data[0] == packet_type &&
1384
16.8k
           packet->data_len >= (match_ofs + match_len) &&
1385
16.8k
           (!match_buf ||
1386
16.8k
            !memcmp(packet->data + match_ofs, match_buf, match_len))) {
1387
16.8k
            *data = packet->data;
1388
16.8k
            *data_len = packet->data_len;
1389
1390
            /* unlink struct from session->packets */
1391
16.8k
            ssh2_list_remove(&packet->node);
1392
1393
16.8k
            SSH2_FREE(session, packet);
1394
1395
16.8k
            return 0;
1396
16.8k
        }
1397
483k
        else if(session->kex_strict &&
1398
364k
                (session->state & SSH2_STATE_INITIAL_KEX)) {
1399
98
            libssh2_session_disconnect(session, "strict KEX violation: "
1400
98
                                       "unexpected packet type");
1401
1402
98
            return ssh2_err(session, LIBSSH2_ERROR_SOCKET_DISCONNECT,
1403
98
                            "strict KEX violation: unexpected packet type");
1404
98
        }
1405
483k
        packet = ssh2_list_next(&packet->node);
1406
483k
    }
1407
183k
    return -1;
1408
200k
}
1409
1410
/*
1411
 * Scan for any of a list of packet types in the brigade, optionally poll the
1412
 * socket for a packet first
1413
 */
1414
static int packet_askv(LIBSSH2_SESSION *session,
1415
                       const unsigned char *packet_types,
1416
                       unsigned char **data, size_t *data_len,
1417
                       int match_ofs,
1418
                       const unsigned char *match_buf, size_t match_len)
1419
910
{
1420
910
    size_t i, packet_types_len = strlen((const char *)packet_types);
1421
1422
175k
    for(i = 0; i < packet_types_len; i++) {
1423
174k
        if(ssh2_packet_ask(session, packet_types[i], data,
1424
174k
                           data_len, match_ofs,
1425
174k
                           match_buf, match_len) == 0)
1426
340
            return 0;
1427
174k
    }
1428
1429
570
    return -1;
1430
910
}
1431
1432
/*
1433
 * Loops ssh2_transport_read() until the packet requested is available
1434
 * SSH_DISCONNECT or a SOCKET_DISCONNECTED causes a bailout
1435
 *
1436
 * Returns negative on error
1437
 * Returns 0 when it has taken care of the requested packet.
1438
 */
1439
int ssh2_packet_require(LIBSSH2_SESSION *session,
1440
                        unsigned char packet_type,
1441
                        unsigned char **data, size_t *data_len,
1442
                        int match_ofs,
1443
                        const unsigned char *match_buf,
1444
                        size_t match_len,
1445
                        struct packet_require_state *state)
1446
19.2k
{
1447
19.2k
    if(state->start == 0) {
1448
19.2k
        if(ssh2_packet_ask(session, packet_type, data, data_len,
1449
19.2k
                           match_ofs, match_buf,
1450
19.2k
                           match_len) == 0)
1451
11.6k
            return 0;  /* A packet was available in the packet brigade */
1452
1453
7.58k
        state->start = ssh2_now();
1454
7.58k
    }
1455
1456
96.3k
    while(session->socket_state == SSH2_SOCKET_CONNECTED) {
1457
96.3k
        int ret;
1458
96.3k
        session->fullpacket_required_type = packet_type;
1459
96.3k
        ret = ssh2_transport_read(session);
1460
96.3k
        session->fullpacket_required_type = 0;
1461
96.3k
        if(ret == LIBSSH2_ERROR_EAGAIN)
1462
23
            return ret;
1463
96.3k
        else if(ret < 0) {
1464
2.88k
            state->start = 0;
1465
            /* an error which is not because of blocking */
1466
2.88k
            return ret;
1467
2.88k
        }
1468
93.4k
        else if(ret == packet_type) {
1469
            /* Be lazy, let packet_ask pull it out of the brigade */
1470
4.59k
            ret = ssh2_packet_ask(session, packet_type, data, data_len,
1471
4.59k
                                  match_ofs, match_buf, match_len);
1472
4.59k
            state->start = 0;
1473
4.59k
            return ret;
1474
4.59k
        }
1475
88.8k
        else if(ret == 0) {
1476
            /* nothing available, wait until data arrives or we time out */
1477
110
            ssh2_timediff_t left = session->packet_read_timeout -
1478
110
                (ssh2_now() - state->start);
1479
1480
110
            if(left <= 0) {
1481
18
                state->start = 0;
1482
18
                return LIBSSH2_ERROR_TIMEOUT;
1483
18
            }
1484
92
            return -1; /* no packet available yet */
1485
110
        }
1486
96.3k
    }
1487
1488
    /* Only reached if the socket died */
1489
1
    return LIBSSH2_ERROR_SOCKET_DISCONNECT;
1490
7.61k
}
1491
1492
/*
1493
 * Loops ssh2_transport_read() until any packet is available and promptly
1494
 * discards it.
1495
 * Used during KEX exchange to discard badly guessed KEX_INIT packets
1496
 */
1497
int ssh2_packet_burn(LIBSSH2_SESSION *session, ssh2_NB_states *state)
1498
910
{
1499
910
    unsigned char *data;
1500
910
    size_t data_len;
1501
910
    unsigned char i, all_packets[255];
1502
910
    int ret;
1503
1504
910
    if(*state == ssh2_NB_state_idle) {
1505
232k
        for(i = 1; i < 255; i++)
1506
231k
            all_packets[i - 1] = i;
1507
910
        all_packets[254] = 0;
1508
1509
910
        if(packet_askv(session, all_packets, &data, &data_len, 0,
1510
910
                       NULL, 0) == 0) {
1511
340
            i = data[0];
1512
            /* A packet was available in the packet brigade, burn it */
1513
340
            SSH2_FREE(session, data);
1514
340
            return i;
1515
340
        }
1516
1517
570
        ssh2_deb((session, LIBSSH2_TRACE_TRANS,
1518
570
                  "Blocking until packet becomes available to burn"));
1519
570
        *state = ssh2_NB_state_created;
1520
570
    }
1521
1522
2.48k
    while(session->socket_state == SSH2_SOCKET_CONNECTED) {
1523
2.48k
        ret = ssh2_transport_read(session);
1524
2.48k
        if(ret == LIBSSH2_ERROR_EAGAIN)
1525
0
            return ret;
1526
2.48k
        else if(ret < 0) {
1527
336
            *state = ssh2_NB_state_idle;
1528
336
            return ret;
1529
336
        }
1530
2.14k
        else if(ret == 0)
1531
502
            continue;  /* FIXME: this might busyloop */
1532
1533
        /* Be lazy, let packet_ask pull it out of the brigade */
1534
1.64k
        if(ssh2_packet_ask(session, (unsigned char)ret, &data, &data_len,
1535
1.64k
                           0, NULL, 0) == 0) {
1536
            /* Smoke 'em if you got 'em */
1537
233
            SSH2_FREE(session, data);
1538
233
            *state = ssh2_NB_state_idle;
1539
233
            return ret;
1540
233
        }
1541
1.64k
    }
1542
1543
    /* Only reached if the socket died */
1544
1
    return LIBSSH2_ERROR_SOCKET_DISCONNECT;
1545
570
}
1546
1547
/*
1548
 * Loops ssh2_transport_read() until one of a list of packet types
1549
 * requested is available. SSH_DISCONNECT or a SOCKET_DISCONNECTED causes
1550
 * a bailout. packet_types is a null-terminated list of packet_type numbers
1551
 */
1552
int ssh2_packet_requirev(LIBSSH2_SESSION *session,
1553
                         const unsigned char *packet_types,
1554
                         unsigned char **data, size_t *data_len,
1555
                         int match_ofs,
1556
                         const unsigned char *match_buf, size_t match_len,
1557
                         struct packet_requirev_state *state)
1558
0
{
1559
0
    if(packet_askv(session, packet_types, data, data_len,
1560
0
                   match_ofs, match_buf, match_len) == 0) {
1561
        /* One of the packets listed was available in the packet brigade */
1562
0
        state->start = 0;
1563
0
        return 0;
1564
0
    }
1565
1566
0
    if(state->start == 0)
1567
0
        state->start = ssh2_now();
1568
1569
0
    while(session->socket_state != SSH2_SOCKET_DISCONNECTED) {
1570
0
        int ret = ssh2_transport_read(session);
1571
0
        if(ret < 0 && ret != LIBSSH2_ERROR_EAGAIN) {
1572
0
            state->start = 0;
1573
0
            return ret;
1574
0
        }
1575
0
        if(ret <= 0) {
1576
0
            ssh2_timediff_t left = session->packet_read_timeout -
1577
0
                (ssh2_now() - state->start);
1578
1579
0
            if(left <= 0) {
1580
0
                state->start = 0;
1581
0
                return LIBSSH2_ERROR_TIMEOUT;
1582
0
            }
1583
0
            else if(ret == LIBSSH2_ERROR_EAGAIN)
1584
0
                return ret;
1585
0
        }
1586
1587
0
        if(strchr((const char *)packet_types, ret)) {
1588
            /* Be lazy, let packet_askv() pull it out of the brigade */
1589
0
            ret = packet_askv(session, packet_types, data, data_len,
1590
0
                              match_ofs, match_buf, match_len);
1591
0
            state->start = 0;
1592
0
            return ret;
1593
0
        }
1594
0
    }
1595
1596
    /* Only reached if the socket died */
1597
0
    state->start = 0;
1598
0
    return LIBSSH2_ERROR_SOCKET_DISCONNECT;
1599
0
}