| ︙ | | |
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
|
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
|
+
+
-
+
+
+
+
+
|
#define PUT_32BIT(cp, value) { \
(cp)[0] = (unsigned char)((value) >> 24); \
(cp)[1] = (unsigned char)((value) >> 16); \
(cp)[2] = (unsigned char)((value) >> 8); \
(cp)[3] = (unsigned char)(value); }
/* Enumeration values for fields in SSH-1 packets */
enum {
enum { PKT_END, PKT_INT, PKT_CHAR, PKT_DATA, PKT_STR, PKT_BIGNUM };
PKT_END, PKT_INT, PKT_CHAR, PKT_DATA, PKT_STR, PKT_BIGNUM,
/* These values are for communicating relevant semantics of
* fields to the packet logging code. */
PKTT_OTHER, PKTT_PASSWORD, PKTT_DATA
};
/*
* Coroutine mechanics for the sillier bits of the code. If these
* macros look impenetrable to you, you might find it helpful to
* read
*
* http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
|
| ︙ | | |
593
594
595
596
597
598
599
600
601
602
603
604
605
606
|
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
|
+
+
+
+
+
+
+
|
int size_needed, eof_needed;
struct Packet pktin;
struct Packet pktout;
unsigned char *deferred_send_data;
int deferred_len, deferred_size;
/*
* State associated with packet logging
*/
int pktout_logmode;
int pktout_nblanks;
struct logblank_t *pktout_blanks;
/*
* Gross hack: pscp will try to start SFTP but fall back to
* scp1 if that fails. This variable is the means by which
* scp.c can reach into the SSH code and find out which one it
* got.
*/
int fallback_cmd;
|
| ︙ | | |
679
680
681
682
683
684
685
686
687
688
689
690
691
692
|
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
do { \
char *text = dupprintf msg; \
ssh_do_close(ssh); \
logevent(text); \
connection_fatal(ssh->frontend, "%s", text); \
sfree(text); \
} while (0)
/* Functions to leave bits out of the SSH packet log file. */
static void dont_log_password(Ssh ssh, int blanktype)
{
if (ssh->cfg.logomitpass)
ssh->pktout_logmode = blanktype;
}
static void dont_log_data(Ssh ssh, int blanktype)
{
if (ssh->cfg.logomitdata)
ssh->pktout_logmode = blanktype;
}
static void end_log_omission(Ssh ssh)
{
ssh->pktout_logmode = PKTLOG_EMIT;
}
static int ssh_channelcmp(void *av, void *bv)
{
struct ssh_channel *a = (struct ssh_channel *) av;
struct ssh_channel *b = (struct ssh_channel *) bv;
if (a->localid < b->localid)
return -1;
|
| ︙ | | |
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
|
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
|
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
|
memcpy(ssh->pktin.body - 1, decompblk, decomplen);
sfree(decompblk);
ssh->pktin.length = decomplen - 1;
}
ssh->pktin.type = ssh->pktin.body[-1];
/*
* Log incoming packet, possibly omitting sensitive fields.
*/
if (ssh->logctx)
if (ssh->logctx) {
int nblanks = 0;
struct logblank_t blank;
if (ssh->cfg.logomitdata) {
int do_blank = FALSE, blank_prefix = 0;
/* "Session data" packets - omit the data field */
if ((ssh->pktin.type == SSH1_SMSG_STDOUT_DATA) ||
(ssh->pktin.type == SSH1_SMSG_STDERR_DATA)) {
do_blank = TRUE; blank_prefix = 0;
} else if (ssh->pktin.type == SSH1_MSG_CHANNEL_DATA) {
do_blank = TRUE; blank_prefix = 4;
}
if (do_blank) {
blank.offset = blank_prefix;
blank.len = ssh->pktin.length;
blank.type = PKTLOG_OMIT;
nblanks = 1;
}
}
log_packet(ssh->logctx,
PKT_INCOMING, ssh->pktin.type,
ssh1_pkt_type(ssh->pktin.type),
ssh->pktin.body, ssh->pktin.length);
ssh->pktin.body, ssh->pktin.length,
nblanks, &blank);
}
if (ssh->pktin.type == SSH1_SMSG_STDOUT_DATA ||
ssh->pktin.type == SSH1_SMSG_STDERR_DATA ||
ssh->pktin.type == SSH1_MSG_DEBUG ||
ssh->pktin.type == SSH1_SMSG_AUTH_TIS_CHALLENGE ||
ssh->pktin.type == SSH1_SMSG_AUTH_CCARD_CHALLENGE) {
long stringlen = GET_32BIT(ssh->pktin.body);
|
| ︙ | | |
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
|
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
|
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
|
}
}
ssh->pktin.savedpos = 6;
ssh->pktin.body = ssh->pktin.data;
ssh->pktin.type = ssh->pktin.data[5];
/*
* Log incoming packet, possibly omitting sensitive fields.
*/
if (ssh->logctx)
if (ssh->logctx) {
int nblanks = 0;
struct logblank_t blank;
if (ssh->cfg.logomitdata) {
int do_blank = FALSE, blank_prefix = 0;
/* "Session data" packets - omit the data field */
if (ssh->pktin.type == SSH2_MSG_CHANNEL_DATA) {
do_blank = TRUE; blank_prefix = 4;
} else if (ssh->pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA) {
do_blank = TRUE; blank_prefix = 8;
}
if (do_blank) {
blank.offset = blank_prefix;
blank.len = (ssh->pktin.length-6) - blank_prefix;
blank.type = PKTLOG_OMIT;
nblanks = 1;
}
}
log_packet(ssh->logctx, PKT_INCOMING, ssh->pktin.type,
ssh2_pkt_type(ssh->pkt_ctx, ssh->pktin.type),
ssh->pktin.data+6, ssh->pktin.length-6);
ssh->pktin.data+6, ssh->pktin.length-6,
nblanks, &blank);
}
switch (ssh->pktin.type) {
/*
* These packets we must handle instantly.
*/
case SSH2_MSG_DISCONNECT:
{
|
| ︙ | | |
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
|
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
|
+
+
+
|
ssh->pktout.body = ssh->pktout.data + 4 + pad + 1;
}
static void s_wrpkt_start(Ssh ssh, int type, int len)
{
ssh1_pktout_size(ssh, len);
ssh->pktout.type = type;
/* Initialise log omission state */
ssh->pktout_nblanks = 0;
ssh->pktout_blanks = NULL;
}
static int s_wrpkt_prepare(Ssh ssh)
{
int pad, biglen, i;
unsigned long crc;
#ifdef __SC__
|
| ︙ | | |
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
|
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
|
-
+
+
+
+
|
int len;
ssh->pktout.body[-1] = ssh->pktout.type;
if (ssh->logctx)
log_packet(ssh->logctx, PKT_OUTGOING, ssh->pktout.type,
ssh1_pkt_type(ssh->pktout.type),
ssh->pktout.body, ssh->pktout.length);
ssh->pktout.body, ssh->pktout.length,
ssh->pktout_nblanks, ssh->pktout_blanks);
sfree(ssh->pktout_blanks); ssh->pktout_blanks = NULL;
ssh->pktout_nblanks = 0;
if (ssh->v1_compressing) {
unsigned char *compblk;
int complen;
zlib_compress_block(ssh->cs_comp_ctx,
ssh->pktout.body - 1, ssh->pktout.length + 1,
&compblk, &complen);
|
| ︙ | | |
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
|
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
|
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
arglen = strlen((char *)argp);
pktlen += 4 + arglen;
break;
case PKT_BIGNUM:
bn = va_arg(ap1, Bignum);
pktlen += ssh1_bignum_length(bn);
break;
case PKTT_PASSWORD:
case PKTT_DATA:
case PKTT_OTHER:
/* ignore this pass */
break;
default:
assert(0);
}
}
s_wrpkt_start(ssh, pkttype, pktlen);
p = ssh->pktout.body;
while ((argtype = va_arg(ap2, int)) != PKT_END) {
int offset = p - ssh->pktout.body, len = 0;
switch (argtype) {
/* Actual fields in the packet */
case PKT_INT:
argint = va_arg(ap2, int);
PUT_32BIT(p, argint);
p += 4;
len = 4;
break;
case PKT_CHAR:
argchar = (unsigned char) va_arg(ap2, int);
*p = argchar;
p++;
len = 1;
break;
case PKT_DATA:
argp = va_arg(ap2, unsigned char *);
arglen = va_arg(ap2, int);
memcpy(p, argp, arglen);
p += arglen;
len = arglen;
break;
case PKT_STR:
argp = va_arg(ap2, unsigned char *);
arglen = strlen((char *)argp);
PUT_32BIT(p, arglen);
memcpy(p + 4, argp, arglen);
p += 4 + arglen;
len = arglen + 4;
break;
case PKT_BIGNUM:
bn = va_arg(ap2, Bignum);
p += ssh1_write_bignum(p, bn);
len = ssh1_write_bignum(p, bn);
break;
/* Tokens for modifications to packet logging */
case PKTT_PASSWORD:
dont_log_password(ssh, PKTLOG_BLANK);
break;
case PKTT_DATA:
dont_log_data(ssh, PKTLOG_OMIT);
break;
case PKTT_OTHER:
end_log_omission(ssh);
break;
}
p += len;
/* Deal with logfile omission, if required. */
if (len && (ssh->pktout_logmode != PKTLOG_EMIT)) {
ssh->pktout_nblanks++;
ssh->pktout_blanks = sresize(ssh->pktout_blanks,
ssh->pktout_nblanks,
struct logblank_t);
ssh->pktout_blanks[ssh->pktout_nblanks-1].offset = offset;
ssh->pktout_blanks[ssh->pktout_nblanks-1].len = len;
ssh->pktout_blanks[ssh->pktout_nblanks-1].type =
ssh->pktout_logmode;
}
}
}
static void send_packet(Ssh ssh, int pkttype, ...)
{
va_list ap1, ap2;
va_start(ap1, pkttype);
|
| ︙ | | |
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
|
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
|
+
+
+
+
+
+
+
+
+
+
|
unsigned char);
if (!ssh->pktout.data)
fatalbox("Out of memory");
}
}
static void ssh2_pkt_adddata(Ssh ssh, void *data, int len)
{
if (ssh->pktout_logmode != PKTLOG_EMIT) {
ssh->pktout_nblanks++;
ssh->pktout_blanks = sresize(ssh->pktout_blanks, ssh->pktout_nblanks,
struct logblank_t);
ssh->pktout_blanks[ssh->pktout_nblanks-1].offset =
ssh->pktout.length - 6;
ssh->pktout_blanks[ssh->pktout_nblanks-1].len = len;
ssh->pktout_blanks[ssh->pktout_nblanks-1].type = ssh->pktout_logmode;
}
ssh->pktout.length += len;
ssh2_pkt_ensure(ssh, ssh->pktout.length);
memcpy(ssh->pktout.data + ssh->pktout.length - len, data, len);
}
static void ssh2_pkt_addbyte(Ssh ssh, unsigned char byte)
{
ssh2_pkt_adddata(ssh, &byte, 1);
}
static void ssh2_pkt_init(Ssh ssh, int pkt_type)
{
ssh->pktout.length = 5;
ssh->pktout_nblanks = 0; ssh->pktout_blanks = NULL;
ssh2_pkt_addbyte(ssh, (unsigned char) pkt_type);
}
static void ssh2_pkt_addbool(Ssh ssh, unsigned char value)
{
ssh2_pkt_adddata(ssh, &value, 1);
}
static void ssh2_pkt_adduint32(Ssh ssh, unsigned long value)
|
| ︙ | | |
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
|
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
|
-
+
+
+
+
|
static int ssh2_pkt_construct(Ssh ssh)
{
int cipherblk, maclen, padding, i;
if (ssh->logctx)
log_packet(ssh->logctx, PKT_OUTGOING, ssh->pktout.data[5],
ssh2_pkt_type(ssh->pkt_ctx, ssh->pktout.data[5]),
ssh->pktout.data + 6, ssh->pktout.length - 6);
ssh->pktout.data + 6, ssh->pktout.length - 6,
ssh->pktout_nblanks, ssh->pktout_blanks);
sfree(ssh->pktout_blanks); ssh->pktout_blanks = NULL;
ssh->pktout_nblanks = 0;
/*
* Compress packet payload.
*/
{
unsigned char *newpayload;
int newlen;
|
| ︙ | | |
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
|
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
|
+
+
|
}
if (ssh->version == 2) {
ssh2_add_channel_data(c, sentreply, replylen);
ssh2_try_send(c);
} else {
send_packet(ssh, SSH1_MSG_CHANNEL_DATA,
PKT_INT, c->remoteid,
PKTT_DATA,
PKT_INT, replylen,
PKT_DATA, sentreply, replylen,
PKTT_OTHER,
PKT_END);
}
if (reply)
sfree(reply);
}
/*
|
| ︙ | | |
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
|
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
|
-
+
+
-
-
+
+
|
}
assert(pwlen >= bottom && pwlen <= top);
randomstr = snewn(top + 1, char);
for (i = bottom; i <= top; i++) {
if (i == pwlen)
if (i == pwlen) {
defer_packet(ssh, s->pwpkt_type,
PKTT_PASSWORD, PKT_STR, s->password,
PKT_STR, s->password, PKT_END);
else {
PKTT_OTHER, PKT_END);
} else {
for (j = 0; j < i; j++) {
do {
randomstr[j] = random_byte();
} while (randomstr[j] == '\0');
}
randomstr[i] = '\0';
defer_packet(ssh, SSH1_MSG_IGNORE,
|
| ︙ | | |
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
|
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
|
-
-
+
+
+
-
-
+
+
+
+
-
+
+
|
while (len < sizeof(string)) {
string[len++] = (char) random_byte();
}
} else {
ss = s->password;
}
logevent("Sending length-padded password");
send_packet(ssh, s->pwpkt_type, PKT_INT, len,
PKT_DATA, ss, len, PKT_END);
send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD,
PKT_INT, len, PKT_DATA, ss, len,
PKTT_OTHER, PKT_END);
} else {
/*
* The server has _both_
* BUG_CHOKES_ON_SSH1_IGNORE and
* BUG_NEEDS_SSH1_PLAIN_PASSWORD. There is
* therefore nothing we can do.
*/
int len;
len = strlen(s->password);
logevent("Sending unpadded password");
send_packet(ssh, s->pwpkt_type, PKT_INT, len,
PKT_DATA, s->password, len, PKT_END);
send_packet(ssh, s->pwpkt_type,
PKTT_PASSWORD, PKT_INT, len,
PKT_DATA, s->password, len,
PKTT_OTHER, PKT_END);
}
} else {
send_packet(ssh, s->pwpkt_type, PKT_STR, s->password, PKT_END);
send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD,
PKT_STR, s->password, PKTT_OTHER, PKT_END);
}
}
logevent("Sent password");
memset(s->password, 0, strlen(s->password));
crWaitUntil(ispkt);
if (ssh->pktin.type == SSH1_SMSG_FAILURE) {
if (flags & FLAG_VERBOSE)
|
| ︙ | | |
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
|
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
|
+
-
+
+
|
assert(ssh->state == SSH_STATE_CLOSED);
return 0;
}
if (ssh->version == 1) {
send_packet(ssh, SSH1_MSG_CHANNEL_DATA,
PKT_INT, c->remoteid,
PKTT_DATA,
PKT_INT, len, PKT_DATA, buf, len, PKT_END);
PKT_INT, len, PKT_DATA, buf, len,
PKTT_OTHER, PKT_END);
/*
* In SSH1 we can return 0 here - implying that forwarded
* connections are never individually throttled - because
* the only circumstance that can cause throttling will be
* the whole SSH connection backing up, in which case
* _everything_ will be throttled as a whole.
*/
|
| ︙ | | |
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
|
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
|
-
-
+
+
+
|
} else {
bombout(("Strange packet received: type %d", ssh->pktin.type));
crStopV;
}
} else {
while (inlen > 0) {
int len = min(inlen, 512);
send_packet(ssh, SSH1_CMSG_STDIN_DATA,
PKT_INT, len, PKT_DATA, in, len, PKT_END);
send_packet(ssh, SSH1_CMSG_STDIN_DATA, PKTT_DATA,
PKT_INT, len, PKT_DATA, in, len,
PKTT_OTHER, PKT_END);
in += len;
inlen -= len;
}
}
}
crFinishV;
|
| ︙ | | |
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
|
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
|
+
+
|
bufchain_prefix(&c->v.v2.outbuffer, &data, &len);
if ((unsigned)len > c->v.v2.remwindow)
len = c->v.v2.remwindow;
if ((unsigned)len > c->v.v2.remmaxpkt)
len = c->v.v2.remmaxpkt;
ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_DATA);
ssh2_pkt_adduint32(ssh, c->remoteid);
dont_log_data(ssh, PKTLOG_OMIT);
ssh2_pkt_addstring_start(ssh);
ssh2_pkt_addstring_data(ssh, data, len);
end_log_omission(ssh);
ssh2_pkt_send(ssh);
bufchain_consume(&c->v.v2.outbuffer, len);
c->v.v2.remwindow -= len;
}
/*
* After having sent as much data as we can, return the amount
|
| ︙ | | |
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
|
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
|
+
+
|
* people who find out how long their password is!
*/
ssh2_pkt_init(ssh, SSH2_MSG_USERAUTH_REQUEST);
ssh2_pkt_addstring(ssh, s->username);
ssh2_pkt_addstring(ssh, "ssh-connection"); /* service requested */
ssh2_pkt_addstring(ssh, "password");
ssh2_pkt_addbool(ssh, FALSE);
dont_log_password(ssh, PKTLOG_BLANK);
ssh2_pkt_addstring(ssh, s->password);
memset(s->password, 0, sizeof(s->password));
end_log_omission(ssh);
ssh2_pkt_defer(ssh);
/*
* We'll include a string that's an exact multiple of the
* cipher block size. If the cipher is NULL for some
* reason, we don't do this trick at all because we gain
* nothing by it.
*/
|
| ︙ | | |
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
|
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
|
+
+
|
s->type = AUTH_TYPE_PASSWORD;
} else if (s->method == AUTH_KEYBOARD_INTERACTIVE) {
if (s->curr_prompt == 0) {
ssh2_pkt_init(ssh, SSH2_MSG_USERAUTH_INFO_RESPONSE);
ssh2_pkt_adduint32(ssh, s->num_prompts);
}
if (s->need_pw) { /* only add pw if we just got one! */
dont_log_password(ssh, PKTLOG_BLANK);
ssh2_pkt_addstring(ssh, s->password);
memset(s->password, 0, sizeof(s->password));
end_log_omission(ssh);
s->curr_prompt++;
}
if (s->curr_prompt >= s->num_prompts) {
ssh2_pkt_send(ssh);
} else {
/*
* If there are prompts remaining, we set
|
| ︙ | | |
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
|
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
|
+
+
+
|
{
static const struct Packet empty = { 0, 0, NULL, NULL, 0 };
ssh->pktin = ssh->pktout = empty;
}
ssh->deferred_send_data = NULL;
ssh->deferred_len = 0;
ssh->deferred_size = 0;
ssh->pktout_logmode = PKTLOG_EMIT;
ssh->pktout_nblanks = 0;
ssh->pktout_blanks = NULL;
ssh->fallback_cmd = 0;
ssh->pkt_ctx = 0;
ssh->x11auth = NULL;
ssh->v1_compressing = FALSE;
ssh->v2_outgoing_sequence = 0;
ssh->ssh1_rdpkt_crstate = 0;
ssh->ssh2_rdpkt_crstate = 0;
|
| ︙ | | |