sync code with last fixes and improvements from OpenBSD
This commit is contained in:
parent
8f31919cdb
commit
25f3a6cfac
76 changed files with 1289 additions and 694 deletions
|
@ -700,7 +700,7 @@ rl_deprep_terminal ()
|
||||||
|
|
||||||
release_sigint ();
|
release_sigint ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* Bogus Flow Control */
|
/* Bogus Flow Control */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: bn_arch.h,v 1.9 2023/05/28 17:42:30 jsing Exp $ */
|
/* $OpenBSD: bn_arch.h,v 1.10 2023/06/12 16:42:11 jsing Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
|
* Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
|
||||||
*
|
*
|
||||||
|
@ -63,6 +63,35 @@ bn_addw_addw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_r1,
|
||||||
*out_r0 = r0;
|
*out_r0 = r0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define HAVE_BN_QWADDQW
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bn_qwaddqw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0, BN_ULONG b3,
|
||||||
|
BN_ULONG b2, BN_ULONG b1, BN_ULONG b0, BN_ULONG carry, BN_ULONG *out_carry,
|
||||||
|
BN_ULONG *out_r3, BN_ULONG *out_r2, BN_ULONG *out_r1, BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r3, r2, r1, r0;
|
||||||
|
|
||||||
|
__asm__ (
|
||||||
|
"adds xzr, %[carry], #-1 \n"
|
||||||
|
"adcs %[r0], %[a0], %[b0] \n"
|
||||||
|
"adcs %[r1], %[a1], %[b1] \n"
|
||||||
|
"adcs %[r2], %[a2], %[b2] \n"
|
||||||
|
"adcs %[r3], %[a3], %[b3] \n"
|
||||||
|
"cset %[carry], cs \n"
|
||||||
|
: [carry]"+r"(carry), [r3]"=&r"(r3), [r2]"=&r"(r2),
|
||||||
|
[r1]"=&r"(r1), [r0]"=&r"(r0)
|
||||||
|
: [a3]"r"(a3), [a2]"r"(a2), [a1]"r"(a1), [a0]"r"(a0),
|
||||||
|
[b3]"r"(b3), [b2]"r"(b2), [b1]"r"(b1), [b0]"r"(b0)
|
||||||
|
: "cc");
|
||||||
|
|
||||||
|
*out_carry = carry;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
|
||||||
#define HAVE_BN_MULW
|
#define HAVE_BN_MULW
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -148,6 +177,83 @@ bn_mulw_addtw(BN_ULONG a, BN_ULONG b, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0,
|
||||||
*out_r0 = r0;
|
*out_r0 = r0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define HAVE_BN_QWMULW_ADDW
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bn_qwmulw_addw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0, BN_ULONG b,
|
||||||
|
BN_ULONG c, BN_ULONG *out_r4, BN_ULONG *out_r3, BN_ULONG *out_r2,
|
||||||
|
BN_ULONG *out_r1, BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r4, r3, r2, r1, r0;
|
||||||
|
|
||||||
|
__asm__ (
|
||||||
|
"umulh %[r1], %[a0], %[b] \n"
|
||||||
|
"mul %[r0], %[a0], %[b] \n"
|
||||||
|
"adds %[r0], %[r0], %[c] \n"
|
||||||
|
"umulh %[r2], %[a1], %[b] \n"
|
||||||
|
"mul %[c], %[a1], %[b] \n"
|
||||||
|
"adcs %[r1], %[r1], %[c] \n"
|
||||||
|
"umulh %[r3], %[a2], %[b] \n"
|
||||||
|
"mul %[c], %[a2], %[b] \n"
|
||||||
|
"adcs %[r2], %[r2], %[c] \n"
|
||||||
|
"umulh %[r4], %[a3], %[b] \n"
|
||||||
|
"mul %[c], %[a3], %[b] \n"
|
||||||
|
"adcs %[r3], %[r3], %[c] \n"
|
||||||
|
"adc %[r4], %[r4], xzr \n"
|
||||||
|
: [c]"+r"(c), [r4]"=&r"(r4), [r3]"=&r"(r3), [r2]"=&r"(r2),
|
||||||
|
[r1]"=&r"(r1), [r0]"=&r"(r0)
|
||||||
|
: [a3]"r"(a3), [a2]"r"(a2), [a1]"r"(a1), [a0]"r"(a0), [b]"r"(b)
|
||||||
|
: "cc");
|
||||||
|
|
||||||
|
*out_r4 = r4;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define HAVE_BN_QWMULW_ADDQW_ADDW
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bn_qwmulw_addqw_addw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0,
|
||||||
|
BN_ULONG b, BN_ULONG c3, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0, BN_ULONG d,
|
||||||
|
BN_ULONG *out_r4, BN_ULONG *out_r3, BN_ULONG *out_r2, BN_ULONG *out_r1,
|
||||||
|
BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r4, r3, r2, r1, r0;
|
||||||
|
|
||||||
|
__asm__ (
|
||||||
|
"umulh %[r1], %[a0], %[b] \n"
|
||||||
|
"mul %[r0], %[a0], %[b] \n"
|
||||||
|
"adds %[r0], %[r0], %[d] \n"
|
||||||
|
"umulh %[r2], %[a1], %[b] \n"
|
||||||
|
"mul %[d], %[a1], %[b] \n"
|
||||||
|
"adcs %[r1], %[r1], %[d] \n"
|
||||||
|
"umulh %[r3], %[a2], %[b] \n"
|
||||||
|
"mul %[d], %[a2], %[b] \n"
|
||||||
|
"adcs %[r2], %[r2], %[d] \n"
|
||||||
|
"umulh %[r4], %[a3], %[b] \n"
|
||||||
|
"mul %[d], %[a3], %[b] \n"
|
||||||
|
"adcs %[r3], %[r3], %[d] \n"
|
||||||
|
"adc %[r4], %[r4], xzr \n"
|
||||||
|
"adds %[r0], %[r0], %[c0] \n"
|
||||||
|
"adcs %[r1], %[r1], %[c1] \n"
|
||||||
|
"adcs %[r2], %[r2], %[c2] \n"
|
||||||
|
"adcs %[r3], %[r3], %[c3] \n"
|
||||||
|
"adc %[r4], %[r4], xzr \n"
|
||||||
|
: [d]"+r"(d), [r4]"=&r"(r4), [r3]"=&r"(r3), [r2]"=&r"(r2),
|
||||||
|
[r1]"=&r"(r1), [r0]"=&r"(r0)
|
||||||
|
: [a3]"r"(a3), [a2]"r"(a2), [a1]"r"(a1), [a0]"r"(a0), [b]"r"(b),
|
||||||
|
[c3]"r"(c3), [c2]"r"(c2), [c1]"r"(c1), [c0]"r"(c0)
|
||||||
|
: "cc");
|
||||||
|
|
||||||
|
*out_r4 = r4;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
|
||||||
#define HAVE_BN_SUBW
|
#define HAVE_BN_SUBW
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -187,6 +293,35 @@ bn_subw_subw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_borrow,
|
||||||
*out_r0 = r0;
|
*out_r0 = r0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define HAVE_BN_QWSUBQW
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bn_qwsubqw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0, BN_ULONG b3,
|
||||||
|
BN_ULONG b2, BN_ULONG b1, BN_ULONG b0, BN_ULONG borrow, BN_ULONG *out_borrow,
|
||||||
|
BN_ULONG *out_r3, BN_ULONG *out_r2, BN_ULONG *out_r1, BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r3, r2, r1, r0;
|
||||||
|
|
||||||
|
__asm__ (
|
||||||
|
"subs xzr, xzr, %[borrow] \n"
|
||||||
|
"sbcs %[r0], %[a0], %[b0] \n"
|
||||||
|
"sbcs %[r1], %[a1], %[b1] \n"
|
||||||
|
"sbcs %[r2], %[a2], %[b2] \n"
|
||||||
|
"sbcs %[r3], %[a3], %[b3] \n"
|
||||||
|
"cset %[borrow], cc \n"
|
||||||
|
: [borrow]"+r"(borrow), [r3]"=&r"(r3), [r2]"=&r"(r2),
|
||||||
|
[r1]"=&r"(r1), [r0]"=&r"(r0)
|
||||||
|
: [a3]"r"(a3), [a2]"r"(a2), [a1]"r"(a1), [a0]"r"(a0),
|
||||||
|
[b3]"r"(b3), [b2]"r"(b2), [b1]"r"(b1), [b0]"r"(b0)
|
||||||
|
: "cc");
|
||||||
|
|
||||||
|
*out_borrow = borrow;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __GNUC__ */
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: bn_add.c,v 1.24 2023/02/22 05:46:37 jsing Exp $ */
|
/* $OpenBSD: bn_add.c,v 1.25 2023/06/12 16:17:24 jsing Exp $ */
|
||||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -80,18 +80,14 @@ bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n)
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifndef OPENSSL_SMALL_FOOTPRINT
|
|
||||||
while (n & ~3) {
|
while (n & ~3) {
|
||||||
bn_addw_addw(a[0], b[0], carry, &carry, &r[0]);
|
bn_qwaddqw(a[3], a[2], a[1], a[0], b[3], b[2], b[1], b[0],
|
||||||
bn_addw_addw(a[1], b[1], carry, &carry, &r[1]);
|
carry, &carry, &r[3], &r[2], &r[1], &r[0]);
|
||||||
bn_addw_addw(a[2], b[2], carry, &carry, &r[2]);
|
|
||||||
bn_addw_addw(a[3], b[3], carry, &carry, &r[3]);
|
|
||||||
a += 4;
|
a += 4;
|
||||||
b += 4;
|
b += 4;
|
||||||
r += 4;
|
r += 4;
|
||||||
n -= 4;
|
n -= 4;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
while (n) {
|
while (n) {
|
||||||
bn_addw_addw(a[0], b[0], carry, &carry, &r[0]);
|
bn_addw_addw(a[0], b[0], carry, &carry, &r[0]);
|
||||||
a++;
|
a++;
|
||||||
|
@ -165,18 +161,14 @@ bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n)
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifndef OPENSSL_SMALL_FOOTPRINT
|
|
||||||
while (n & ~3) {
|
while (n & ~3) {
|
||||||
bn_subw_subw(a[0], b[0], borrow, &borrow, &r[0]);
|
bn_qwsubqw(a[3], a[2], a[1], a[0], b[3], b[2], b[1], b[0],
|
||||||
bn_subw_subw(a[1], b[1], borrow, &borrow, &r[1]);
|
borrow, &borrow, &r[3], &r[2], &r[1], &r[0]);
|
||||||
bn_subw_subw(a[2], b[2], borrow, &borrow, &r[2]);
|
|
||||||
bn_subw_subw(a[3], b[3], borrow, &borrow, &r[3]);
|
|
||||||
a += 4;
|
a += 4;
|
||||||
b += 4;
|
b += 4;
|
||||||
r += 4;
|
r += 4;
|
||||||
n -= 4;
|
n -= 4;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
while (n) {
|
while (n) {
|
||||||
bn_subw_subw(a[0], b[0], borrow, &borrow, &r[0]);
|
bn_subw_subw(a[0], b[0], borrow, &borrow, &r[0]);
|
||||||
a++;
|
a++;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: bn_internal.h,v 1.11 2023/03/07 09:35:55 jsing Exp $ */
|
/* $OpenBSD: bn_internal.h,v 1.12 2023/06/12 16:17:24 jsing Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
|
* Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
|
||||||
*
|
*
|
||||||
|
@ -122,6 +122,33 @@ bn_addw_addw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_r1,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bn_qwaddqw() computes
|
||||||
|
* (r4:r3:r2:r1:r0) = (a3:a2:a1:a0) + (b3:b2:b1:b0) + carry, where a is a quad word,
|
||||||
|
* b is a quad word, and carry is a single word with value 0 or 1, producing a four
|
||||||
|
* word result and carry.
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_BN_QWADDQW
|
||||||
|
static inline void
|
||||||
|
bn_qwaddqw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0, BN_ULONG b3,
|
||||||
|
BN_ULONG b2, BN_ULONG b1, BN_ULONG b0, BN_ULONG carry, BN_ULONG *out_carry,
|
||||||
|
BN_ULONG *out_r3, BN_ULONG *out_r2, BN_ULONG *out_r1, BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r3, r2, r1, r0;
|
||||||
|
|
||||||
|
bn_addw_addw(a0, b0, carry, &carry, &r0);
|
||||||
|
bn_addw_addw(a1, b1, carry, &carry, &r1);
|
||||||
|
bn_addw_addw(a2, b2, carry, &carry, &r2);
|
||||||
|
bn_addw_addw(a3, b3, carry, &carry, &r3);
|
||||||
|
|
||||||
|
*out_carry = carry;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bn_subw() computes r0 = a - b, where both inputs are single words,
|
* bn_subw() computes r0 = a - b, where both inputs are single words,
|
||||||
* producing a single word result and borrow.
|
* producing a single word result and borrow.
|
||||||
|
@ -159,6 +186,33 @@ bn_subw_subw(BN_ULONG a, BN_ULONG b, BN_ULONG c, BN_ULONG *out_borrow,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bn_qwsubqw() computes
|
||||||
|
* (r3:r2:r1:r0) = (a3:a2:a1:a0) - (b3:b2:b1:b0) - borrow, where a is a quad word,
|
||||||
|
* b is a quad word, and borrow is a single word with value 0 or 1, producing a
|
||||||
|
* four word result and borrow.
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_BN_QWSUBQW
|
||||||
|
static inline void
|
||||||
|
bn_qwsubqw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0, BN_ULONG b3,
|
||||||
|
BN_ULONG b2, BN_ULONG b1, BN_ULONG b0, BN_ULONG borrow, BN_ULONG *out_borrow,
|
||||||
|
BN_ULONG *out_r3, BN_ULONG *out_r2, BN_ULONG *out_r1, BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r3, r2, r1, r0;
|
||||||
|
|
||||||
|
bn_subw_subw(a0, b0, borrow, &borrow, &r0);
|
||||||
|
bn_subw_subw(a1, b1, borrow, &borrow, &r1);
|
||||||
|
bn_subw_subw(a2, b2, borrow, &borrow, &r2);
|
||||||
|
bn_subw_subw(a3, b3, borrow, &borrow, &r3);
|
||||||
|
|
||||||
|
*out_borrow = borrow;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* bn_mulw() computes (r1:r0) = a * b, where both inputs are single words,
|
* bn_mulw() computes (r1:r0) = a * b, where both inputs are single words,
|
||||||
* producing a double word result.
|
* producing a double word result.
|
||||||
|
@ -387,4 +441,58 @@ bn_mul2_mulw_addtw(BN_ULONG a, BN_ULONG b, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bn_qwmulw_addw() computes (r4:r3:r2:r1:r0) = (a3:a2:a1:a0) * b + c, where a
|
||||||
|
* is a quad word, b is a single word and c is a single word, producing a five
|
||||||
|
* word result.
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_BN_QWMULW_ADDW
|
||||||
|
static inline void
|
||||||
|
bn_qwmulw_addw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0, BN_ULONG b,
|
||||||
|
BN_ULONG c, BN_ULONG *out_r4, BN_ULONG *out_r3, BN_ULONG *out_r2,
|
||||||
|
BN_ULONG *out_r1, BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r3, r2, r1, r0;
|
||||||
|
|
||||||
|
bn_mulw_addw(a0, b, c, &c, &r0);
|
||||||
|
bn_mulw_addw(a1, b, c, &c, &r1);
|
||||||
|
bn_mulw_addw(a2, b, c, &c, &r2);
|
||||||
|
bn_mulw_addw(a3, b, c, &c, &r3);
|
||||||
|
|
||||||
|
*out_r4 = c;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bn_qwmulw_addqw_addw() computes
|
||||||
|
* (r4:r3:r2:r1:r0) = (a3:a2:a1:a0) * b + (c3:c2:c1:c0) + d, where a
|
||||||
|
* is a quad word, b is a single word, c is a quad word, and d is a single word,
|
||||||
|
* producing a five word result.
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_BN_QWMULW_ADDQW_ADDW
|
||||||
|
static inline void
|
||||||
|
bn_qwmulw_addqw_addw(BN_ULONG a3, BN_ULONG a2, BN_ULONG a1, BN_ULONG a0,
|
||||||
|
BN_ULONG b, BN_ULONG c3, BN_ULONG c2, BN_ULONG c1, BN_ULONG c0, BN_ULONG d,
|
||||||
|
BN_ULONG *out_r4, BN_ULONG *out_r3, BN_ULONG *out_r2, BN_ULONG *out_r1,
|
||||||
|
BN_ULONG *out_r0)
|
||||||
|
{
|
||||||
|
BN_ULONG r3, r2, r1, r0;
|
||||||
|
|
||||||
|
bn_mulw_addw_addw(a0, b, c0, d, &d, &r0);
|
||||||
|
bn_mulw_addw_addw(a1, b, c1, d, &d, &r1);
|
||||||
|
bn_mulw_addw_addw(a2, b, c2, d, &d, &r2);
|
||||||
|
bn_mulw_addw_addw(a3, b, c3, d, &d, &r3);
|
||||||
|
|
||||||
|
*out_r4 = d;
|
||||||
|
*out_r3 = r3;
|
||||||
|
*out_r2 = r2;
|
||||||
|
*out_r1 = r1;
|
||||||
|
*out_r0 = r0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: bn_mul.c,v 1.37 2023/04/19 10:51:22 jsing Exp $ */
|
/* $OpenBSD: bn_mul.c,v 1.38 2023/06/12 16:17:24 jsing Exp $ */
|
||||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -210,17 +210,13 @@ bn_mul_words(BN_ULONG *r, const BN_ULONG *a, int num, BN_ULONG w)
|
||||||
if (num <= 0)
|
if (num <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifndef OPENSSL_SMALL_FOOTPRINT
|
|
||||||
while (num & ~3) {
|
while (num & ~3) {
|
||||||
bn_mulw_addw(a[0], w, carry, &carry, &r[0]);
|
bn_qwmulw_addw(a[3], a[2], a[1], a[0], w, carry, &carry,
|
||||||
bn_mulw_addw(a[1], w, carry, &carry, &r[1]);
|
&r[3], &r[2], &r[1], &r[0]);
|
||||||
bn_mulw_addw(a[2], w, carry, &carry, &r[2]);
|
|
||||||
bn_mulw_addw(a[3], w, carry, &carry, &r[3]);
|
|
||||||
a += 4;
|
a += 4;
|
||||||
r += 4;
|
r += 4;
|
||||||
num -= 4;
|
num -= 4;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
while (num) {
|
while (num) {
|
||||||
bn_mulw_addw(a[0], w, carry, &carry, &r[0]);
|
bn_mulw_addw(a[0], w, carry, &carry, &r[0]);
|
||||||
a++;
|
a++;
|
||||||
|
@ -247,17 +243,14 @@ bn_mul_add_words(BN_ULONG *r, const BN_ULONG *a, int num, BN_ULONG w)
|
||||||
if (num <= 0)
|
if (num <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifndef OPENSSL_SMALL_FOOTPRINT
|
|
||||||
while (num & ~3) {
|
while (num & ~3) {
|
||||||
bn_mulw_addw_addw(a[0], w, r[0], carry, &carry, &r[0]);
|
bn_qwmulw_addqw_addw(a[3], a[2], a[1], a[0], w,
|
||||||
bn_mulw_addw_addw(a[1], w, r[1], carry, &carry, &r[1]);
|
r[3], r[2], r[1], r[0], carry, &carry,
|
||||||
bn_mulw_addw_addw(a[2], w, r[2], carry, &carry, &r[2]);
|
&r[3], &r[2], &r[1], &r[0]);
|
||||||
bn_mulw_addw_addw(a[3], w, r[3], carry, &carry, &r[3]);
|
|
||||||
a += 4;
|
a += 4;
|
||||||
r += 4;
|
r += 4;
|
||||||
num -= 4;
|
num -= 4;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
while (num) {
|
while (num) {
|
||||||
bn_mulw_addw_addw(a[0], w, r[0], carry, &carry, &r[0]);
|
bn_mulw_addw_addw(a[0], w, r[0], carry, &carry, &r[0]);
|
||||||
a++;
|
a++;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ec_local.h,v 1.13 2023/04/27 07:10:05 tb Exp $ */
|
/* $OpenBSD: ec_local.h,v 1.14 2023/06/12 18:17:18 jsing Exp $ */
|
||||||
/*
|
/*
|
||||||
* Originally written by Bodo Moeller for the OpenSSL project.
|
* Originally written by Bodo Moeller for the OpenSSL project.
|
||||||
*/
|
*/
|
||||||
|
@ -357,18 +357,6 @@ int ec_GFp_simple_mul_double_nonct(const EC_GROUP *, EC_POINT *r, const BIGNUM *
|
||||||
|
|
||||||
int ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx);
|
int ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx);
|
||||||
|
|
||||||
int ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *, EC_POINT *,
|
|
||||||
const BIGNUM *x, int y_bit, BN_CTX *);
|
|
||||||
size_t ec_GF2m_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
|
|
||||||
unsigned char *buf, size_t len, BN_CTX *);
|
|
||||||
int ec_GF2m_simple_oct2point(const EC_GROUP *, EC_POINT *,
|
|
||||||
const unsigned char *buf, size_t len, BN_CTX *);
|
|
||||||
|
|
||||||
int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
|
|
||||||
size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
|
|
||||||
int ec_GF2m_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
|
|
||||||
int ec_GF2m_have_precompute_mult(const EC_GROUP *group);
|
|
||||||
|
|
||||||
/* EC_METHOD definitions */
|
/* EC_METHOD definitions */
|
||||||
|
|
||||||
struct ec_key_method_st {
|
struct ec_key_method_st {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $OpenBSD: Makefile,v 1.46 2021/03/09 17:38:24 martijn Exp $
|
# $OpenBSD: Makefile,v 1.47 2023/06/12 20:19:45 millert Exp $
|
||||||
|
|
||||||
SUBDIR+= apply
|
SUBDIR+= apply
|
||||||
SUBDIR+= basename bc
|
SUBDIR+= basename bc
|
||||||
|
@ -12,7 +12,7 @@ SUBDIR+= m4 mail mandoc
|
||||||
SUBDIR+= nc
|
SUBDIR+= nc
|
||||||
SUBDIR+= openssl
|
SUBDIR+= openssl
|
||||||
SUBDIR+= rev
|
SUBDIR+= rev
|
||||||
SUBDIR+= sdiff sed signify snmp sort
|
SUBDIR+= sdiff sed seq signify snmp sort
|
||||||
SUBDIR+= tsort
|
SUBDIR+= tsort
|
||||||
SUBDIR+= ul
|
SUBDIR+= ul
|
||||||
SUBDIR+= wc
|
SUBDIR+= wc
|
||||||
|
|
7
regress/usr.bin/seq/Makefile
Normal file
7
regress/usr.bin/seq/Makefile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# $OpenBSD: Makefile,v 1.1 2023/06/12 20:19:45 millert Exp $
|
||||||
|
|
||||||
|
SEQ?= /usr/bin/seq
|
||||||
|
|
||||||
|
seqtest:
|
||||||
|
sh ${.CURDIR}/$@.sh ${SEQ} $@.out
|
||||||
|
diff ${.CURDIR}/$@.expected $@.out
|
62
regress/usr.bin/seq/seqtest.expected
Normal file
62
regress/usr.bin/seq/seqtest.expected
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
Test 1.1: check for invalid format string
|
||||||
|
seq: invalid format string: `foo'
|
||||||
|
|
||||||
|
Test 1.2: check for valid format string
|
||||||
|
bar1.000000
|
||||||
|
bar2.000000
|
||||||
|
bar3.000000
|
||||||
|
|
||||||
|
Test 1.3: check for invalid increment
|
||||||
|
seq: zero decrement
|
||||||
|
|
||||||
|
Test 1.4: check for first > last
|
||||||
|
seq: needs negative decrement
|
||||||
|
|
||||||
|
Test 1.5: check for increment mismatch
|
||||||
|
seq: needs positive increment
|
||||||
|
|
||||||
|
Test 1.6: check for increment mismatch
|
||||||
|
seq: needs negative decrement
|
||||||
|
|
||||||
|
Test 2.0: single argument (0)
|
||||||
|
1
|
||||||
|
0
|
||||||
|
|
||||||
|
Test 2.1: single argument (1)
|
||||||
|
1
|
||||||
|
|
||||||
|
Test 2.2: single argument (-1)
|
||||||
|
1
|
||||||
|
0
|
||||||
|
-1
|
||||||
|
|
||||||
|
Test 2.3: two arguments (1, 1)
|
||||||
|
1
|
||||||
|
|
||||||
|
Test 2.3: two arguments (1, 2)
|
||||||
|
1
|
||||||
|
2
|
||||||
|
|
||||||
|
Test 2.3: two arguments (1, -2)
|
||||||
|
1
|
||||||
|
0
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
|
||||||
|
Test 3.0: check for missing element due to rounding
|
||||||
|
1
|
||||||
|
1.1
|
||||||
|
1.2
|
||||||
|
|
||||||
|
Test 3.1: check for missing element due to rounding
|
||||||
|
0
|
||||||
|
1e-06
|
||||||
|
2e-06
|
||||||
|
3e-06
|
||||||
|
|
||||||
|
Test 3.2: check for extra element due to rounding
|
||||||
|
0.1
|
||||||
|
1.09
|
||||||
|
|
||||||
|
Test 3.3: check for extra element due to rounding check
|
||||||
|
1.05e+06
|
94
regress/usr.bin/seq/seqtest.sh
Executable file
94
regress/usr.bin/seq/seqtest.sh
Executable file
|
@ -0,0 +1,94 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# $OpenBSD: seqtest.sh,v 1.1 2023/06/12 20:19:45 millert Exp $
|
||||||
|
#
|
||||||
|
# Public domain, 2023, Todd C. Miller <millert@openbsd.org>
|
||||||
|
#
|
||||||
|
# Usage: seqtest.sh [seq_bin log_file]
|
||||||
|
#
|
||||||
|
# If no log file is specified, seq.out is used.
|
||||||
|
|
||||||
|
run_tests()
|
||||||
|
{
|
||||||
|
SEQ=$1
|
||||||
|
LOG=$2
|
||||||
|
rm -f $LOG
|
||||||
|
exec >$LOG 2>&1
|
||||||
|
|
||||||
|
test_args;
|
||||||
|
test_simple;
|
||||||
|
test_rounding;
|
||||||
|
}
|
||||||
|
|
||||||
|
test_args()
|
||||||
|
{
|
||||||
|
echo 'Test 1.1: check for invalid format string'
|
||||||
|
${SEQ} -f foo 3
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 1.2: check for valid format string'
|
||||||
|
${SEQ} -f bar%f 3
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 1.3: check for invalid increment'
|
||||||
|
${SEQ} 1 0 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 1.4: check for first > last'
|
||||||
|
${SEQ} 1 .1 -1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 1.5: check for increment mismatch'
|
||||||
|
${SEQ} 0 -0.1 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 1.6: check for increment mismatch'
|
||||||
|
${SEQ} 1 0.1 0
|
||||||
|
}
|
||||||
|
|
||||||
|
test_simple()
|
||||||
|
{
|
||||||
|
echo
|
||||||
|
echo 'Test 2.0: single argument (0)'
|
||||||
|
${SEQ} 0
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 2.1: single argument (1)'
|
||||||
|
${SEQ} 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 2.2: single argument (-1)'
|
||||||
|
${SEQ} -1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 2.3: two arguments (1, 1)'
|
||||||
|
${SEQ} 1 1
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 2.3: two arguments (1, 2)'
|
||||||
|
${SEQ} 1 2
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 2.3: two arguments (1, -2)'
|
||||||
|
${SEQ} 1 -2
|
||||||
|
}
|
||||||
|
|
||||||
|
test_rounding()
|
||||||
|
{
|
||||||
|
echo
|
||||||
|
echo 'Test 3.0: check for missing element due to rounding'
|
||||||
|
${SEQ} 1 0.1 1.2
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 3.1: check for missing element due to rounding'
|
||||||
|
${SEQ} 0 0.000001 0.000003
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 3.2: check for extra element due to rounding'
|
||||||
|
${SEQ} 0.1 .99 1.99
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo 'Test 3.3: check for extra element due to rounding check'
|
||||||
|
${SEQ} 1050000 1050000
|
||||||
|
}
|
||||||
|
|
||||||
|
run_tests ${1:-seq} ${2:-seq.out}
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: iked.h,v 1.214 2023/05/30 08:41:15 claudio Exp $ */
|
/* $OpenBSD: iked.h,v 1.215 2023/06/12 09:02:31 claudio Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
|
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
|
||||||
|
@ -1270,8 +1270,7 @@ struct ibuf *
|
||||||
int ibuf_cat(struct ibuf *, struct ibuf *);
|
int ibuf_cat(struct ibuf *, struct ibuf *);
|
||||||
size_t ibuf_length(struct ibuf *);
|
size_t ibuf_length(struct ibuf *);
|
||||||
int ibuf_setsize(struct ibuf *, size_t);
|
int ibuf_setsize(struct ibuf *, size_t);
|
||||||
uint8_t *
|
void *ibuf_data(struct ibuf *);
|
||||||
ibuf_data(struct ibuf *);
|
|
||||||
void *ibuf_getdata(struct ibuf *, size_t);
|
void *ibuf_getdata(struct ibuf *, size_t);
|
||||||
struct ibuf *
|
struct ibuf *
|
||||||
ibuf_get(struct ibuf *, size_t);
|
ibuf_get(struct ibuf *, size_t);
|
||||||
|
@ -1279,8 +1278,6 @@ struct ibuf *
|
||||||
ibuf_dup(struct ibuf *);
|
ibuf_dup(struct ibuf *);
|
||||||
struct ibuf *
|
struct ibuf *
|
||||||
ibuf_random(size_t);
|
ibuf_random(size_t);
|
||||||
int ibuf_strcat(struct ibuf **, const char *);
|
|
||||||
int ibuf_strlen(struct ibuf *);
|
|
||||||
|
|
||||||
/* log.c */
|
/* log.c */
|
||||||
void log_init(int, int);
|
void log_init(int, int);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: ikev2.c,v 1.367 2023/05/23 13:57:14 claudio Exp $ */
|
/* $OpenBSD: ikev2.c,v 1.368 2023/06/12 09:02:31 claudio Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
|
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
|
||||||
|
@ -3019,18 +3019,24 @@ ikev2_handle_delete(struct iked *env, struct iked_message *msg,
|
||||||
struct iked_childsa **peersas = NULL;
|
struct iked_childsa **peersas = NULL;
|
||||||
struct iked_sa *sa = msg->msg_sa;
|
struct iked_sa *sa = msg->msg_sa;
|
||||||
struct ikev2_delete *localdel;
|
struct ikev2_delete *localdel;
|
||||||
struct ibuf *spibuf = NULL;
|
FILE *spif;
|
||||||
|
char *spibuf = NULL;
|
||||||
uint64_t *localspi = NULL;
|
uint64_t *localspi = NULL;
|
||||||
uint64_t spi64, spi = 0;
|
uint64_t spi64, spi = 0;
|
||||||
uint32_t spi32;
|
uint32_t spi32;
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
size_t found = 0;
|
size_t found = 0;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
size_t i, sz, cnt, len;
|
size_t i, sz, cnt, len, dummy;
|
||||||
|
|
||||||
if (!msg->msg_del_protoid)
|
if (!msg->msg_del_protoid)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
|
if ((spif = open_memstream(&spibuf, &dummy)) == NULL) {
|
||||||
|
log_warn("%s", __func__);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
sz = msg->msg_del_spisize;
|
sz = msg->msg_del_spisize;
|
||||||
|
|
||||||
switch (sz) {
|
switch (sz) {
|
||||||
|
@ -3093,11 +3099,10 @@ ikev2_handle_delete(struct iked *env, struct iked_message *msg,
|
||||||
if (ikev2_childsa_delete(env, sa, msg->msg_del_protoid, spi,
|
if (ikev2_childsa_delete(env, sa, msg->msg_del_protoid, spi,
|
||||||
&localspi[i], 0) != -1) {
|
&localspi[i], 0) != -1) {
|
||||||
found++;
|
found++;
|
||||||
|
|
||||||
/* append SPI to log buffer */
|
/* append SPI to log buffer */
|
||||||
if (ibuf_strlen(spibuf))
|
if (ftello(spif) > 0)
|
||||||
ibuf_strcat(&spibuf, ", ");
|
fputs(", ", spif);
|
||||||
ibuf_strcat(&spibuf, print_spi(spi, sz));
|
fputs(print_spi(spi, sz), spif);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3143,11 +3148,12 @@ ikev2_handle_delete(struct iked *env, struct iked_message *msg,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log_info("%sdeleted %zu SPI%s: %.*s",
|
fflush(spif);
|
||||||
SPI_SA(sa, NULL), found,
|
if (!ferror(spif)) {
|
||||||
found == 1 ? "" : "s",
|
log_info("%sdeleted %zu SPI%s: %s",
|
||||||
spibuf ? ibuf_strlen(spibuf) : 0,
|
SPI_SA(sa, NULL), found, found == 1 ? "" : "s",
|
||||||
spibuf ? (char *)ibuf_data(spibuf) : "");
|
spibuf);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* XXX should we send an INVALID_SPI notification? */
|
/* XXX should we send an INVALID_SPI notification? */
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -3156,7 +3162,8 @@ ikev2_handle_delete(struct iked *env, struct iked_message *msg,
|
||||||
done:
|
done:
|
||||||
free(localspi);
|
free(localspi);
|
||||||
free(peersas);
|
free(peersas);
|
||||||
ibuf_free(spibuf);
|
fclose(spif);
|
||||||
|
free(spibuf);
|
||||||
|
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
@ -6414,15 +6421,21 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
|
||||||
struct iked_childsa *csa, *ocsa, *ipcomp;
|
struct iked_childsa *csa, *ocsa, *ipcomp;
|
||||||
struct iked_flow *flow, *oflow;
|
struct iked_flow *flow, *oflow;
|
||||||
int peer_changed, reload;
|
int peer_changed, reload;
|
||||||
struct ibuf *spibuf = NULL;
|
FILE *spif, *flowf;
|
||||||
struct ibuf *flowbuf = NULL;
|
char *spibuf = NULL, *flowbuf = NULL;
|
||||||
char *buf;
|
|
||||||
char prenat_mask[10];
|
char prenat_mask[10];
|
||||||
uint16_t encrid = 0, integrid = 0, groupid = 0;
|
uint16_t encrid = 0, integrid = 0, groupid = 0;
|
||||||
size_t encrlen = 0, integrlen = 0;
|
size_t encrlen = 0, integrlen = 0, spisz, flowsz;
|
||||||
int esn = 0;
|
int esn = 0;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
|
spif = open_memstream(&spibuf, &spisz);
|
||||||
|
flowf = open_memstream(&flowbuf, &flowsz);
|
||||||
|
if (spif == NULL || flowf == NULL) {
|
||||||
|
log_warn("%s", __func__);
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
TAILQ_FOREACH(csa, &sa->sa_childsas, csa_entry) {
|
TAILQ_FOREACH(csa, &sa->sa_childsas, csa_entry) {
|
||||||
if (csa->csa_rekey || csa->csa_loaded)
|
if (csa->csa_rekey || csa->csa_loaded)
|
||||||
continue;
|
continue;
|
||||||
|
@ -6466,16 +6479,12 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
|
||||||
print_spi(csa->csa_spi.spi, csa->csa_spi.spi_size));
|
print_spi(csa->csa_spi.spi, csa->csa_spi.spi_size));
|
||||||
|
|
||||||
/* append SPI to log buffer */
|
/* append SPI to log buffer */
|
||||||
if (ibuf_strlen(spibuf))
|
if (ftello(spif) > 0)
|
||||||
ibuf_strcat(&spibuf, ", ");
|
fputs(", ", spif);
|
||||||
ibuf_strcat(&spibuf, print_spi(csa->csa_spi.spi,
|
fputs(print_spi(csa->csa_spi.spi, csa->csa_spi.spi_size), spif);
|
||||||
csa->csa_spi.spi_size));
|
if (ipcomp)
|
||||||
if (ipcomp) {
|
fprintf(spif, "(%s)", print_spi(ipcomp->csa_spi.spi,
|
||||||
ibuf_strcat(&spibuf, "(");
|
|
||||||
ibuf_strcat(&spibuf, print_spi(ipcomp->csa_spi.spi,
|
|
||||||
ipcomp->csa_spi.spi_size));
|
ipcomp->csa_spi.spi_size));
|
||||||
ibuf_strcat(&spibuf, ")");
|
|
||||||
}
|
|
||||||
if (!encrid) {
|
if (!encrid) {
|
||||||
encrid = csa->csa_encrid;
|
encrid = csa->csa_encrid;
|
||||||
encrlen = ibuf_length(csa->csa_encrkey);
|
encrlen = ibuf_length(csa->csa_encrkey);
|
||||||
|
@ -6538,25 +6547,26 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
|
||||||
flow->flow_prenat.addr_mask);
|
flow->flow_prenat.addr_mask);
|
||||||
else
|
else
|
||||||
prenat_mask[0] = '\0';
|
prenat_mask[0] = '\0';
|
||||||
if (flow->flow_dir == IPSP_DIRECTION_OUT &&
|
if (flow->flow_dir == IPSP_DIRECTION_OUT) {
|
||||||
asprintf(&buf, "%s-%s/%d%s%s%s%s%s=%s/%d(%u)%s",
|
if (ftello(flowf) > 0)
|
||||||
|
fputs(", ", flowf);
|
||||||
|
fprintf(flowf, "%s-%s/%d%s%s%s%s%s=%s/%d(%u)%s",
|
||||||
print_map(flow->flow_saproto, ikev2_saproto_map),
|
print_map(flow->flow_saproto, ikev2_saproto_map),
|
||||||
print_host((struct sockaddr *)&flow->flow_src.addr, NULL, 0),
|
print_host((struct sockaddr *)&flow->flow_src.addr,
|
||||||
|
NULL, 0),
|
||||||
flow->flow_src.addr_mask,
|
flow->flow_src.addr_mask,
|
||||||
flow->flow_prenat.addr_af != 0 ? "[": "",
|
flow->flow_prenat.addr_af != 0 ? "[": "",
|
||||||
flow->flow_prenat.addr_af != 0 ? print_host((struct sockaddr *)
|
flow->flow_prenat.addr_af != 0 ?
|
||||||
|
print_host((struct sockaddr *)
|
||||||
&flow->flow_prenat.addr, NULL, 0) : "",
|
&flow->flow_prenat.addr, NULL, 0) : "",
|
||||||
flow->flow_prenat.addr_af != 0 ? "/" : "",
|
flow->flow_prenat.addr_af != 0 ? "/" : "",
|
||||||
flow->flow_prenat.addr_af != 0 ? prenat_mask : "",
|
flow->flow_prenat.addr_af != 0 ? prenat_mask : "",
|
||||||
flow->flow_prenat.addr_af != 0 ? "]": "",
|
flow->flow_prenat.addr_af != 0 ? "]": "",
|
||||||
print_host((struct sockaddr *)&flow->flow_dst.addr, NULL, 0),
|
print_host((struct sockaddr *)&flow->flow_dst.addr,
|
||||||
|
NULL, 0),
|
||||||
flow->flow_dst.addr_mask,
|
flow->flow_dst.addr_mask,
|
||||||
flow->flow_ipproto,
|
flow->flow_ipproto,
|
||||||
reload ? "-R" : "") != -1) {
|
reload ? "-R" : "");
|
||||||
if (ibuf_strlen(flowbuf))
|
|
||||||
ibuf_strcat(&flowbuf, ", ");
|
|
||||||
ibuf_strcat(&flowbuf, buf);
|
|
||||||
free(buf);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6569,10 +6579,10 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
|
||||||
NULL, 0));
|
NULL, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ibuf_strlen(spibuf)) {
|
fflush(spif);
|
||||||
log_info("%s: loaded SPIs: %.*s (enc %s%s%s%s%s%s)",
|
if (ftello(spif) > 0 && !ferror(spif)) {
|
||||||
SPI_SA(sa, __func__),
|
log_info("%s: loaded SPIs: %s (enc %s%s%s%s%s%s)",
|
||||||
ibuf_strlen(spibuf), ibuf_data(spibuf),
|
SPI_SA(sa, __func__), spibuf,
|
||||||
print_xf(encrid, encrlen, ipsecencxfs),
|
print_xf(encrid, encrlen, ipsecencxfs),
|
||||||
integrid ? " auth " : "",
|
integrid ? " auth " : "",
|
||||||
integrid ? print_xf(integrid, integrlen, authxfs) : "",
|
integrid ? print_xf(integrid, integrlen, authxfs) : "",
|
||||||
|
@ -6580,14 +6590,17 @@ ikev2_childsa_enable(struct iked *env, struct iked_sa *sa)
|
||||||
groupid ? print_xf(groupid, 0, groupxfs) : "",
|
groupid ? print_xf(groupid, 0, groupxfs) : "",
|
||||||
esn ? " esn" : "");
|
esn ? " esn" : "");
|
||||||
}
|
}
|
||||||
if (ibuf_strlen(flowbuf))
|
fflush(flowf);
|
||||||
log_info("%s: loaded flows: %.*s", SPI_SA(sa, __func__),
|
if (ftello(flowf) > 0 && !ferror(flowf)) {
|
||||||
ibuf_strlen(flowbuf), ibuf_data(flowbuf));
|
log_info("%s: loaded flows: %s", SPI_SA(sa, __func__), flowbuf);
|
||||||
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
done:
|
done:
|
||||||
ibuf_free(spibuf);
|
fclose(spif);
|
||||||
ibuf_free(flowbuf);
|
fclose(flowf);
|
||||||
|
free(spibuf);
|
||||||
|
free(flowbuf);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: imsg_util.c,v 1.17 2023/05/30 08:41:15 claudio Exp $ */
|
/* $OpenBSD: imsg_util.c,v 1.18 2023/06/12 09:02:32 claudio Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
|
* Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
|
||||||
|
@ -83,7 +83,7 @@ ibuf_length(struct ibuf *buf)
|
||||||
return (ibuf_size(buf));
|
return (ibuf_size(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *
|
void *
|
||||||
ibuf_data(struct ibuf *buf)
|
ibuf_data(struct ibuf *buf)
|
||||||
{
|
{
|
||||||
return (ibuf_seek(buf, 0, 0));
|
return (ibuf_seek(buf, 0, 0));
|
||||||
|
@ -144,27 +144,3 @@ ibuf_setsize(struct ibuf *buf, size_t len)
|
||||||
buf->wpos = len;
|
buf->wpos = len;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
ibuf_strcat(struct ibuf **buf, const char *s)
|
|
||||||
{
|
|
||||||
size_t slen;
|
|
||||||
|
|
||||||
if (buf == NULL)
|
|
||||||
return (-1);
|
|
||||||
slen = strlen(s);
|
|
||||||
if (*buf == NULL) {
|
|
||||||
if ((*buf = ibuf_new(s, slen)) == NULL)
|
|
||||||
return (-1);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (ibuf_add(*buf, s, slen));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ibuf_strlen(struct ibuf *buf)
|
|
||||||
{
|
|
||||||
if (ibuf_length(buf) > INT_MAX)
|
|
||||||
return (INT_MAX);
|
|
||||||
return ((int)ibuf_length(buf));
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.\" $OpenBSD: urtwn.4,v 1.55 2023/04/28 06:21:42 jmc Exp $
|
.\" $OpenBSD: urtwn.4,v 1.56 2023/06/12 11:30:55 jsg Exp $
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
|
.\" Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
|
||||||
.\"
|
.\"
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
.\"
|
.\"
|
||||||
.Dd $Mdocdate: April 28 2023 $
|
.Dd $Mdocdate: June 12 2023 $
|
||||||
.Dt URTWN 4
|
.Dt URTWN 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -122,6 +122,7 @@ The following adapters should work:
|
||||||
.It Hercules Wireless N USB Pico HWNUp-150
|
.It Hercules Wireless N USB Pico HWNUp-150
|
||||||
.It IO-DATA WN-G150UM
|
.It IO-DATA WN-G150UM
|
||||||
.It ISY IWL4000 USB Wireless Micro Adapter
|
.It ISY IWL4000 USB Wireless Micro Adapter
|
||||||
|
.It Mercusys MW150US V2
|
||||||
.It Netgear WNA1000A
|
.It Netgear WNA1000A
|
||||||
.It Netgear WNA1000M
|
.It Netgear WNA1000M
|
||||||
.It Netgear WNA1000Mv2
|
.It Netgear WNA1000Mv2
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: if_urtwn.c,v 1.107 2023/04/28 01:24:14 kevlo Exp $ */
|
/* $OpenBSD: if_urtwn.c,v 1.108 2023/06/12 11:27:30 jsg Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
|
* Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
|
||||||
|
@ -333,6 +333,7 @@ static const struct urtwn_type {
|
||||||
URTWN_DEV_8188EU(DLINK, DWA125D1),
|
URTWN_DEV_8188EU(DLINK, DWA125D1),
|
||||||
URTWN_DEV_8188EU(EDIMAX, EW7811UNV2),
|
URTWN_DEV_8188EU(EDIMAX, EW7811UNV2),
|
||||||
URTWN_DEV_8188EU(ELECOM, WDC150SU2M),
|
URTWN_DEV_8188EU(ELECOM, WDC150SU2M),
|
||||||
|
URTWN_DEV_8188EU(MERCUSYS, MW150USV2),
|
||||||
URTWN_DEV_8188EU(REALTEK, RTL8188ETV),
|
URTWN_DEV_8188EU(REALTEK, RTL8188ETV),
|
||||||
URTWN_DEV_8188EU(REALTEK, RTL8188EU),
|
URTWN_DEV_8188EU(REALTEK, RTL8188EU),
|
||||||
URTWN_DEV_8188EU(TPLINK, RTL8188EUS),
|
URTWN_DEV_8188EU(TPLINK, RTL8188EUS),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
$OpenBSD: usbdevs,v 1.756 2023/05/10 18:26:05 miod Exp $
|
$OpenBSD: usbdevs,v 1.757 2023/06/12 11:26:24 jsg Exp $
|
||||||
/* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */
|
/* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -645,6 +645,7 @@ vendor THINGM 0x27b8 ThingM
|
||||||
vendor ASUSTEK 0x2821 ASUSTeK Computer
|
vendor ASUSTEK 0x2821 ASUSTeK Computer
|
||||||
vendor PIONEERDJ 0x2b73 Pioneer DJ
|
vendor PIONEERDJ 0x2b73 Pioneer DJ
|
||||||
vendor PLANEX 0x2c02 Planex Communications
|
vendor PLANEX 0x2c02 Planex Communications
|
||||||
|
vendor MERCUSYS 0x2c4e Mercusys
|
||||||
vendor QUECTEL 0x2c7c Quectel
|
vendor QUECTEL 0x2c7c Quectel
|
||||||
vendor CLUB3D 0x2d1c Club 3D
|
vendor CLUB3D 0x2d1c Club 3D
|
||||||
vendor AQUANTIA 0x2eca Aquantia
|
vendor AQUANTIA 0x2eca Aquantia
|
||||||
|
@ -3099,6 +3100,9 @@ product MELCO UWABR100 0x017f SONY UWA-BR100
|
||||||
product MELCO WLIUCGNM 0x01a2 WLI-UC-GNM
|
product MELCO WLIUCGNM 0x01a2 WLI-UC-GNM
|
||||||
product MELCO WLIUCGNM2 0x01ee WLI-UC-GNM2
|
product MELCO WLIUCGNM2 0x01ee WLI-UC-GNM2
|
||||||
|
|
||||||
|
/* Mercusys products */
|
||||||
|
product MERCUSYS MW150USV2 0x0102 MW150US V2
|
||||||
|
|
||||||
/* MetaGeek products */
|
/* MetaGeek products */
|
||||||
product METAGEEK WISPY24I 0x2400 Wi-Spy 2.4i
|
product METAGEEK WISPY24I 0x2400 Wi-Spy 2.4i
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/* $OpenBSD: usbdevs.h,v 1.768 2023/05/10 18:26:43 miod Exp $ */
|
/* $OpenBSD: usbdevs.h,v 1.769 2023/06/12 11:26:54 jsg Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
||||||
*
|
*
|
||||||
* generated from:
|
* generated from:
|
||||||
* OpenBSD: usbdevs,v 1.756 2023/05/10 18:26:05 miod Exp
|
* OpenBSD: usbdevs,v 1.757 2023/06/12 11:26:24 jsg Exp
|
||||||
*/
|
*/
|
||||||
/* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */
|
/* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */
|
||||||
|
|
||||||
|
@ -652,6 +652,7 @@
|
||||||
#define USB_VENDOR_ASUSTEK 0x2821 /* ASUSTeK Computer */
|
#define USB_VENDOR_ASUSTEK 0x2821 /* ASUSTeK Computer */
|
||||||
#define USB_VENDOR_PIONEERDJ 0x2b73 /* Pioneer DJ */
|
#define USB_VENDOR_PIONEERDJ 0x2b73 /* Pioneer DJ */
|
||||||
#define USB_VENDOR_PLANEX 0x2c02 /* Planex Communications */
|
#define USB_VENDOR_PLANEX 0x2c02 /* Planex Communications */
|
||||||
|
#define USB_VENDOR_MERCUSYS 0x2c4e /* Mercusys */
|
||||||
#define USB_VENDOR_QUECTEL 0x2c7c /* Quectel */
|
#define USB_VENDOR_QUECTEL 0x2c7c /* Quectel */
|
||||||
#define USB_VENDOR_CLUB3D 0x2d1c /* Club 3D */
|
#define USB_VENDOR_CLUB3D 0x2d1c /* Club 3D */
|
||||||
#define USB_VENDOR_AQUANTIA 0x2eca /* Aquantia */
|
#define USB_VENDOR_AQUANTIA 0x2eca /* Aquantia */
|
||||||
|
@ -3106,6 +3107,9 @@
|
||||||
#define USB_PRODUCT_MELCO_WLIUCGNM 0x01a2 /* WLI-UC-GNM */
|
#define USB_PRODUCT_MELCO_WLIUCGNM 0x01a2 /* WLI-UC-GNM */
|
||||||
#define USB_PRODUCT_MELCO_WLIUCGNM2 0x01ee /* WLI-UC-GNM2 */
|
#define USB_PRODUCT_MELCO_WLIUCGNM2 0x01ee /* WLI-UC-GNM2 */
|
||||||
|
|
||||||
|
/* Mercusys products */
|
||||||
|
#define USB_PRODUCT_MERCUSYS_MW150USV2 0x0102 /* MW150US V2 */
|
||||||
|
|
||||||
/* MetaGeek products */
|
/* MetaGeek products */
|
||||||
#define USB_PRODUCT_METAGEEK_WISPY24I 0x2400 /* Wi-Spy 2.4i */
|
#define USB_PRODUCT_METAGEEK_WISPY24I 0x2400 /* Wi-Spy 2.4i */
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/* $OpenBSD: usbdevs_data.h,v 1.762 2023/05/10 18:26:43 miod Exp $ */
|
/* $OpenBSD: usbdevs_data.h,v 1.763 2023/06/12 11:26:54 jsg Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
||||||
*
|
*
|
||||||
* generated from:
|
* generated from:
|
||||||
* OpenBSD: usbdevs,v 1.756 2023/05/10 18:26:05 miod Exp
|
* OpenBSD: usbdevs,v 1.757 2023/06/12 11:26:24 jsg Exp
|
||||||
*/
|
*/
|
||||||
/* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */
|
/* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */
|
||||||
|
|
||||||
|
@ -7513,6 +7513,10 @@ const struct usb_known_product usb_known_products[] = {
|
||||||
USB_VENDOR_MELCO, USB_PRODUCT_MELCO_WLIUCGNM2,
|
USB_VENDOR_MELCO, USB_PRODUCT_MELCO_WLIUCGNM2,
|
||||||
"WLI-UC-GNM2",
|
"WLI-UC-GNM2",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
USB_VENDOR_MERCUSYS, USB_PRODUCT_MERCUSYS_MW150USV2,
|
||||||
|
"MW150US V2",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24I,
|
USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24I,
|
||||||
"Wi-Spy 2.4i",
|
"Wi-Spy 2.4i",
|
||||||
|
@ -14681,6 +14685,10 @@ const struct usb_known_vendor usb_known_vendors[] = {
|
||||||
USB_VENDOR_PLANEX,
|
USB_VENDOR_PLANEX,
|
||||||
"Planex Communications",
|
"Planex Communications",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
USB_VENDOR_MERCUSYS,
|
||||||
|
"Mercusys",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
USB_VENDOR_QUECTEL,
|
USB_VENDOR_QUECTEL,
|
||||||
"Quectel",
|
"Quectel",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: if.c,v 1.699 2023/06/05 11:35:46 bluhm Exp $ */
|
/* $OpenBSD: if.c,v 1.700 2023/06/12 21:19:54 mvs Exp $ */
|
||||||
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
|
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1170,6 +1170,8 @@ if_detach(struct ifnet *ifp)
|
||||||
ifafree(ifa);
|
ifafree(ifa);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
splx(s);
|
||||||
|
NET_UNLOCK();
|
||||||
|
|
||||||
KASSERT(TAILQ_EMPTY(&ifp->if_addrhooks));
|
KASSERT(TAILQ_EMPTY(&ifp->if_addrhooks));
|
||||||
KASSERT(TAILQ_EMPTY(&ifp->if_linkstatehooks));
|
KASSERT(TAILQ_EMPTY(&ifp->if_linkstatehooks));
|
||||||
|
@ -1178,8 +1180,6 @@ if_detach(struct ifnet *ifp)
|
||||||
#ifdef INET6
|
#ifdef INET6
|
||||||
nd6_ifdetach(ifp);
|
nd6_ifdetach(ifp);
|
||||||
#endif
|
#endif
|
||||||
splx(s);
|
|
||||||
NET_UNLOCK();
|
|
||||||
|
|
||||||
/* Announce that the interface is gone. */
|
/* Announce that the interface is gone. */
|
||||||
rtm_ifannounce(ifp, IFAN_DEPARTURE);
|
rtm_ifannounce(ifp, IFAN_DEPARTURE);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: seq.c,v 1.6 2022/02/25 16:00:39 tb Exp $ */
|
/* $OpenBSD: seq.c,v 1.7 2023/06/12 20:15:06 millert Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2005 The NetBSD Foundation, Inc.
|
* Copyright (c) 2005 The NetBSD Foundation, Inc.
|
||||||
|
@ -89,13 +89,13 @@ main(int argc, char *argv[])
|
||||||
double first = 1.0;
|
double first = 1.0;
|
||||||
double last = 0.0;
|
double last = 0.0;
|
||||||
double incr = 0.0;
|
double incr = 0.0;
|
||||||
double last_shown_value = 0.0;
|
double prev = 0.0;
|
||||||
double cur, step;
|
double cur, step;
|
||||||
struct lconv *locale;
|
struct lconv *locale;
|
||||||
char *fmt = NULL;
|
char *fmt = NULL;
|
||||||
const char *sep = "\n";
|
const char *sep = "\n";
|
||||||
const char *term = "\n";
|
const char *term = "\n";
|
||||||
char *cur_print, *last_print;
|
char *cur_print, *last_print, *prev_print;
|
||||||
char pad = ZERO;
|
char pad = ZERO;
|
||||||
|
|
||||||
if (pledge("stdio", NULL) == -1)
|
if (pledge("stdio", NULL) == -1)
|
||||||
|
@ -176,34 +176,37 @@ main(int argc, char *argv[])
|
||||||
} else
|
} else
|
||||||
fmt = generate_format(first, incr, last, equalize, pad);
|
fmt = generate_format(first, incr, last, equalize, pad);
|
||||||
|
|
||||||
|
warnx("first: %f, incr: %f", first, incr);
|
||||||
for (step = 1, cur = first; incr > 0 ? cur <= last : cur >= last;
|
for (step = 1, cur = first; incr > 0 ? cur <= last : cur >= last;
|
||||||
cur = first + incr * step++) {
|
cur = first + incr * step++) {
|
||||||
if (cur != first)
|
if (cur != first)
|
||||||
fputs(sep, stdout);
|
fputs(sep, stdout);
|
||||||
printf(fmt, cur);
|
printf(fmt, cur);
|
||||||
last_shown_value = cur;
|
prev = cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Did we miss the last value of the range in the loop above?
|
* Did we miss the last value of the range in the loop above?
|
||||||
*
|
*
|
||||||
* We might have, so check if the printable version of the last
|
* We might have, so check if the printable version of the last
|
||||||
* computed value ('cur') and desired 'last' value are equal. If they
|
* computed value ('cur') and desired 'last' value are equal. If
|
||||||
* are equal after formatting truncation, but 'cur' and
|
* they are equal after formatting truncation, but 'cur' and 'prev'
|
||||||
* 'last_shown_value' are not equal, it means the exit condition of the
|
* are different, it means the exit condition of the loop held true
|
||||||
* loop held true due to a rounding error and we still need to print
|
* due to a rounding error and we still need to print 'last'.
|
||||||
* 'last'.
|
|
||||||
*/
|
*/
|
||||||
if (asprintf(&cur_print, fmt, cur) == -1 ||
|
if (asprintf(&cur_print, fmt, cur) == -1 ||
|
||||||
asprintf(&last_print, fmt, last) == -1)
|
asprintf(&last_print, fmt, last) == -1 ||
|
||||||
|
asprintf(&prev_print, fmt, prev) == -1)
|
||||||
err(1, "asprintf");
|
err(1, "asprintf");
|
||||||
if (strcmp(cur_print, last_print) == 0 && cur != last_shown_value) {
|
if (strcmp(cur_print, last_print) == 0 &&
|
||||||
|
strcmp(cur_print, prev_print) != 0) {
|
||||||
if (cur != first)
|
if (cur != first)
|
||||||
fputs(sep, stdout);
|
fputs(sep, stdout);
|
||||||
fputs(last_print, stdout);
|
fputs(last_print, stdout);
|
||||||
}
|
}
|
||||||
free(cur_print);
|
free(cur_print);
|
||||||
free(last_print);
|
free(last_print);
|
||||||
|
free(prev_print);
|
||||||
|
|
||||||
fputs(term, stdout);
|
fputs(term, stdout);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: rde.c,v 1.605 2023/04/20 15:44:45 claudio Exp $ */
|
/* $OpenBSD: rde.c,v 1.606 2023/06/12 12:48:07 claudio Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||||
|
@ -2828,7 +2828,6 @@ rde_dump_rib_as(struct prefix *p, struct rde_aspath *asp, pid_t pid, int flags,
|
||||||
struct rib_entry *re;
|
struct rib_entry *re;
|
||||||
struct prefix *xp;
|
struct prefix *xp;
|
||||||
struct rde_peer *peer;
|
struct rde_peer *peer;
|
||||||
void *bp;
|
|
||||||
time_t staletime;
|
time_t staletime;
|
||||||
size_t aslen;
|
size_t aslen;
|
||||||
uint8_t l;
|
uint8_t l;
|
||||||
|
@ -2931,15 +2930,10 @@ rde_dump_rib_as(struct prefix *p, struct rde_aspath *asp, pid_t pid, int flags,
|
||||||
if ((a = asp->others[l]) == NULL)
|
if ((a = asp->others[l]) == NULL)
|
||||||
break;
|
break;
|
||||||
if ((wbuf = imsg_create(ibuf_se_ctl,
|
if ((wbuf = imsg_create(ibuf_se_ctl,
|
||||||
IMSG_CTL_SHOW_RIB_ATTR, 0, pid,
|
IMSG_CTL_SHOW_RIB_ATTR, 0, pid, 0)) == NULL)
|
||||||
attr_optlen(a))) == NULL)
|
|
||||||
return;
|
return;
|
||||||
if ((bp = ibuf_reserve(wbuf, attr_optlen(a))) == NULL) {
|
if (attr_writebuf(wbuf, a->flags, a->type, a->data,
|
||||||
ibuf_free(wbuf);
|
a->len) == -1) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (attr_write(bp, attr_optlen(a), a->flags,
|
|
||||||
a->type, a->data, a->len) == -1) {
|
|
||||||
ibuf_free(wbuf);
|
ibuf_free(wbuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: rde.h,v 1.293 2023/04/19 13:23:33 claudio Exp $ */
|
/* $OpenBSD: rde.h,v 1.294 2023/06/12 12:48:07 claudio Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and
|
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and
|
||||||
|
@ -401,8 +401,6 @@ void attr_copy(struct rde_aspath *, const struct rde_aspath *);
|
||||||
int attr_compare(struct rde_aspath *, struct rde_aspath *);
|
int attr_compare(struct rde_aspath *, struct rde_aspath *);
|
||||||
void attr_freeall(struct rde_aspath *);
|
void attr_freeall(struct rde_aspath *);
|
||||||
void attr_free(struct rde_aspath *, struct attr *);
|
void attr_free(struct rde_aspath *, struct attr *);
|
||||||
#define attr_optlen(x) \
|
|
||||||
((x)->len > 255 ? (x)->len + 4 : (x)->len + 3)
|
|
||||||
|
|
||||||
struct aspath *aspath_get(void *, uint16_t);
|
struct aspath *aspath_get(void *, uint16_t);
|
||||||
struct aspath *aspath_copy(struct aspath *);
|
struct aspath *aspath_copy(struct aspath *);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: rde_attr.c,v 1.132 2022/12/14 12:37:15 claudio Exp $ */
|
/* $OpenBSD: rde_attr.c,v 1.133 2023/06/12 12:10:17 claudio Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
|
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
|
||||||
|
@ -85,7 +85,7 @@ attr_writebuf(struct ibuf *buf, uint8_t flags, uint8_t type, void *data,
|
||||||
|
|
||||||
if (ibuf_add(buf, hdr, flags & ATTR_EXTLEN ? 4 : 3) == -1)
|
if (ibuf_add(buf, hdr, flags & ATTR_EXTLEN ? 4 : 3) == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
if (data && ibuf_add(buf, data, data_len) == -1)
|
if (data != NULL && ibuf_add(buf, data, data_len) == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $OpenBSD: Makefile,v 1.30 2023/04/27 07:57:25 claudio Exp $
|
# $OpenBSD: Makefile,v 1.31 2023/06/12 14:56:38 claudio Exp $
|
||||||
|
|
||||||
PROG= rpki-client
|
PROG= rpki-client
|
||||||
SRCS= as.c aspa.c cert.c cms.c crl.c encoding.c filemode.c gbr.c geofeed.c \
|
SRCS= as.c aspa.c cert.c cms.c crl.c encoding.c filemode.c gbr.c geofeed.c \
|
||||||
|
@ -9,8 +9,8 @@ SRCS= as.c aspa.c cert.c cms.c crl.c encoding.c filemode.c gbr.c geofeed.c \
|
||||||
tal.c validate.c x509.c
|
tal.c validate.c x509.c
|
||||||
MAN= rpki-client.8
|
MAN= rpki-client.8
|
||||||
|
|
||||||
LDADD+= -lexpat -ltls -lssl -lcrypto -lutil
|
LDADD+= -lexpat -ltls -lssl -lcrypto -lutil -lz
|
||||||
DPADD+= ${LIBEXPAT} ${LIBTLS} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL}
|
DPADD+= ${LIBEXPAT} ${LIBTLS} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL} ${LIBZ}
|
||||||
|
|
||||||
CFLAGS+= -Wall -I${.CURDIR}
|
CFLAGS+= -Wall -I${.CURDIR}
|
||||||
CFLAGS+= -Wstrict-prototypes -Wmissing-prototypes
|
CFLAGS+= -Wstrict-prototypes -Wmissing-prototypes
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: cms.c,v 1.34 2023/05/30 11:09:08 tb Exp $ */
|
/* $OpenBSD: cms.c,v 1.35 2023/06/12 18:22:02 job Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
|
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
|
||||||
*
|
*
|
||||||
|
@ -315,11 +315,9 @@ cms_parse_validate_internal(X509 **xp, const char *fn, const unsigned char *der,
|
||||||
|
|
||||||
if (!x509_get_notafter(*xp, fn, ¬after))
|
if (!x509_get_notafter(*xp, fn, ¬after))
|
||||||
goto out;
|
goto out;
|
||||||
if (*signtime > notafter) {
|
if (*signtime > notafter)
|
||||||
warnx("%s: dating issue: CMS signing-time after X.509 notAfter",
|
warnx("%s: dating issue: CMS signing-time after X.509 notAfter",
|
||||||
fn);
|
fn);
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CMS_SignerInfo_get0_signer_id(si, &kid, NULL, NULL) != 1 ||
|
if (CMS_SignerInfo_get0_signer_id(si, &kid, NULL, NULL) != 1 ||
|
||||||
kid == NULL) {
|
kid == NULL) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: http.c,v 1.74 2023/05/10 15:24:41 claudio Exp $ */
|
/* $OpenBSD: http.c,v 1.76 2023/06/12 15:27:52 claudio Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020 Nils Fisher <nils_fisher@hotmail.com>
|
* Copyright (c) 2020 Nils Fisher <nils_fisher@hotmail.com>
|
||||||
* Copyright (c) 2020 Claudio Jeker <claudio@openbsd.org>
|
* Copyright (c) 2020 Claudio Jeker <claudio@openbsd.org>
|
||||||
|
@ -52,6 +52,7 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <imsg.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
@ -61,7 +62,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <vis.h>
|
#include <vis.h>
|
||||||
#include <imsg.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
|
|
||||||
|
@ -70,7 +71,7 @@
|
||||||
#define HTTP_USER_AGENT "OpenBSD rpki-client"
|
#define HTTP_USER_AGENT "OpenBSD rpki-client"
|
||||||
#define HTTP_BUF_SIZE (32 * 1024)
|
#define HTTP_BUF_SIZE (32 * 1024)
|
||||||
#define HTTP_IDLE_TIMEOUT 10
|
#define HTTP_IDLE_TIMEOUT 10
|
||||||
#define MAX_CONTENTLEN (2 * 1024 * 1024 * 1024LL)
|
#define MAX_CONTENTLEN (2 * 1024 * 1024 * 1024UL)
|
||||||
#define NPFDS (MAX_HTTP_REQUESTS + 1)
|
#define NPFDS (MAX_HTTP_REQUESTS + 1)
|
||||||
|
|
||||||
enum res {
|
enum res {
|
||||||
|
@ -104,6 +105,15 @@ struct http_proxy {
|
||||||
char *proxyauth;
|
char *proxyauth;
|
||||||
} proxy;
|
} proxy;
|
||||||
|
|
||||||
|
struct http_zlib {
|
||||||
|
z_stream zs;
|
||||||
|
char *zbuf;
|
||||||
|
size_t zbufsz;
|
||||||
|
size_t zbufpos;
|
||||||
|
size_t zinsz;
|
||||||
|
int zdone;
|
||||||
|
};
|
||||||
|
|
||||||
struct http_connection {
|
struct http_connection {
|
||||||
LIST_ENTRY(http_connection) entry;
|
LIST_ENTRY(http_connection) entry;
|
||||||
char *host;
|
char *host;
|
||||||
|
@ -116,15 +126,17 @@ struct http_connection {
|
||||||
struct addrinfo *res;
|
struct addrinfo *res;
|
||||||
struct tls *tls;
|
struct tls *tls;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
struct http_zlib *zlibctx;
|
||||||
size_t bufsz;
|
size_t bufsz;
|
||||||
size_t bufpos;
|
size_t bufpos;
|
||||||
off_t iosz;
|
size_t iosz;
|
||||||
off_t totalsz;
|
size_t totalsz;
|
||||||
time_t idle_time;
|
time_t idle_time;
|
||||||
time_t io_time;
|
time_t io_time;
|
||||||
int status;
|
int status;
|
||||||
int fd;
|
int fd;
|
||||||
int chunked;
|
int chunked;
|
||||||
|
int gzipped;
|
||||||
int keep_alive;
|
int keep_alive;
|
||||||
short events;
|
short events;
|
||||||
enum http_state state;
|
enum http_state state;
|
||||||
|
@ -164,6 +176,13 @@ static void http_req_done(unsigned int, enum http_result, const char *);
|
||||||
static void http_req_fail(unsigned int);
|
static void http_req_fail(unsigned int);
|
||||||
static int http_req_schedule(struct http_request *);
|
static int http_req_schedule(struct http_request *);
|
||||||
|
|
||||||
|
/* HTTP decompression helper */
|
||||||
|
static int http_inflate_new(struct http_connection *);
|
||||||
|
static void http_inflate_free(struct http_connection *);
|
||||||
|
static void http_inflate_done(struct http_connection *);
|
||||||
|
static int http_inflate_data(struct http_connection *);
|
||||||
|
static enum res http_inflate_advance(struct http_connection *);
|
||||||
|
|
||||||
/* HTTP connection API */
|
/* HTTP connection API */
|
||||||
static void http_new(struct http_request *);
|
static void http_new(struct http_request *);
|
||||||
static void http_free(struct http_connection *);
|
static void http_free(struct http_connection *);
|
||||||
|
@ -191,6 +210,7 @@ static enum res http_write(struct http_connection *);
|
||||||
static enum res proxy_read(struct http_connection *);
|
static enum res proxy_read(struct http_connection *);
|
||||||
static enum res proxy_write(struct http_connection *);
|
static enum res proxy_write(struct http_connection *);
|
||||||
static enum res data_write(struct http_connection *);
|
static enum res data_write(struct http_connection *);
|
||||||
|
static enum res data_inflate_write(struct http_connection *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a string that can be used in error message to identify the
|
* Return a string that can be used in error message to identify the
|
||||||
|
@ -666,6 +686,141 @@ http_req_schedule(struct http_request *req)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate everything to allow inline decompression during write out.
|
||||||
|
* Returns 0 on success, -1 on failure.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
http_inflate_new(struct http_connection *conn)
|
||||||
|
{
|
||||||
|
struct http_zlib *zctx;
|
||||||
|
|
||||||
|
if (conn->zlibctx != NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((zctx = calloc(1, sizeof(*zctx))) == NULL)
|
||||||
|
goto fail;
|
||||||
|
zctx->zbufsz = HTTP_BUF_SIZE;
|
||||||
|
if ((zctx->zbuf = malloc(zctx->zbufsz)) == NULL)
|
||||||
|
goto fail;
|
||||||
|
if (inflateInit2(&zctx->zs, MAX_WBITS + 32) != Z_OK)
|
||||||
|
goto fail;
|
||||||
|
conn->zlibctx = zctx;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
warnx("%s: decompression initalisation failed", conn_info(conn));
|
||||||
|
if (zctx != NULL)
|
||||||
|
free(zctx->zbuf);
|
||||||
|
free(zctx);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free all memory used by the decompression API */
|
||||||
|
static void
|
||||||
|
http_inflate_free(struct http_connection *conn)
|
||||||
|
{
|
||||||
|
if (conn->zlibctx == NULL)
|
||||||
|
return;
|
||||||
|
inflateEnd(&conn->zlibctx->zs);
|
||||||
|
free(conn->zlibctx->zbuf);
|
||||||
|
free(conn->zlibctx);
|
||||||
|
conn->zlibctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset the decompression state to allow a new request to use it */
|
||||||
|
static void
|
||||||
|
http_inflate_done(struct http_connection *conn)
|
||||||
|
{
|
||||||
|
if (inflateReset(&conn->zlibctx->zs) != Z_OK)
|
||||||
|
http_inflate_free(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Inflate the data from conn->buf into zctx->zbuf. The number of bytes
|
||||||
|
* available in zctx->zbuf is stored in zctx->zbufpos.
|
||||||
|
* Returns -1 on failure.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
http_inflate_data(struct http_connection *conn)
|
||||||
|
{
|
||||||
|
struct http_zlib *zctx = conn->zlibctx;
|
||||||
|
size_t bsz = conn->bufpos;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
if (conn->iosz < bsz)
|
||||||
|
bsz = conn->iosz;
|
||||||
|
|
||||||
|
zctx->zdone = 0;
|
||||||
|
zctx->zbufpos = 0;
|
||||||
|
zctx->zinsz = bsz;
|
||||||
|
zctx->zs.next_in = conn->buf;
|
||||||
|
zctx->zs.avail_in = bsz;
|
||||||
|
zctx->zs.next_out = zctx->zbuf;
|
||||||
|
zctx->zs.avail_out = zctx->zbufsz;
|
||||||
|
|
||||||
|
switch ((rv = inflate(&zctx->zs, Z_NO_FLUSH))) {
|
||||||
|
case Z_OK:
|
||||||
|
break;
|
||||||
|
case Z_STREAM_END:
|
||||||
|
zctx->zdone = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (zctx->zs.msg != NULL)
|
||||||
|
warnx("%s: inflate failed: %s", conn_info(conn),
|
||||||
|
zctx->zs.msg);
|
||||||
|
else
|
||||||
|
warnx("%s: inflate failed error %d", conn_info(conn),
|
||||||
|
rv);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate how much can be written out */
|
||||||
|
zctx->zbufpos = zctx->zbufsz - zctx->zs.avail_out;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Advance the input buffer after the output buffer has been fully written.
|
||||||
|
* If compression is done finish the transaction else read more data.
|
||||||
|
*/
|
||||||
|
static enum res
|
||||||
|
http_inflate_advance(struct http_connection *conn)
|
||||||
|
{
|
||||||
|
struct http_zlib *zctx = conn->zlibctx;
|
||||||
|
size_t bsz = zctx->zinsz - zctx->zs.avail_in;
|
||||||
|
|
||||||
|
/* adjust compressed input buffer */
|
||||||
|
conn->bufpos -= bsz;
|
||||||
|
conn->iosz -= bsz;
|
||||||
|
memmove(conn->buf, conn->buf + bsz, conn->bufpos);
|
||||||
|
|
||||||
|
if (zctx->zdone) {
|
||||||
|
/* all compressed data processed */
|
||||||
|
conn->gzipped = 0;
|
||||||
|
http_inflate_done(conn);
|
||||||
|
|
||||||
|
if (conn->iosz == 0) {
|
||||||
|
if (!conn->chunked) {
|
||||||
|
return http_done(conn, HTTP_OK);
|
||||||
|
} else {
|
||||||
|
conn->state = STATE_RESPONSE_CHUNKED_CRLF;
|
||||||
|
return http_read(conn);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warnx("%s: inflate extra data after end",
|
||||||
|
conn_info(conn));
|
||||||
|
return http_failed(conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conn->chunked && conn->iosz == 0)
|
||||||
|
conn->state = STATE_RESPONSE_CHUNKED_CRLF;
|
||||||
|
else
|
||||||
|
conn->state = STATE_RESPONSE_DATA;
|
||||||
|
return http_read(conn);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new HTTP connection which will be used for the HTTP request req.
|
* Create a new HTTP connection which will be used for the HTTP request req.
|
||||||
* On errors a req faulure is issued and both connection and request are freed.
|
* On errors a req faulure is issued and both connection and request are freed.
|
||||||
|
@ -722,6 +877,7 @@ http_free(struct http_connection *conn)
|
||||||
http_conn_count--;
|
http_conn_count--;
|
||||||
|
|
||||||
http_req_free(conn->req);
|
http_req_free(conn->req);
|
||||||
|
http_inflate_free(conn);
|
||||||
free(conn->host);
|
free(conn->host);
|
||||||
free(conn->port);
|
free(conn->port);
|
||||||
free(conn->last_modified);
|
free(conn->last_modified);
|
||||||
|
@ -752,6 +908,11 @@ http_done(struct http_connection *conn, enum http_result res)
|
||||||
assert(conn->chunked == 0);
|
assert(conn->chunked == 0);
|
||||||
assert(conn->redir_uri == NULL);
|
assert(conn->redir_uri == NULL);
|
||||||
|
|
||||||
|
if (conn->gzipped) {
|
||||||
|
conn->gzipped = 0;
|
||||||
|
http_inflate_done(conn);
|
||||||
|
}
|
||||||
|
|
||||||
conn->state = STATE_IDLE;
|
conn->state = STATE_IDLE;
|
||||||
conn->idle_time = getmonotime() + HTTP_IDLE_TIMEOUT;
|
conn->idle_time = getmonotime() + HTTP_IDLE_TIMEOUT;
|
||||||
|
|
||||||
|
@ -945,12 +1106,12 @@ http_tls_connect(struct http_connection *conn)
|
||||||
return http_failed(conn);
|
return http_failed(conn);
|
||||||
}
|
}
|
||||||
if (tls_configure(conn->tls, tls_config) == -1) {
|
if (tls_configure(conn->tls, tls_config) == -1) {
|
||||||
warnx("%s: TLS configuration: %s\n", conn_info(conn),
|
warnx("%s: TLS configuration: %s", conn_info(conn),
|
||||||
tls_error(conn->tls));
|
tls_error(conn->tls));
|
||||||
return http_failed(conn);
|
return http_failed(conn);
|
||||||
}
|
}
|
||||||
if (tls_connect_socket(conn->tls, conn->fd, conn->host) == -1) {
|
if (tls_connect_socket(conn->tls, conn->fd, conn->host) == -1) {
|
||||||
warnx("%s: TLS connect: %s\n", conn_info(conn),
|
warnx("%s: TLS connect: %s", conn_info(conn),
|
||||||
tls_error(conn->tls));
|
tls_error(conn->tls));
|
||||||
return http_failed(conn);
|
return http_failed(conn);
|
||||||
}
|
}
|
||||||
|
@ -1060,7 +1221,7 @@ http_request(struct http_connection *conn)
|
||||||
if ((r = asprintf(&conn->buf,
|
if ((r = asprintf(&conn->buf,
|
||||||
"GET /%s HTTP/1.1\r\n"
|
"GET /%s HTTP/1.1\r\n"
|
||||||
"Host: %s\r\n"
|
"Host: %s\r\n"
|
||||||
"Accept-Encoding: identity\r\n"
|
"Accept-Encoding: gzip, deflate\r\n"
|
||||||
"User-Agent: " HTTP_USER_AGENT "\r\n"
|
"User-Agent: " HTTP_USER_AGENT "\r\n"
|
||||||
"%s\r\n",
|
"%s\r\n",
|
||||||
epath, host,
|
epath, host,
|
||||||
|
@ -1195,6 +1356,7 @@ http_parse_header(struct http_connection *conn, char *buf)
|
||||||
#define LOCATION "Location:"
|
#define LOCATION "Location:"
|
||||||
#define CONNECTION "Connection:"
|
#define CONNECTION "Connection:"
|
||||||
#define TRANSFER_ENCODING "Transfer-Encoding:"
|
#define TRANSFER_ENCODING "Transfer-Encoding:"
|
||||||
|
#define CONTENT_ENCODING "Content-Encoding:"
|
||||||
#define LAST_MODIFIED "Last-Modified:"
|
#define LAST_MODIFIED "Last-Modified:"
|
||||||
const char *errstr;
|
const char *errstr;
|
||||||
char *cp, *redirurl;
|
char *cp, *redirurl;
|
||||||
|
@ -1263,6 +1425,17 @@ http_parse_header(struct http_connection *conn, char *buf)
|
||||||
cp[strcspn(cp, " \t")] = '\0';
|
cp[strcspn(cp, " \t")] = '\0';
|
||||||
if (strcasecmp(cp, "chunked") == 0)
|
if (strcasecmp(cp, "chunked") == 0)
|
||||||
conn->chunked = 1;
|
conn->chunked = 1;
|
||||||
|
} else if (strncasecmp(cp, CONTENT_ENCODING,
|
||||||
|
sizeof(CONTENT_ENCODING) - 1) == 0) {
|
||||||
|
cp += sizeof(CONTENT_ENCODING) - 1;
|
||||||
|
cp += strspn(cp, " \t");
|
||||||
|
cp[strcspn(cp, " \t")] = '\0';
|
||||||
|
if (strcasecmp(cp, "gzip") == 0 ||
|
||||||
|
strcasecmp(cp, "deflate") == 0) {
|
||||||
|
if (http_inflate_new(conn) == -1)
|
||||||
|
return -1;
|
||||||
|
conn->gzipped = 1;
|
||||||
|
}
|
||||||
} else if (strncasecmp(cp, CONNECTION, sizeof(CONNECTION) - 1) == 0) {
|
} else if (strncasecmp(cp, CONNECTION, sizeof(CONNECTION) - 1) == 0) {
|
||||||
cp += sizeof(CONNECTION) - 1;
|
cp += sizeof(CONNECTION) - 1;
|
||||||
cp += strspn(cp, " \t");
|
cp += strspn(cp, " \t");
|
||||||
|
@ -1332,7 +1505,7 @@ http_parse_chunked(struct http_connection *conn, char *buf)
|
||||||
errno = 0;
|
errno = 0;
|
||||||
chunksize = strtoul(header, &end, 16);
|
chunksize = strtoul(header, &end, 16);
|
||||||
if (header[0] == '\0' || *end != '\0' || (errno == ERANGE &&
|
if (header[0] == '\0' || *end != '\0' || (errno == ERANGE &&
|
||||||
chunksize == ULONG_MAX) || chunksize > INT_MAX)
|
chunksize == ULONG_MAX) || chunksize > MAX_CONTENTLEN)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
conn->iosz = chunksize;
|
conn->iosz = chunksize;
|
||||||
|
@ -1452,7 +1625,7 @@ again:
|
||||||
return http_failed(conn);
|
return http_failed(conn);
|
||||||
case STATE_RESPONSE_DATA:
|
case STATE_RESPONSE_DATA:
|
||||||
if (conn->bufpos != conn->bufsz &&
|
if (conn->bufpos != conn->bufsz &&
|
||||||
conn->iosz > (off_t)conn->bufpos)
|
conn->iosz > conn->bufpos)
|
||||||
goto read_more;
|
goto read_more;
|
||||||
|
|
||||||
/* got a buffer full of data */
|
/* got a buffer full of data */
|
||||||
|
@ -1460,7 +1633,7 @@ again:
|
||||||
/*
|
/*
|
||||||
* After redirects all data needs to be discarded.
|
* After redirects all data needs to be discarded.
|
||||||
*/
|
*/
|
||||||
if (conn->iosz < (off_t)conn->bufpos) {
|
if (conn->iosz < conn->bufpos) {
|
||||||
conn->bufpos -= conn->iosz;
|
conn->bufpos -= conn->iosz;
|
||||||
conn->iosz = 0;
|
conn->iosz = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1696,7 +1869,7 @@ data_write(struct http_connection *conn)
|
||||||
|
|
||||||
assert(conn->state == STATE_WRITE_DATA);
|
assert(conn->state == STATE_WRITE_DATA);
|
||||||
|
|
||||||
if (conn->iosz < (off_t)bsz)
|
if (conn->iosz < bsz)
|
||||||
bsz = conn->iosz;
|
bsz = conn->iosz;
|
||||||
|
|
||||||
s = write(conn->req->outfd, conn->buf, bsz);
|
s = write(conn->req->outfd, conn->buf, bsz);
|
||||||
|
@ -1732,6 +1905,49 @@ data_write(struct http_connection *conn)
|
||||||
return WANT_POLLOUT;
|
return WANT_POLLOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Inflate and write data into provided file descriptor.
|
||||||
|
* This is a simplified version of data_write() that just writes out the
|
||||||
|
* decompressed file stream. All the buffer handling is done by
|
||||||
|
* http_inflate_data() and http_inflate_advance().
|
||||||
|
*/
|
||||||
|
static enum res
|
||||||
|
data_inflate_write(struct http_connection *conn)
|
||||||
|
{
|
||||||
|
struct http_zlib *zctx = conn->zlibctx;
|
||||||
|
ssize_t s;
|
||||||
|
|
||||||
|
assert(conn->state == STATE_WRITE_DATA);
|
||||||
|
|
||||||
|
/* no decompressed data, get more */
|
||||||
|
if (zctx->zbufpos == 0)
|
||||||
|
if (http_inflate_data(conn) == -1)
|
||||||
|
return http_failed(conn);
|
||||||
|
|
||||||
|
s = write(conn->req->outfd, zctx->zbuf, zctx->zbufpos);
|
||||||
|
if (s == -1) {
|
||||||
|
warn("%s: data write", conn_info(conn));
|
||||||
|
return http_failed(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
conn->totalsz += s;
|
||||||
|
if (conn->totalsz > MAX_CONTENTLEN) {
|
||||||
|
warn("%s: too much decompressed data offered", conn_info(conn));
|
||||||
|
return http_failed(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adjust output buffer */
|
||||||
|
zctx->zbufpos -= s;
|
||||||
|
memmove(zctx->zbuf, zctx->zbuf + s, zctx->zbufpos);
|
||||||
|
|
||||||
|
/* all decompressed data written, progress input */
|
||||||
|
if (zctx->zbufpos == 0)
|
||||||
|
return http_inflate_advance(conn);
|
||||||
|
|
||||||
|
/* still more data to write in buffer */
|
||||||
|
return WANT_POLLOUT;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do one IO call depending on the connection state.
|
* Do one IO call depending on the connection state.
|
||||||
* Return WANT_POLLIN or WANT_POLLOUT to poll for more data.
|
* Return WANT_POLLIN or WANT_POLLOUT to poll for more data.
|
||||||
|
@ -1765,6 +1981,9 @@ http_handle(struct http_connection *conn)
|
||||||
case STATE_RESPONSE_CHUNKED_TRAILER:
|
case STATE_RESPONSE_CHUNKED_TRAILER:
|
||||||
return http_read(conn);
|
return http_read(conn);
|
||||||
case STATE_WRITE_DATA:
|
case STATE_WRITE_DATA:
|
||||||
|
if (conn->gzipped)
|
||||||
|
return data_inflate_write(conn);
|
||||||
|
else
|
||||||
return data_write(conn);
|
return data_write(conn);
|
||||||
case STATE_CLOSE:
|
case STATE_CLOSE:
|
||||||
return http_close(conn);
|
return http_close(conn);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue