This commit is contained in:
purplerain 2023-05-16 22:16:59 +00:00
parent ab90ba3a7c
commit 9e5eddc6af
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
57 changed files with 838 additions and 537 deletions

View file

@ -3,9 +3,7 @@
SUBDIR= special notes
.if make(obj)
SUBDIR+=alpha amd64 armv7 arm64 hppa i386 \
landisk loongson luna88k macppc \
octeon powerpc64 riscv64 sparc64
SUBDIR+=amd64 armv7 arm64
.elif exists(${MACHINE})
SUBDIR+=${MACHINE}
.endif

View file

@ -1819,9 +1819,12 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
if (IndirectBranches)
CmdArgs.push_back("-mbranch-target-enforce");
} else {
if (Triple.isOSOpenBSD())
if (Triple.isOSOpenBSD()) {
CmdArgs.push_back("-msign-return-address=non-leaf");
CmdArgs.push_back("-msign-return-address-key=a_key");
CmdArgs.push_back("-mbranch-target-enforce");
}
}
// Handle -msve_vector_bits=<bits>
if (Arg *A = Args.getLastArg(options::OPT_msve_vector_bits_EQ)) {

View file

@ -621,7 +621,11 @@ private:
} // namespace
AArch64BtiPac::AArch64BtiPac() {
#ifdef __OpenBSD__
btiHeader = true;
#else
btiHeader = (config->andFeatures & GNU_PROPERTY_AARCH64_FEATURE_1_BTI);
#endif
// A BTI (Branch Target Indicator) Plt Entry is only required if the
// address of the PLT entry can be taken by the program, which permits an
// indirect jump to the PLT entry. This can happen when the address
@ -717,6 +721,10 @@ void AArch64BtiPac::writePlt(uint8_t *buf, const Symbol &sym,
}
static TargetInfo *getTargetInfo() {
#ifdef __OpenBSD__
static AArch64BtiPac t;
return &t;
#else
if (config->andFeatures & (GNU_PROPERTY_AARCH64_FEATURE_1_BTI |
GNU_PROPERTY_AARCH64_FEATURE_1_PAC)) {
static AArch64BtiPac t;
@ -724,6 +732,7 @@ static TargetInfo *getTargetInfo() {
}
static AArch64 t;
return &t;
#endif
}
TargetInfo *elf::getAArch64TargetInfo() { return getTargetInfo(); }

View file

@ -99,6 +99,7 @@ static void SIMD_Fixup (int, int);
static void PNI_Fixup (int, int);
static void XCR_Fixup (int, int);
static void SVME_Fixup (int, int);
static void SSP_Fixup (int, int);
static void INVLPG_Fixup (int, int);
static void BadOp (void);
static void SEG_Fixup (int, int);
@ -106,6 +107,7 @@ static void VMX_Fixup (int, int);
static void REP_Fixup (int, int);
static void OP_0f38 (int, int);
static void OP_0f3a (int, int);
static void OP_0f1e (int, int);
static void OP_data (int, int);
struct dis_private {
@ -324,6 +326,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
#define OP0FAE OP_0fae, v_mode
#define OP0F38 OP_0f38, 0
#define OP0F3A OP_0f3a, 0
#define OP0F1E OP_0f1e, v_mode
#define OPDATA OP_data, 0
/* Used handle "rep" prefix for string instructions. */
@ -471,6 +474,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
#define PREGRP30 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 30, NULL, 0
#define PREGRP31 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 31, NULL, 0
#define PREGRP32 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 32, NULL, 0
#define PREGRP33 NULL, NULL, USE_PREFIX_USER_TABLE, NULL, 33, NULL, 0
#define X86_64_0 NULL, NULL, X86_64_SPECIAL, NULL, 0, NULL, 0
@ -494,6 +498,7 @@ struct dis386 {
'B' => print 'b' if suffix_always is true
'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
. size prefix
'D' => print '64' in place of rex64 prefix
'E' => print 'e' if 32-bit form of jcxz
'F' => print 'w' or 'l' depending on address size prefix (loop insns)
'H' => print ",pt" or ",pn" branch hint
@ -852,7 +857,7 @@ static const struct dis386 dis386_twobyte[] = {
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ PREGRP33 },
{ "(bad)", XX, XX, XX },
/* 20 */
{ "movZ", Rm, Cm, XX },
@ -1135,7 +1140,7 @@ static const unsigned char twobyte_has_modrm[256] = {
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/* ------------------------------- */
/* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
/* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */
/* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0, /* 1f */
/* 20 */ 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 2f */
/* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
/* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
@ -1416,7 +1421,7 @@ static const struct dis386 grps[][8] = {
{ "lgdt{Q|Q||}", XCR_Fixup, 0, XX, XX },
{ "lidt{Q|Q||}", SVME_Fixup, 0, XX, XX },
{ "smswQ", Ev, XX, XX },
{ "(bad)", XX, XX, XX },
{ "", SSP_Fixup, 0, XX, XX },
{ "lmsw", Ew, XX, XX },
{ "invlpg", INVLPG_Fixup, w_mode, XX, XX },
},
@ -1436,9 +1441,9 @@ static const struct dis386 grps[][8] = {
{ "(bad)", XX, XX, XX },
{ "cmpxchg8b", Eq, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "(bad)", XX, XX, XX },
{ "xrstorsD",Ev, XX, XX },
{ "xsavecD",Ev, XX, XX },
{ "xsavesD",Ev, XX, XX },
{ "", VM, XX, XX }, /* See OP_VMX. */
{ "", VM2, XX, XX },
},
@ -1477,13 +1482,13 @@ static const struct dis386 grps[][8] = {
},
/* GRP13 */
{
{ "fxsave", OP0FAE, XX, XX },
{ "fxrstor", OP0FAE, XX, XX },
{ "fxsaveD", OP0FAE, XX, XX },
{ "fxrstorD", OP0FAE, XX, XX },
{ "ldmxcsr", OP0FAE, XX, XX },
{ "stmxcsr", OP0FAE, XX, XX },
{ "xsave", Ev, XX, XX },
{ "xrstor", OP0FAE, XX, XX },
{ "xsaveopt", OP0FAE, XX, XX },
{ "xsaveD", OP0FAE, XX, XX },
{ "xrstorD", OP0FAE, XX, XX },
{ "xsaveoptD",OP0FAE, XX, XX },
{ "clflush", OP0FAE, XX, XX },
},
/* GRP14 */
@ -1529,7 +1534,7 @@ static const struct dis386 grps[][8] = {
{ "(bad)", OP_0f07, 0, XX, XX },
{ "(bad)", OP_0f07, 0, XX, XX },
{ "(bad)", OP_0f07, 0, XX, XX },
}
},
};
static const struct dis386 prefix_user_table[][4] = {
@ -1764,6 +1769,13 @@ static const struct dis386 prefix_user_table[][4] = {
{ "(bad)", XM, EX, XX },
{ "lddqu", XM, M, XX },
},
/* PREGRP33 */
{
{ "(bad)", XM, EX, XX },
{ "", OP0F1E, XX, XX },
{ "(bad)", XM, EX, XX },
{ "(bad)", XM, EX, XX },
},
};
static const struct dis386 x86_64_table[][2] = {
@ -3397,6 +3409,14 @@ putop (const char *template, int sizeflag)
used_prefixes |= (prefixes & PREFIX_DATA);
}
break;
case 'D':
USED_REX (REX_MODE64);
if (rex & REX_MODE64)
{
*obufp++ = '6';
*obufp++ = '4';
}
break;
case 'E': /* For jcxz/jecxz */
if (address_mode == mode_64bit)
{
@ -4828,9 +4848,110 @@ OP_0f07 (int bytemode, int sizeflag)
OP_E (bytemode, sizeflag);
}
static void
OP_0f1e (int bytemode, int sizeflag)
{
used_prefixes |= PREFIX_REPZ;
switch (*codep++)
{
case 0xfa:
strcpy (obuf, "endbr64");
break;
case 0xfb:
strcpy (obuf, "endbr32");
break;
default:
USED_REX (REX_MODE64);
if (rex & REX_MODE64)
strcpy (obuf, "rdsspq");
else
strcpy (obuf, "rdsspd");
OP_E (bytemode, sizeflag);
return;
}
}
static void
OP_0fae (int bytemode, int sizeflag)
{
if (prefixes & PREFIX_REPZ)
{
used_prefixes |= PREFIX_REPZ;
if (mod != 3)
{
if (reg == 6)
{
strcpy (obuf, "clrssbsy");
OP_E (bytemode, sizeflag);
}
else
BadOp ();
return;
}
switch (reg)
{
case 0:
strcpy (obuf, "rdfsbase");
break;
case 1:
strcpy (obuf, "rdgsbase");
break;
case 2:
strcpy (obuf, "wrfsbase");
break;
case 3:
strcpy (obuf, "wrgsbase");
break;
case 4:
strcpy (obuf, "ptwrite");
break;
case 5:
USED_REX (REX_MODE64);
if (rex & REX_MODE64)
strcpy (obuf, "incsspq");
else
strcpy (obuf, "incsspd");
break;
case 6:
strcpy (obuf, "umonitor"); /* XXX wrong size for r16/r32/r64 arg */
break;
case 7:
BadOp ();
return;
}
OP_E (bytemode, sizeflag);
return;
}
if (prefixes & PREFIX_REPNZ)
{
if (mod == 3 && reg == 6)
{
used_prefixes |= PREFIX_REPNZ;
strcpy (obuf, "umwait");
OP_E (bytemode, sizeflag);
}
else
BadOp ();
return;
}
if (prefixes & PREFIX_DATA)
{
if (mod != 3 && reg >= 6)
strcpy (obuf, reg == 6 ? "clwb" : "clflushopt");
else if (mod == 3 && reg == 6)
strcpy (obuf, "tpause"); /* XXX wrong size for r16/r32/r64 arg */
else
{
BadOp ();
return;
}
used_prefixes |= PREFIX_DATA;
OP_E (bytemode, sizeflag);
return;
}
if (mod == 3)
{
if (reg == 7)
@ -4839,21 +4960,9 @@ OP_0fae (int bytemode, int sizeflag)
strcpy (obuf + strlen (obuf) - sizeof ("xsaveopt") + 1, "mfence");
else if (reg == 5)
strcpy (obuf + strlen (obuf) - sizeof ("xrstor") + 1, "lfence");
if (reg < 4 && prefixes == PREFIX_REPZ)
else if (reg < 5)
{
if (reg == 0)
strcpy (obuf, "rdfsbase");
else if (reg == 1)
strcpy (obuf, "rdgsbase");
else if (reg == 2)
strcpy (obuf, "wrfsbase");
else
strcpy (obuf, "wrgsbase");
}
else if (reg < 5 || rm != 0)
{
BadOp (); /* bad sfence, mfence, or lfence */
BadOp ();
return;
}
}
@ -5031,6 +5140,7 @@ SIMD_Fixup (int extrachar, int sizeflag ATTRIBUTE_UNUSED)
static void
PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
{
/* missing: encls==np0f01cf */
if (mod == 3 && reg == 1 && rm <= 1)
{
/* Override "sidt". */
@ -5105,7 +5215,8 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
static void
XCR_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
{
if (mod == 3 && reg == 2 && rm <= 1)
if (mod == 3 && reg == 2 && (rm <= 1 || rm >= 4) &&
(prefixes & (PREFIX_REPZ|PREFIX_REPNZ|PREFIX_DATA)) == 0)
{
/* Override "lgdt". */
size_t olen = strlen (obuf);
@ -5125,13 +5236,26 @@ XCR_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
|| strncmp (p - 3, "32", 2) == 0))
p -= 7;
if (rm)
{
strcpy (p, "xsetbv");
}
else
switch (rm)
{
case 0:
strcpy (p, "xgetbv");
break;
case 1:
strcpy (p, "xsetbv");
break;
case 4:
strcpy (p, "vmfunc");
break;
case 5:
strcpy (p, "xend");
break;
case 6:
strcpy (p, "xtest");
break;
case 7:
strcpy (p, "enclu");
break;
}
codep++;
@ -5210,6 +5334,78 @@ SVME_Fixup (int bytemode, int sizeflag)
}
}
static void
SSP_Fixup (int bytemode, int sizeflag)
{
used_prefixes |= (prefixes & (PREFIX_REPZ | PREFIX_REPNZ));
if (mod != 3)
{
if (prefixes & PREFIX_REPZ)
{
strcpy (obuf, "rstorssp");
OP_M (bytemode, sizeflag);
}
else
BadOp ();
return;
}
if (prefixes & PREFIX_REPZ)
switch (*codep++)
{
case 0xe8:
strcpy (obuf, "setssbsy");
break;
case 0xea:
strcpy (obuf, "saveprevssp");
break;
case 0xec:
strcpy (obuf, "uiret");
break;
case 0xed:
strcpy (obuf, "testui");
break;
case 0xee:
strcpy (obuf, "clui");
break;
case 0xef:
strcpy (obuf, "stui");
break;
default:
break;
}
else if (prefixes & PREFIX_REPNZ)
switch (*codep)
{
case 0xe8:
strcpy (obuf, "xsusldtrk");
break;
case 0xe9:
strcpy (obuf, "xresldtrk");
break;
default:
BadOp ();
return;
}
else
switch (*codep)
{
case 0xe8:
strcpy (obuf, "serialize");
break;
case 0xee:
strcpy (obuf, "rdpkru");
break;
case 0xef:
strcpy (obuf, "wrpkru");
break;
default:
BadOp ();
return;
}
codep++;
}
static void
INVLPG_Fixup (int bytemode, int sizeflag)
{
@ -5292,6 +5488,7 @@ SEG_Fixup (int extrachar, int sizeflag)
static void
VMX_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
{
/* missing: enclv==np0f01c0 pconfig==np0f01c5 */
if (mod == 3 && reg == 0 && rm >=1 && rm <= 4)
{
/* Override "sgdt". */
@ -5327,10 +5524,19 @@ static void
OP_VMX (int bytemode, int sizeflag)
{
if (mod == 3)
{
used_prefixes |= (prefixes & PREFIX_REPZ);
if (prefixes & PREFIX_REPZ)
{
strcpy (obuf, "senduipi");
OP_G (m_mode, sizeflag);
}
else
{
strcpy (obuf, "rdrand");
OP_E (v_mode, sizeflag);
}
}
else
{
used_prefixes |= (prefixes & (PREFIX_DATA | PREFIX_REPZ));
@ -5349,6 +5555,10 @@ OP_VMX2 (int bytemode ATTRIBUTE_UNUSED, int sizeflag)
{
if (mod == 3)
{
used_prefixes |= (prefixes & PREFIX_REPZ);
if (prefixes & PREFIX_REPZ)
strcpy (obuf, "rdpid");
else
strcpy (obuf, "rdseed");
OP_E (v_mode, sizeflag);
}

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: sysctl.2,v 1.51 2022/11/07 15:32:24 jmc Exp $
.\" $OpenBSD: sysctl.2,v 1.52 2023/05/16 21:13:19 jmc Exp $
.\"
.\" Copyright (c) 1993
.\" The Regents of the University of California. All rights reserved.
@ -27,7 +27,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd $Mdocdate: November 7 2022 $
.Dd $Mdocdate: May 16 2023 $
.Dt SYSCTL 2
.Os
.Sh NAME
@ -1336,6 +1336,7 @@ The currently defined protocols and names are:
.It tcp Ta syncachelimit Ta integer Ta yes
.It tcp Ta synhashsize Ta integer Ta yes
.It tcp Ta synuselimit Ta integer Ta yes
.It tcp Ta tso Ta integer Ta yes
.It udp Ta baddynamic Ta array Ta yes
.It udp Ta checksum Ta integer Ta yes
.It udp Ta recvspace Ta integer Ta yes
@ -1742,6 +1743,9 @@ SYN cache becomes empty and both SYN caches are swapped.
.It Li tcp.synuselimit Pq Va net.inet.tcp.synuselimit
The minimum number of times the hash function for the TCP SYN cache is used
before it is reseeded.
.It Li tcp.tso Pq Va net.inet.tcp.tso
If set to 0, disable TCP segmentation offload (TSO).
If set to 1, TSO is enabled (the default).
.It Li udp.baddynamic Pq Va net.inet.udp.baddynamic
Analogous to
.Li tcp.baddynamic

View file

@ -1,4 +1,4 @@
/* $OpenBSD: sha512.c,v 1.35 2023/05/12 10:10:55 jsing Exp $ */
/* $OpenBSD: sha512.c,v 1.36 2023/05/16 07:04:57 jsing Exp $ */
/* ====================================================================
* Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
*
@ -153,27 +153,29 @@ static const SHA_LONG64 K512[80] = {
#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z)))
#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define ROUND_00_15(i, a, b, c, d, e, f, g, h) do { \
T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; \
h = Sigma0(a) + Maj(a, b, c); \
d += T1; h += T1; } while (0)
#define ROUND_00_15(i, a, b, c, d, e, f, g, h, Wt) do { \
T1 = h + Sigma1(e) + Ch(e, f, g) + K512[i] + Wt; \
T2 = Sigma0(a) + Maj(a, b, c); \
d += T1; \
h = T1 + T2; \
} while (0)
#define ROUND_16_80(i, j, a, b, c, d, e, f, g, h, X) do { \
s0 = X[(j+1)&0x0f]; s0 = sigma0(s0); \
s1 = X[(j+14)&0x0f]; s1 = sigma1(s1); \
T1 = X[(j)&0x0f] += s0 + s1 + X[(j+9)&0x0f]; \
ROUND_00_15(i+j, a, b, c, d, e, f, g, h); } while (0)
s0 = sigma0(X[(j + 1) & 0x0f]); \
s1 = sigma1(X[(j + 14) & 0x0f]); \
X[(j) & 0x0f] += s0 + s1 + X[(j + 9) & 0x0f]; \
ROUND_00_15(i + j, a, b, c, d, e, f, g, h, X[(j) & 0x0f]); \
} while (0)
static void
sha512_block_data_order(SHA512_CTX *ctx, const void *in, size_t num)
sha512_block_data_order(SHA512_CTX *ctx, const void *_in, size_t num)
{
const SHA_LONG64 *W = in;
SHA_LONG64 a, b, c, d, e, f, g, h, s0, s1, T1;
const SHA_LONG64 *in = _in;
SHA_LONG64 a, b, c, d, e, f, g, h, s0, s1, T1, T2;
SHA_LONG64 X[16];
int i;
while (num--) {
a = ctx->h[0];
b = ctx->h[1];
c = ctx->h[2];
@ -183,38 +185,38 @@ sha512_block_data_order(SHA512_CTX *ctx, const void *in, size_t num)
g = ctx->h[6];
h = ctx->h[7];
T1 = X[0] = PULL64(W[0]);
ROUND_00_15(0, a, b, c, d, e, f, g, h);
T1 = X[1] = PULL64(W[1]);
ROUND_00_15(1, h, a, b, c, d, e, f, g);
T1 = X[2] = PULL64(W[2]);
ROUND_00_15(2, g, h, a, b, c, d, e, f);
T1 = X[3] = PULL64(W[3]);
ROUND_00_15(3, f, g, h, a, b, c, d, e);
T1 = X[4] = PULL64(W[4]);
ROUND_00_15(4, e, f, g, h, a, b, c, d);
T1 = X[5] = PULL64(W[5]);
ROUND_00_15(5, d, e, f, g, h, a, b, c);
T1 = X[6] = PULL64(W[6]);
ROUND_00_15(6, c, d, e, f, g, h, a, b);
T1 = X[7] = PULL64(W[7]);
ROUND_00_15(7, b, c, d, e, f, g, h, a);
T1 = X[8] = PULL64(W[8]);
ROUND_00_15(8, a, b, c, d, e, f, g, h);
T1 = X[9] = PULL64(W[9]);
ROUND_00_15(9, h, a, b, c, d, e, f, g);
T1 = X[10] = PULL64(W[10]);
ROUND_00_15(10, g, h, a, b, c, d, e, f);
T1 = X[11] = PULL64(W[11]);
ROUND_00_15(11, f, g, h, a, b, c, d, e);
T1 = X[12] = PULL64(W[12]);
ROUND_00_15(12, e, f, g, h, a, b, c, d);
T1 = X[13] = PULL64(W[13]);
ROUND_00_15(13, d, e, f, g, h, a, b, c);
T1 = X[14] = PULL64(W[14]);
ROUND_00_15(14, c, d, e, f, g, h, a, b);
T1 = X[15] = PULL64(W[15]);
ROUND_00_15(15, b, c, d, e, f, g, h, a);
X[0] = PULL64(in[0]);
ROUND_00_15(0, a, b, c, d, e, f, g, h, X[0]);
X[1] = PULL64(in[1]);
ROUND_00_15(1, h, a, b, c, d, e, f, g, X[1]);
X[2] = PULL64(in[2]);
ROUND_00_15(2, g, h, a, b, c, d, e, f, X[2]);
X[3] = PULL64(in[3]);
ROUND_00_15(3, f, g, h, a, b, c, d, e, X[3]);
X[4] = PULL64(in[4]);
ROUND_00_15(4, e, f, g, h, a, b, c, d, X[4]);
X[5] = PULL64(in[5]);
ROUND_00_15(5, d, e, f, g, h, a, b, c, X[5]);
X[6] = PULL64(in[6]);
ROUND_00_15(6, c, d, e, f, g, h, a, b, X[6]);
X[7] = PULL64(in[7]);
ROUND_00_15(7, b, c, d, e, f, g, h, a, X[7]);
X[8] = PULL64(in[8]);
ROUND_00_15(8, a, b, c, d, e, f, g, h, X[8]);
X[9] = PULL64(in[9]);
ROUND_00_15(9, h, a, b, c, d, e, f, g, X[9]);
X[10] = PULL64(in[10]);
ROUND_00_15(10, g, h, a, b, c, d, e, f, X[10]);
X[11] = PULL64(in[11]);
ROUND_00_15(11, f, g, h, a, b, c, d, e, X[11]);
X[12] = PULL64(in[12]);
ROUND_00_15(12, e, f, g, h, a, b, c, d, X[12]);
X[13] = PULL64(in[13]);
ROUND_00_15(13, d, e, f, g, h, a, b, c, X[13]);
X[14] = PULL64(in[14]);
ROUND_00_15(14, c, d, e, f, g, h, a, b, X[14]);
X[15] = PULL64(in[15]);
ROUND_00_15(15, b, c, d, e, f, g, h, a, X[15]);
for (i = 16; i < 80; i += 16) {
ROUND_16_80(i, 0, a, b, c, d, e, f, g, h, X);
@ -244,7 +246,7 @@ sha512_block_data_order(SHA512_CTX *ctx, const void *in, size_t num)
ctx->h[6] += g;
ctx->h[7] += h;
W += SHA_LBLOCK;
in += SHA_LBLOCK;
}
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: s3_lib.c,v 1.242 2022/11/26 16:08:55 tb Exp $ */
/* $OpenBSD: s3_lib.c,v 1.243 2023/05/16 14:10:43 jcs Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -1580,6 +1580,7 @@ ssl3_free(SSL *s)
sk_X509_NAME_pop_free(s->s3->hs.tls12.ca_names, X509_NAME_free);
sk_X509_pop_free(s->verified_chain, X509_free);
s->verified_chain = NULL;
tls1_transcript_free(s);
tls1_transcript_hash_free(s);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: mail.local.c,v 1.40 2023/05/10 08:03:49 op Exp $ */
/* $OpenBSD: mail.local.c,v 1.41 2023/05/15 12:02:40 op Exp $ */
/*-
* Copyright (c) 1996-1998 Theo de Raadt <deraadt@theos.com>
@ -244,7 +244,7 @@ retry:
curoff = lseek(mbfd, 0, SEEK_END);
(void)snprintf(biffmsg, sizeof biffmsg, "%s@%lld\n", name,
(long long int)curoff);
(long long)curoff);
if (lseek(fd, 0, SEEK_SET) == (off_t)-1) {
mwarn("temporary file: %s", strerror(errno));
goto bad;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ecdhtest.c,v 1.14 2023/04/26 09:31:12 tb Exp $ */
/* $OpenBSD: ecdhtest.c,v 1.15 2023/05/16 18:41:18 tb Exp $ */
/* ====================================================================
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
*
@ -146,7 +146,8 @@ test_ecdh_curve(int nid, const char *text, BN_CTX *ctx, BIO *out)
(void)BIO_flush(out);
alen = KDF1_SHA1_len;
abuf = malloc(alen);
if ((abuf = malloc(alen)) == NULL)
goto err;
aout = ECDH_compute_key(abuf, alen, EC_KEY_get0_public_key(b),
a, KDF1_SHA1);
@ -154,7 +155,8 @@ test_ecdh_curve(int nid, const char *text, BN_CTX *ctx, BIO *out)
(void)BIO_flush(out);
blen = KDF1_SHA1_len;
bbuf = malloc(blen);
if ((bbuf = malloc(blen)) == NULL)
goto err;
bout = ECDH_compute_key(bbuf, blen, EC_KEY_get0_public_key(a),
b, KDF1_SHA1);
@ -344,7 +346,8 @@ ecdh_kat(BIO *out, const char *cname, int nid,
Ztmplen = ECDH_size(key1);
if (Ztmplen != Zlen)
goto err;
Ztmp = malloc(Ztmplen);
if ((Ztmp = malloc(Ztmplen)) == NULL)
goto err;
if (!ECDH_compute_key(Ztmp, Ztmplen,
EC_KEY_get0_public_key(key2), key1, 0))
goto err;

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: ifconfig.8,v 1.394 2023/04/26 02:38:08 asou Exp $
.\" $OpenBSD: ifconfig.8,v 1.395 2023/05/16 14:32:54 jan Exp $
.\" $NetBSD: ifconfig.8,v 1.11 1996/01/04 21:27:29 pk Exp $
.\" $FreeBSD: ifconfig.8,v 1.16 1998/02/01 07:03:29 steve Exp $
.\"
@ -31,7 +31,7 @@
.\"
.\" @(#)ifconfig.8 8.4 (Berkeley) 6/1/94
.\"
.Dd $Mdocdate: April 26 2023 $
.Dd $Mdocdate: May 16 2023 $
.Dt IFCONFIG 8
.Os
.Sh NAME
@ -282,8 +282,18 @@ tag.
As CSUM_TCPv4, but supports IPv6 datagrams.
.It Sy CSUM_UDPv6
As above, for UDP.
.It Sy TSO
The device supports TCP segment offloading (TSO).
.It Sy LRO
The device supports TCP large receive offload (LRO).
.It Sy TSOv4
The device supports IPv4 TCP segmentation offload (TSO).
TSO is used by default.
Use the
.Xr sysctl 8
variable
.Va net.inet.tcp.tso
to disable this feature.
.It Sy TSOv6
As above, for IPv6.
.It Sy WOL
The device supports Wake on LAN (WoL).
.It Sy hardmtu
@ -491,25 +501,25 @@ Query and display information and diagnostics from GBIC and SFP
modules installed in an interface.
It is only supported by drivers implementing the necessary functionality
on hardware which supports it.
.It Cm tso
Enable TCP segmentation offloading (TSO) if it's supported by the hardware; see
.It Cm tcprecvoffload
Enable TCP large receive offload (LRO) if it's supported by the hardware; see
.Cm hwfeatures .
TSO enabled NICs modify received TCP/IP packets.
LRO enabled network interfaces modify received TCP/IP packets.
This will also affect traffic of upper layer interfaces,
such as
.Xr vlan 4 ,
.Xr aggr 4 ,
and
.Xr carp 4 .
It is not possible to use TSO with interfaces attached to a
It is not possible to use LRO with interfaces attached to a
.Xr bridge 4 ,
.Xr veb 4 ,
or
.Xr tpmr 4 .
Changing this option will re-initialize the network interface.
.It Cm -tso
Disable TSO.
TSO is disabled by default.
.It Cm -tcprecvoffload
Disable LRO.
LRO is disabled by default.
.It Cm up
Mark an interface
.Dq up .

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ifconfig.c,v 1.463 2023/05/12 18:24:13 jan Exp $ */
/* $OpenBSD: ifconfig.c,v 1.464 2023/05/16 14:32:54 jan Exp $ */
/* $NetBSD: ifconfig.c,v 1.40 1997/10/01 02:19:43 enami Exp $ */
/*
@ -126,7 +126,7 @@
#define HWFEATURESBITS \
"\024\1CSUM_IPv4\2CSUM_TCPv4\3CSUM_UDPv4" \
"\5VLAN_MTU\6VLAN_HWTAGGING\10CSUM_TCPv6" \
"\11CSUM_UDPv6\17TSO\20WOL"
"\11CSUM_UDPv6\15TSOv4\16TSOv6\17LRO\20WOL"
struct ifencap {
unsigned int ife_flags;
@ -469,8 +469,8 @@ const struct cmd {
{ "-soii", IFXF_INET6_NOSOII, 0, setifxflags },
{ "monitor", IFXF_MONITOR, 0, setifxflags },
{ "-monitor", -IFXF_MONITOR, 0, setifxflags },
{ "tso", IFXF_TSO, 0, setifxflags },
{ "-tso", -IFXF_TSO, 0, setifxflags },
{ "tcprecvoffload", IFXF_LRO, 0, setifxflags },
{ "-tcprecvoffload", -IFXF_LRO, 0, setifxflags },
#ifndef SMALL
{ "hwfeatures", NEXTARG0, 0, printifhwfeatures },
{ "metric", NEXTARG, 0, setifmetric },
@ -674,7 +674,7 @@ const struct cmd {
"\7RUNNING\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX" \
"\15LINK0\16LINK1\17LINK2\20MULTICAST" \
"\23AUTOCONF6TEMP\24MPLS\25WOL\26AUTOCONF6\27INET6_NOSOII" \
"\30AUTOCONF4" "\31MONITOR" "\32TSO"
"\30AUTOCONF4" "\31MONITOR" "\32LRO"
int getinfo(struct ifreq *, int);
void getsock(int);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: trap.c,v 1.44 2023/04/26 12:30:24 kettenis Exp $ */
/* $OpenBSD: trap.c,v 1.45 2023/05/15 15:02:06 kettenis Exp $ */
/*-
* Copyright (c) 2014 Andrew Turner
* All rights reserved.
@ -94,7 +94,7 @@ udata_abort(struct trapframe *frame, uint64_t esr, uint64_t far, int exe)
switch (esr & ISS_DATA_DFSC_MASK) {
case ISS_DATA_DFSC_ALIGN:
sv.sival_ptr = (void *)far;
trapsignal(p, SIGBUS, 0, BUS_ADRALN, sv);
trapsignal(p, SIGBUS, esr, BUS_ADRALN, sv);
return;
default:
break;
@ -132,7 +132,7 @@ udata_abort(struct trapframe *frame, uint64_t esr, uint64_t far, int exe)
code = SEGV_MAPERR;
}
sv.sival_ptr = (void *)far;
trapsignal(p, sig, 0, code, sv);
trapsignal(p, sig, esr, code, sv);
}
static void
@ -275,7 +275,7 @@ do_el0_sync(struct trapframe *frame)
case EXCP_UNKNOWN:
curcpu()->ci_flush_bp();
sv.sival_ptr = (void *)frame->tf_elr;
trapsignal(p, SIGILL, 0, ILL_ILLOPC, sv);
trapsignal(p, SIGILL, esr, ILL_ILLOPC, sv);
break;
case EXCP_FP_SIMD:
case EXCP_TRAP_FP:
@ -284,7 +284,7 @@ do_el0_sync(struct trapframe *frame)
case EXCP_BRANCH_TGT:
curcpu()->ci_flush_bp();
sv.sival_ptr = (void *)frame->tf_elr;
trapsignal(p, SIGILL, 0, ILL_ILLOPC, sv);
trapsignal(p, SIGILL, esr, ILL_ILLOPC, sv);
break;
case EXCP_SVC:
svc_handler(frame);
@ -295,23 +295,23 @@ do_el0_sync(struct trapframe *frame)
case EXCP_PC_ALIGN:
curcpu()->ci_flush_bp();
sv.sival_ptr = (void *)frame->tf_elr;
trapsignal(p, SIGBUS, 0, BUS_ADRALN, sv);
trapsignal(p, SIGBUS, esr, BUS_ADRALN, sv);
break;
case EXCP_SP_ALIGN:
curcpu()->ci_flush_bp();
sv.sival_ptr = (void *)frame->tf_sp;
trapsignal(p, SIGBUS, 0, BUS_ADRALN, sv);
trapsignal(p, SIGBUS, esr, BUS_ADRALN, sv);
break;
case EXCP_DATA_ABORT_L:
udata_abort(frame, esr, far, 0);
break;
case EXCP_BRK:
sv.sival_ptr = (void *)frame->tf_elr;
trapsignal(p, SIGTRAP, 0, TRAP_BRKPT, sv);
trapsignal(p, SIGTRAP, esr, TRAP_BRKPT, sv);
break;
case EXCP_SOFTSTP_EL0:
sv.sival_ptr = (void *)frame->tf_elr;
trapsignal(p, SIGTRAP, 0, TRAP_TRACE, sv);
trapsignal(p, SIGTRAP, esr, TRAP_TRACE, sv);
break;
default:
// panic("Unknown userland exception %x esr_el1 %lx", exception,

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_ix.c,v 1.193 2023/04/28 10:18:57 bluhm Exp $ */
/* $OpenBSD: if_ix.c,v 1.194 2023/05/16 14:32:54 jan Exp $ */
/******************************************************************************
@ -1925,7 +1925,7 @@ ixgbe_setup_interface(struct ix_softc *sc)
ifp->if_capabilities |= IFCAP_CSUM_IPv4;
if (sc->hw.mac.type != ixgbe_mac_82598EB)
ifp->if_capabilities |= IFCAP_TSO;
ifp->if_capabilities |= IFCAP_LRO;
/*
* Specify the media types supported by this sc and register
@ -2873,13 +2873,13 @@ ixgbe_initialize_receive_units(struct ix_softc *sc)
hlreg |= IXGBE_HLREG0_JUMBOEN;
IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
if (ISSET(ifp->if_xflags, IFXF_TSO)) {
if (ISSET(ifp->if_xflags, IFXF_LRO)) {
rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
/* This field has to be set to zero. */
rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
/* Enable TSO Receive Offloading */
/* RSC Coalescing on ACK Change */
rdrxctl |= IXGBE_RDRXCTL_RSCACKC;
rdrxctl |= IXGBE_RDRXCTL_FCOE_WRFIX;
@ -2902,10 +2902,10 @@ ixgbe_initialize_receive_units(struct ix_softc *sc)
srrctl = bufsz | IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl);
if (ISSET(ifp->if_xflags, IFXF_TSO)) {
if (ISSET(ifp->if_xflags, IFXF_LRO)) {
rdrxctl = IXGBE_READ_REG(&sc->hw, IXGBE_RSCCTL(i));
/* Enable TSO Receive Side Coalescing */
/* Enable Receive Side Coalescing */
rdrxctl |= IXGBE_RSCCTL_RSCEN;
rdrxctl |= IXGBE_RSCCTL_MAXDESC_16;
@ -3263,7 +3263,7 @@ ixgbe_setup_vlan_hw_support(struct ix_softc *sc)
* We have to disable VLAN striping when using TCP offloading, due to a
* firmware bug.
*/
if (ISSET(ifp->if_xflags, IFXF_TSO)) {
if (ISSET(ifp->if_xflags, IFXF_LRO)) {
sc->vlan_stripping = 0;
return;
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: uipc_domain.c,v 1.61 2023/05/04 09:40:36 mvs Exp $ */
/* $OpenBSD: uipc_domain.c,v 1.62 2023/05/16 19:36:00 mvs Exp $ */
/* $NetBSD: uipc_domain.c,v 1.14 1996/02/09 19:00:44 christos Exp $ */
/*
@ -244,9 +244,11 @@ net_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
protocol = name[1];
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++)
if (pr->pr_protocol == protocol && pr->pr_sysctl) {
if ((pr->pr_flags & PR_MPSYSCTL) == 0)
KERNEL_LOCK();
error = (*pr->pr_sysctl)(name + 2, namelen - 2,
oldp, oldlenp, newp, newlen);
if ((pr->pr_flags & PR_MPSYSCTL) == 0)
KERNEL_UNLOCK();
return (error);
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: uipc_mbuf.c,v 1.285 2023/05/05 01:19:51 bluhm Exp $ */
/* $OpenBSD: uipc_mbuf.c,v 1.286 2023/05/16 20:09:27 mvs Exp $ */
/* $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $ */
/*
@ -1801,7 +1801,7 @@ sysctl_mq(int *name, u_int namelen, void *oldp, size_t *oldlenp,
case IFQCTL_MAXLEN:
maxlen = mq->mq_maxlen;
error = sysctl_int(oldp, oldlenp, newp, newlen, &maxlen);
if (!error && maxlen != mq->mq_maxlen)
if (error == 0)
mq_set_maxlen(mq, maxlen);
return (error);
case IFQCTL_DROPS:

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if.c,v 1.696 2023/05/14 01:46:53 dlg Exp $ */
/* $OpenBSD: if.c,v 1.697 2023/05/16 14:32:54 jan Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@ -2109,10 +2109,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
error = ENOTSUP;
}
#endif
if (ISSET(ifr->ifr_flags, IFXF_TSO) !=
ISSET(ifp->if_xflags, IFXF_TSO))
error = ifsettso(ifp, ISSET(ifr->ifr_flags, IFXF_TSO));
if (ISSET(ifr->ifr_flags, IFXF_LRO) !=
ISSET(ifp->if_xflags, IFXF_LRO))
error = ifsetlro(ifp, ISSET(ifr->ifr_flags, IFXF_LRO));
if (error == 0)
ifp->if_xflags = (ifp->if_xflags & IFXF_CANTCHANGE) |
@ -3153,37 +3152,33 @@ ifpromisc(struct ifnet *ifp, int pswitch)
return (error);
}
/* Set/clear TSO flag and restart interface if needed. */
/* Set/clear LRO flag and restart interface if needed. */
int
ifsettso(struct ifnet *ifp, int on)
ifsetlro(struct ifnet *ifp, int on)
{
struct ifreq ifrq;
int error = 0;
int s = splnet();
NET_ASSERT_LOCKED(); /* for ioctl */
KERNEL_ASSERT_LOCKED(); /* for if_flags */
if (on && !ISSET(ifp->if_xflags, IFXF_TSO)) {
if (!ISSET(ifp->if_capabilities, IFCAP_TSO)) {
if (!ISSET(ifp->if_capabilities, IFCAP_LRO)) {
error = ENOTSUP;
goto out;
}
NET_ASSERT_LOCKED(); /* for ioctl */
KERNEL_ASSERT_LOCKED(); /* for if_flags */
if (on && !ISSET(ifp->if_xflags, IFXF_LRO)) {
if (ether_brport_isset(ifp)) {
error = EBUSY;
goto out;
}
SET(ifp->if_xflags, IFXF_TSO);
} else if (!on && ISSET(ifp->if_xflags, IFXF_TSO))
CLR(ifp->if_xflags, IFXF_TSO);
SET(ifp->if_xflags, IFXF_LRO);
} else if (!on && ISSET(ifp->if_xflags, IFXF_LRO))
CLR(ifp->if_xflags, IFXF_LRO);
else
goto out;
#if NVLAN > 0
/* Change TSO flag also on attached vlan(4) interfaces. */
vlan_flags_from_parent(ifp, IFXF_TSO);
#endif
/* restart interface */
if (ISSET(ifp->if_flags, IFF_UP)) {
/* go down for a moment... */

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if.h,v 1.211 2023/03/07 20:09:48 jan Exp $ */
/* $OpenBSD: if.h,v 1.213 2023/05/16 14:32:54 jan Exp $ */
/* $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $ */
/*
@ -231,7 +231,7 @@ struct if_status_description {
#define IFXF_INET6_NOSOII 0x40 /* [N] don't do RFC 7217 */
#define IFXF_AUTOCONF4 0x80 /* [N] v4 autoconf (aka dhcp) enabled */
#define IFXF_MONITOR 0x100 /* [N] only used for bpf */
#define IFXF_TSO 0x200 /* [N] TCP segment offloading */
#define IFXF_LRO 0x200 /* [N] TCP large recv offload */
#define IFXF_CANTCHANGE \
(IFXF_MPSAFE|IFXF_CLONED)
@ -251,7 +251,9 @@ struct if_status_description {
#define IFCAP_VLAN_HWTAGGING 0x00000020 /* hardware VLAN tag support */
#define IFCAP_CSUM_TCPv6 0x00000080 /* can do IPv6/TCP checksums */
#define IFCAP_CSUM_UDPv6 0x00000100 /* can do IPv6/UDP checksums */
#define IFCAP_TSO 0x00004000 /* TCP segment offloading */
#define IFCAP_TSOv4 0x00001000 /* IPv4/TCP segment offload */
#define IFCAP_TSOv6 0x00002000 /* IPv6/TCP segment offload */
#define IFCAP_LRO 0x00004000 /* TCP large recv offload */
#define IFCAP_WOL 0x00008000 /* can do wake on lan */
#define IFCAP_CSUM_MASK (IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | \
@ -544,7 +546,7 @@ void if_getdata(struct ifnet *, struct if_data *);
void ifinit(void);
int ifioctl(struct socket *, u_long, caddr_t, struct proc *);
int ifpromisc(struct ifnet *, int);
int ifsettso(struct ifnet *, int);
int ifsetlro(struct ifnet *, int);
struct ifg_group *if_creategroup(const char *);
int if_addgroup(struct ifnet *, const char *);
int if_delgroup(struct ifnet *, const char *);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_aggr.c,v 1.39 2022/02/05 03:56:16 dlg Exp $ */
/* $OpenBSD: if_aggr.c,v 1.40 2023/05/16 14:32:54 jan Exp $ */
/*
* Copyright (c) 2019 The University of Queensland
@ -2618,6 +2618,9 @@ aggr_update_capabilities(struct aggr_softc *sc)
uint32_t capabilities = ~0;
int set = 0;
/* Do not inherit LRO capabilities. */
CLR(capabilities, IFCAP_LRO);
rw_enter_read(&sc->sc_lock);
TAILQ_FOREACH(p, &sc->sc_ports, p_entry) {
struct ifnet *ifp0 = p->p_ifp0;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_bridge.c,v 1.367 2023/05/13 13:35:17 bluhm Exp $ */
/* $OpenBSD: if_bridge.c,v 1.368 2023/05/16 14:32:54 jan Exp $ */
/*
* Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net)
@ -338,7 +338,7 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
*/
NET_LOCK();
ifsettso(ifs, 0);
ifsetlro(ifs, 0);
NET_UNLOCK();
bif->bridge_sc = sc;
@ -401,7 +401,7 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
}
NET_LOCK();
ifsettso(ifs, 0);
ifsetlro(ifs, 0);
NET_UNLOCK();
bif->bridge_sc = sc;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_tpmr.c,v 1.32 2023/02/27 09:35:32 jan Exp $ */
/* $OpenBSD: if_tpmr.c,v 1.33 2023/05/16 14:32:54 jan Exp $ */
/*
* Copyright (c) 2019 The University of Queensland
@ -521,7 +521,7 @@ tpmr_add_port(struct tpmr_softc *sc, const struct ifbreq *req)
goto put;
}
ifsettso(ifp0, 0);
ifsetlro(ifp0, 0);
p->p_ifp0 = ifp0;
p->p_tpmr = sc;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_veb.c,v 1.30 2023/02/27 09:35:32 jan Exp $ */
/* $OpenBSD: if_veb.c,v 1.31 2023/05/16 14:32:54 jan Exp $ */
/*
* Copyright (c) 2021 David Gwynne <dlg@openbsd.org>
@ -1465,7 +1465,7 @@ veb_add_port(struct veb_softc *sc, const struct ifbreq *req, unsigned int span)
goto put;
}
ifsettso(ifp0, 0);
ifsetlro(ifp0, 0);
p->p_ifp0 = ifp0;
p->p_veb = sc;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_vlan.c,v 1.214 2023/04/26 00:14:21 jan Exp $ */
/* $OpenBSD: if_vlan.c,v 1.215 2023/05/16 14:32:54 jan Exp $ */
/*
* Copyright 1998 Massachusetts Institute of Technology
@ -536,7 +536,8 @@ vlan_up(struct vlan_softc *sc)
* Chips that can do hardware-assisted VLAN encapsulation, can
* calculate the correct checksum for VLAN tagged packets.
*/
ifp->if_capabilities = ifp0->if_capabilities & IFCAP_CSUM_MASK;
ifp->if_capabilities = ifp0->if_capabilities &
(IFCAP_CSUM_MASK | IFCAP_TSOv4 | IFCAP_TSOv6);
}
/* commit the sc */
@ -560,9 +561,6 @@ vlan_up(struct vlan_softc *sc)
/* configure the parent to handle packets for this vlan */
vlan_multi_apply(sc, ifp0, SIOCADDMULTI);
/* Inherit flags from parent interface. */
vlan_flags_from_parent(ifp0, IFXF_TSO);
/* we're running now */
SET(ifp->if_flags, IFF_RUNNING);
vlan_link_state(sc, ifp0->if_link_state, ifp0->if_baudrate);
@ -965,28 +963,6 @@ vlan_del_parent(struct vlan_softc *sc)
return (0);
}
void
vlan_flags_from_parent(struct ifnet *ifp0, int flags)
{
struct vlan_softc *sc;
int i;
for (i = 0; i < TAG_HASH_SIZE; i++) {
SMR_SLIST_FOREACH_LOCKED(sc, &vlan_tagh[i], sc_list) {
/* vlan and tso only works with hw tagging */
if (!ISSET(ifp0->if_capabilities, IFCAP_VLAN_HWTAGGING))
CLR(flags, IFXF_TSO);
if (sc->sc_ifidx0 == ifp0->if_index) {
if (ISSET(ifp0->if_xflags, flags))
SET(sc->sc_if.if_xflags, flags);
else
CLR(sc->sc_if.if_xflags, flags);
}
}
}
}
int
vlan_set_compat(struct ifnet *ifp, struct ifreq *ifr)
{

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pf.c,v 1.1179 2023/05/13 13:35:17 bluhm Exp $ */
/* $OpenBSD: pf.c,v 1.1180 2023/05/15 16:34:56 bluhm Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@ -6555,15 +6555,9 @@ pf_route(struct pf_pdesc *pd, struct pf_state *st)
goto done;
}
if (ISSET(m0->m_pkthdr.csum_flags, M_TCP_TSO) &&
m0->m_pkthdr.ph_mss <= ifp->if_mtu) {
if (tcp_chopper(m0, &ml, ifp, m0->m_pkthdr.ph_mss) ||
if_output_ml(ifp, &ml, sintosa(dst), rt))
if (tcp_if_output_tso(ifp, &m0, sintosa(dst), rt,
IFCAP_TSOv4, ifp->if_mtu) || m0 == NULL)
goto done;
tcpstat_inc(tcps_outswtso);
goto done;
}
CLR(m0->m_pkthdr.csum_flags, M_TCP_TSO);
/*
* Too large for interface; fragment if possible.
@ -6598,7 +6592,6 @@ void
pf_route6(struct pf_pdesc *pd, struct pf_state *st)
{
struct mbuf *m0;
struct mbuf_list ml;
struct sockaddr_in6 *dst, sin6;
struct rtentry *rt = NULL;
struct ip6_hdr *ip6;
@ -6696,15 +6689,9 @@ pf_route6(struct pf_pdesc *pd, struct pf_state *st)
goto done;
}
if (ISSET(m0->m_pkthdr.csum_flags, M_TCP_TSO) &&
m0->m_pkthdr.ph_mss <= ifp->if_mtu) {
if (tcp_chopper(m0, &ml, ifp, m0->m_pkthdr.ph_mss) ||
if_output_ml(ifp, &ml, sin6tosa(dst), rt))
if (tcp_if_output_tso(ifp, &m0, sin6tosa(dst), rt,
IFCAP_TSOv6, ifp->if_mtu) || m0 == NULL)
goto done;
tcpstat_inc(tcps_outswtso);
goto done;
}
CLR(m0->m_pkthdr.csum_flags, M_TCP_TSO);
ip6stat_inc(ip6s_cantfrag);
if (st->rt != PF_DUPTO)

View file

@ -1,4 +1,4 @@
/* $OpenBSD: in_proto.c,v 1.99 2022/08/15 09:11:38 mvs Exp $ */
/* $OpenBSD: in_proto.c,v 1.100 2023/05/16 19:36:00 mvs Exp $ */
/* $NetBSD: in_proto.c,v 1.14 1996/02/18 18:58:32 christos Exp $ */
/*
@ -177,6 +177,7 @@ u_char ip_protox[IPPROTO_MAX];
const struct protosw inetsw[] = {
{
.pr_domain = &inetdomain,
.pr_flags = PR_MPSYSCTL,
.pr_init = ip_init,
.pr_slowtimo = ip_slowtimo,
.pr_sysctl = ip_sysctl

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ip_carp.c,v 1.356 2023/03/08 04:43:09 guenther Exp $ */
/* $OpenBSD: ip_carp.c,v 1.357 2023/05/16 14:32:54 jan Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff. All rights reserved.
@ -1693,7 +1693,7 @@ carp_set_ifp(struct carp_softc *sc, struct ifnet *ifp0)
sc->sc_carpdevidx = ifp0->if_index;
sc->sc_if.if_capabilities = ifp0->if_capabilities &
IFCAP_CSUM_MASK;
(IFCAP_CSUM_MASK | IFCAP_TSOv4 | IFCAP_TSOv6);
SRPL_FOREACH_LOCKED(vr, cif, sc_list) {
struct carp_vhost_entry *vrhead, *schead;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ip_input.c,v 1.383 2023/04/05 21:51:47 bluhm Exp $ */
/* $OpenBSD: ip_input.c,v 1.384 2023/05/16 19:36:00 mvs Exp $ */
/* $NetBSD: ip_input.c,v 1.30 1996/03/16 23:53:58 christos Exp $ */
/*
@ -1704,8 +1704,11 @@ ip_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
return (ip_sysctl_ipstat(oldp, oldlenp, newp));
#ifdef MROUTING
case IPCTL_MRTSTATS:
return (sysctl_rdstruct(oldp, oldlenp, newp,
&mrtstat, sizeof(mrtstat)));
KERNEL_LOCK();
error = sysctl_rdstruct(oldp, oldlenp, newp,
&mrtstat, sizeof(mrtstat));
KERNEL_UNLOCK();
return (error);
case IPCTL_MRTMFC:
if (newp)
return (EPERM);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ip_output.c,v 1.386 2023/05/13 13:35:17 bluhm Exp $ */
/* $OpenBSD: ip_output.c,v 1.387 2023/05/15 16:34:56 bluhm Exp $ */
/* $NetBSD: ip_output.c,v 1.28 1996/02/13 23:43:07 christos Exp $ */
/*
@ -460,15 +460,10 @@ sendit:
goto done;
}
if (ISSET(m->m_pkthdr.csum_flags, M_TCP_TSO) &&
m->m_pkthdr.ph_mss <= mtu) {
if ((error = tcp_chopper(m, &ml, ifp, m->m_pkthdr.ph_mss)) ||
(error = if_output_ml(ifp, &ml, sintosa(dst), ro->ro_rt)))
error = tcp_if_output_tso(ifp, &m, sintosa(dst), ro->ro_rt,
IFCAP_TSOv4, mtu);
if (error || m == NULL)
goto done;
tcpstat_inc(tcps_outswtso);
goto done;
}
CLR(m->m_pkthdr.csum_flags, M_TCP_TSO);
/*
* Too large for interface; fragment if possible.
@ -1887,10 +1882,15 @@ in_proto_cksum_out(struct mbuf *m, struct ifnet *ifp)
u_int16_t csum = 0, offset;
offset = ip->ip_hl << 2;
if (m->m_pkthdr.csum_flags & (M_TCP_CSUM_OUT|M_UDP_CSUM_OUT))
if (ISSET(m->m_pkthdr.csum_flags, M_TCP_TSO)) {
csum = in_cksum_phdr(ip->ip_src.s_addr,
ip->ip_dst.s_addr, htonl(ip->ip_p));
} else if (ISSET(m->m_pkthdr.csum_flags,
M_TCP_CSUM_OUT|M_UDP_CSUM_OUT)) {
csum = in_cksum_phdr(ip->ip_src.s_addr,
ip->ip_dst.s_addr, htonl(ntohs(ip->ip_len) -
offset + ip->ip_p));
}
if (ip->ip_p == IPPROTO_TCP)
offset += offsetof(struct tcphdr, th_sum);
else if (ip->ip_p == IPPROTO_UDP)

View file

@ -1,4 +1,4 @@
/* $OpenBSD: tcp_output.c,v 1.137 2023/05/13 13:35:18 bluhm Exp $ */
/* $OpenBSD: tcp_output.c,v 1.138 2023/05/15 16:34:56 bluhm Exp $ */
/* $NetBSD: tcp_output.c,v 1.16 1997/06/03 16:17:09 kml Exp $ */
/*
@ -80,6 +80,7 @@
#include <sys/kernel.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/route.h>
#if NPF > 0
#include <net/pfvar.h>
@ -753,7 +754,7 @@ send:
/* Enable TSO and specify the size of the resulting segments. */
if (tso) {
m->m_pkthdr.csum_flags |= M_TCP_TSO;
SET(m->m_pkthdr.csum_flags, M_TCP_TSO);
m->m_pkthdr.ph_mss = tp->t_maxseg;
}
@ -1349,3 +1350,45 @@ tcp_chopper(struct mbuf *m0, struct mbuf_list *ml, struct ifnet *ifp,
ml_purge(ml);
return error;
}
int
tcp_if_output_tso(struct ifnet *ifp, struct mbuf **mp, struct sockaddr *dst,
struct rtentry *rt, uint32_t ifcap, u_int mtu)
{
struct mbuf_list ml;
int error;
/* caller must fail later or fragment */
if (!ISSET((*mp)->m_pkthdr.csum_flags, M_TCP_TSO))
return 0;
if ((*mp)->m_pkthdr.ph_mss > mtu) {
CLR((*mp)->m_pkthdr.csum_flags, M_TCP_TSO);
return 0;
}
/* network interface hardware will do TSO */
if (in_ifcap_cksum(*mp, ifp, ifcap)) {
if (ISSET(ifcap, IFCAP_TSOv4)) {
in_hdr_cksum_out(*mp, ifp);
in_proto_cksum_out(*mp, ifp);
}
#ifdef INET6
if (ISSET(ifcap, IFCAP_TSOv6))
in6_proto_cksum_out(*mp, ifp);
#endif
error = ifp->if_output(ifp, *mp, dst, rt);
if (!error)
tcpstat_inc(tcps_outhwtso);
goto done;
}
/* as fallback do TSO in software */
if ((error = tcp_chopper(*mp, &ml, ifp, (*mp)->m_pkthdr.ph_mss)) ||
(error = if_output_ml(ifp, &ml, dst, rt)))
goto done;
tcpstat_inc(tcps_outswtso);
done:
*mp = NULL;
return error;
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: tcp_var.h,v 1.164 2023/05/10 12:07:16 bluhm Exp $ */
/* $OpenBSD: tcp_var.h,v 1.165 2023/05/15 16:34:56 bluhm Exp $ */
/* $NetBSD: tcp_var.h,v 1.17 1996/02/13 23:44:24 christos Exp $ */
/*
@ -719,6 +719,8 @@ struct tcpcb *
void tcp_notify(struct inpcb *, int);
int tcp_output(struct tcpcb *);
int tcp_chopper(struct mbuf *, struct mbuf_list *, struct ifnet *, u_int);
int tcp_if_output_tso(struct ifnet *, struct mbuf **, struct sockaddr *,
struct rtentry *, uint32_t, u_int);
void tcp_pulloutofband(struct socket *, u_int, struct mbuf *, int);
int tcp_reass(struct tcpcb *, struct tcphdr *, struct mbuf *, int *);
void tcp_rscale(struct tcpcb *, u_long);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ip6_output.c,v 1.275 2023/05/10 12:07:17 bluhm Exp $ */
/* $OpenBSD: ip6_output.c,v 1.276 2023/05/15 16:34:57 bluhm Exp $ */
/* $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $ */
/*
@ -706,15 +706,10 @@ reroute:
goto done;
}
if (ISSET(m->m_pkthdr.csum_flags, M_TCP_TSO) &&
m->m_pkthdr.ph_mss <= mtu) {
if ((error = tcp_chopper(m, &ml, ifp, m->m_pkthdr.ph_mss)) ||
(error = if_output_ml(ifp, &ml, sin6tosa(dst), ro->ro_rt)))
error = tcp_if_output_tso(ifp, &m, sin6tosa(dst), ro->ro_rt,
IFCAP_TSOv6, mtu);
if (error || m == NULL)
goto done;
tcpstat_inc(tcps_outswtso);
goto done;
}
CLR(m->m_pkthdr.csum_flags, M_TCP_TSO);
/*
* try to fragment the packet. case 1-b
@ -2715,8 +2710,13 @@ in6_proto_cksum_out(struct mbuf *m, struct ifnet *ifp)
u_int16_t csum;
offset = ip6_lasthdr(m, 0, IPPROTO_IPV6, &nxt);
if (ISSET(m->m_pkthdr.csum_flags, M_TCP_TSO)) {
csum = in6_cksum_phdr(&ip6->ip6_src, &ip6->ip6_dst,
htonl(0), htonl(nxt));
} else {
csum = in6_cksum_phdr(&ip6->ip6_src, &ip6->ip6_dst,
htonl(m->m_pkthdr.len - offset), htonl(nxt));
}
if (nxt == IPPROTO_TCP)
offset += offsetof(struct tcphdr, th_sum);
else if (nxt == IPPROTO_UDP)

View file

@ -1,4 +1,4 @@
/* $OpenBSD: protosw.h,v 1.59 2022/11/26 17:52:35 mvs Exp $ */
/* $OpenBSD: protosw.h,v 1.61 2023/05/16 19:44:55 mvs Exp $ */
/* $NetBSD: protosw.h,v 1.10 1996/04/09 20:55:32 cgd Exp $ */
/*-
@ -123,14 +123,16 @@ struct protosw {
* PR_ADDR requires PR_ATOMIC;
* PR_ADDR and PR_CONNREQUIRED are mutually exclusive.
*/
#define PR_ATOMIC 0x01 /* exchange atomic messages only */
#define PR_ADDR 0x02 /* addresses given with messages */
#define PR_CONNREQUIRED 0x04 /* connection required by protocol */
#define PR_WANTRCVD 0x08 /* want PRU_RCVD calls */
#define PR_RIGHTS 0x10 /* passes capabilities */
#define PR_ABRTACPTDIS 0x20 /* abort on accept(2) to disconnected
#define PR_ATOMIC 0x0001 /* exchange atomic messages only */
#define PR_ADDR 0x0002 /* addresses given with messages */
#define PR_CONNREQUIRED 0x0004 /* connection required by protocol */
#define PR_WANTRCVD 0x0008 /* want PRU_RCVD calls */
#define PR_RIGHTS 0x0010 /* passes capabilities */
#define PR_ABRTACPTDIS 0x0020 /* abort on accept(2) to disconnected
socket */
#define PR_SPLICE 0x40 /* socket splicing is possible */
#define PR_SPLICE 0x0040 /* socket splicing is possible */
#define PR_MPSYSCTL 0x0080 /* (*pr_sysctl)() doesn't require
kernel lock */
/*
* The arguments to usrreq are:

View file

@ -1,7 +1,7 @@
/*
* Canada holiday
*
* $OpenBSD: calendar.canada,v 1.2 2013/03/16 07:52:29 jmc Exp $
* $OpenBSD: calendar.canada,v 1.3 2023/05/15 16:22:07 jmc Exp $
*/
#ifndef _calendar_canada_
@ -19,7 +19,7 @@ Easter-2 Good Friday (Statutory holiday)
Easter+1 Easter Monday
05/SunSecond Mother's Day (2nd Sunday of May)
/* Holds up to and including 2015 */
05/MonThird* Victoria Day (Monday on or immediately before May 24)
05/Mon-2 Victoria Day (Monday on or immediately before May 24)
06/SunThird Father's Day (3rd Sunday of June)
06/21* Summer Solstice
06/24 St-Jean Baptiste

View file

@ -1,7 +1,7 @@
/*
* United Kingdom (UK) calendar
*
* $OpenBSD: calendar.uk,v 1.2 2018/11/21 14:50:28 jmc Exp $
* $OpenBSD: calendar.uk,v 1.3 2023/05/15 16:22:07 jmc Exp $
*/
#ifndef _calendar_uk_
@ -21,7 +21,6 @@ Easter-21 Mothering Sunday (Sunday 3 weeks before Easter Sunday)
Easter-2 Good Friday (bank holiday)
Easter+1 Easter Monday (bank holiday - except Scotland)
05/MonFirst Early May bank holiday
05/MonThird* Victoria Day in Scotland (Monday on or immediately before 24th May)
05/MonLast Spring Bank Holiday
06/SunThird Father's Day (3rd Sunday of June)
06/21* Summer Solstice

View file

@ -1,7 +1,7 @@
/*
* USA holiday
*
* $OpenBSD: calendar.usholiday,v 1.9 2015/01/19 18:07:47 tedu Exp $
* $OpenBSD: calendar.usholiday,v 1.10 2023/05/15 10:36:08 bentley Exp $
*/
#ifndef _calendar_usholiday_
@ -22,6 +22,7 @@
05/SatThird Armed Forces Day (3rd Saturday of May)
05/MonLast Memorial Day (Last Monday of May)
06/SunThird Father's Day (3rd Sunday of June)
06/19 Juneteenth
06/21* Summer Solstice
07/04 Independence Day
09/MonFirst Labor Day (1st Monday of September)

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: acme-client.1,v 1.41 2022/01/21 18:46:21 deraadt Exp $
.\" $OpenBSD: acme-client.1,v 1.42 2023/05/16 09:02:50 espie Exp $
.\"
.\" Copyright (c) 2016 Kristaps Dzonsons <kristaps@bsd.lv>
.\"
@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
.Dd $Mdocdate: January 21 2022 $
.Dd $Mdocdate: May 16 2023 $
.Dt ACME-CLIENT 1
.Os
.Sh NAME
@ -151,3 +151,12 @@ The
.Nm
utility was written by
.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv .
.Sh CAVEATS
The usual ACME service providers are notoriously picky about
authenticating rules, and yield fairly long time-outs after just a
few invalid attempts.
It is strongly suggested to first validate a configuration with a
staging server before moving an official certificate validation
workflow to
.Xr crontab 5
status.

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: ArcCheck.pm,v 1.37 2022/06/06 06:57:35 espie Exp $
# $OpenBSD: ArcCheck.pm,v 1.40 2023/05/16 16:55:32 espie Exp $
#
# Copyright (c) 2005-2006 Marc Espie <espie@openbsd.org>
#
@ -21,14 +21,16 @@
# between tar balls OpenBSD::Ustar::Object and
# packing list OpenBSD::PackingElement
# specifically, during create time, we call prepare_long:
# - prevent a lot of weird objects from entering the archives
# - make sure all relevant users/modes are recorded in the PLIST item
# specifically, during create time:
# $o = $archive->prepare_long($item);
# if (!$o->verify_modes($self))
# error...
# if (!$o->is_allowed)
# error...
# during extraction: we call validate_meta:
# - make sure complex objects have all their relevant properties recorded
# - disallow extraction of non-files/links.
# - guard against files much longer than they should be.
# during extraction:
# $o->validate_meta($item) or
# error...
use strict;
use warnings;
@ -41,7 +43,7 @@ use POSIX;
sub is_allowed() { 0 }
# match archive header link name against actual link name
sub check_linkname
sub _check_linkname
{
my ($self, $linkname) = @_;
my $c = $self->{linkname};
@ -51,6 +53,12 @@ sub check_linkname
return $c eq $linkname;
}
sub _errsay
{
my ($self, @args) = @_;
$self->{archive}{state}->errsay(@args);
}
sub validate_meta
{
my ($o, $item) = @_;
@ -58,59 +66,59 @@ sub validate_meta
$o->{cwd} = $item->cwd;
if (defined $item->{symlink} || $o->isSymLink) {
if (!defined $item->{symlink}) {
$o->errsay("bogus symlink #1 -> #2",
$o->_errsay("bogus symlink #1 -> #2",
$item->name, $o->{linkname});
$o->errsay("\t(no \@symlink annotation in packing-list)");
$o->_errsay("\t(no \@symlink annotation in packing-list)");
return 0;
}
if (!$o->isSymLink) {
$o->errsay("bogus symlink #1 -> #2",
$o->_errsay("bogus symlink #1 -> #2",
$item->name, $item->{symlink});
$o->errsay("\t(not a symlink in the tarball)");
$o->_errsay("\t(not a symlink in the tarball)");
return 0;
}
if (!$o->check_linkname($item->{symlink})) {
$o->errsay("archive symlink does not match #1 != #2",
if (!$o->_check_linkname($item->{symlink})) {
$o->_errsay("archive symlink does not match #1 != #2",
$o->{linkname}, $item->{symlink});
return 0;
}
} elsif (defined $item->{link} || $o->isHardLink) {
if (!defined $item->{link}) {
$o->errsay("bogus hardlink #1 -> #2",
$o->_errsay("bogus hardlink #1 -> #2",
$item->name, $o->{linkname});
$o->errsay("\t(no \@link annotation in packing-list)");
$o->_errsay("\t(no \@link annotation in packing-list)");
return 0;
}
if (!$o->isHardLink) {
$o->errsay("bogus hardlink #1 -> #2",
$o->_errsay("bogus hardlink #1 -> #2",
$item->name, $item->{link});
$o->errsay("\t(not a link in the tarball)");
$o->_errsay("\t(not a link in the tarball)");
return 0;
}
if (!$o->check_linkname($item->{link})) {
$o->errsay("archive hardlink does not match #1 != #2",
if (!$o->_check_linkname($item->{link})) {
$o->_errsay("archive hardlink does not match #1 != #2",
$o->{linkname}, $item->{link});
return 0;
}
} elsif ($o->isFile) {
if (!defined $item->{size}) {
$o->errsay("Error: file #1 does not have recorded size",
$o->_errsay("Error: file #1 does not have recorded size",
$item->fullname);
return 0;
} elsif ($item->{size} != $o->{size}) {
$o->errsay("Error: size does not match for #1",
$o->_errsay("Error: size does not match for #1",
$item->fullname);
return 0;
}
} else {
$o->errsay("archive content for #1 should be file",
$o->_errsay("archive content for #1 should be file",
$item->name);
return 0;
}
return $o->verify_modes($item);
}
sub strip_modes
sub _strip_modes
{
my ($o, $item) = @_;
@ -139,7 +147,7 @@ sub strip_modes
return $result;
}
sub printable_mode
sub _printable_mode
{
my $o = shift;
return sprintf("%4o",
@ -153,23 +161,23 @@ sub verify_modes
if (!defined $item->{owner}) {
if ($o->{uname} ne 'root') {
$o->errsay("Error: no \@owner for #1 (#2)",
$o->_errsay("Error: no \@owner for #1 (#2)",
$item->fullname, $o->{uname});
$result = 0;
}
}
if (!defined $item->{group}) {
if ($o->{gname} ne 'bin' && $o->{gname} ne 'wheel') {
$o->errsay("Error: no \@group for #1 (#2)",
$o->_errsay("Error: no \@group for #1 (#2)",
$item->fullname, $o->{gname});
$result = 0;
}
}
# XXX /1
$o->{mode} &= ~(S_ISUID|S_ISGID);
if ($o->{mode} != $o->strip_modes($o)) {
$o->errsay("Error: weird mode for #1: #2", $item->fullname,
$o->printable_mode);
if ($o->{mode} != $o->_strip_modes($o)) {
$o->_errsay("Error: weird mode for #1: #2", $item->fullname,
$o->_printable_mode);
$result = 0;
}
return $result;
@ -238,7 +246,7 @@ sub prepare_long
$item->name, $entry->{gid});
}
# XXX /2
$entry->{mode} = $entry->strip_modes($item) & ~(S_ISUID|S_ISGID);
$entry->{mode} = $entry->_strip_modes($item) & ~(S_ISUID|S_ISGID);
if (defined $item->{ts}) {
delete $entry->{mtime};
}

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: IdCache.pm,v 1.10 2010/12/24 09:04:14 espie Exp $
# $OpenBSD: IdCache.pm,v 1.11 2023/05/16 14:31:54 espie Exp $
#
# Copyright (c) 2002-2005 Marc Espie <espie@openbsd.org>
#
@ -32,7 +32,7 @@ sub lookup
if (defined $self->{$name}) {
$r = $self->{$name};
} else {
$r = $self->convert($name);
$r = $self->_convert($name);
if (!defined $r) {
$r = $default;
}
@ -59,7 +59,7 @@ sub lookup
package OpenBSD::UidCache;
our @ISA=qw(OpenBSD::IdCache);
sub convert
sub _convert
{
my @entry = getpwnam($_[1]);
return @entry == 0 ? undef : $entry[2];
@ -68,7 +68,7 @@ sub convert
package OpenBSD::GidCache;
our @ISA=qw(OpenBSD::IdCache);
sub convert
sub _convert
{
my @entry = getgrnam($_[1]);
return @entry == 0 ? undef : $entry[2];
@ -77,7 +77,7 @@ sub convert
package OpenBSD::UnameCache;
our @ISA=qw(OpenBSD::SimpleIdCache);
sub convert
sub _convert
{
return getpwuid($_[1]);
}
@ -85,7 +85,7 @@ sub convert
package OpenBSD::GnameCache;
our @ISA=qw(OpenBSD::SimpleIdCache);
sub convert
sub _convert
{
return getgrgid($_[1]);
}

View file

@ -1,4 +1,4 @@
$OpenBSD: IdCache.pod,v 1.1 2020/12/20 15:30:58 daniel Exp $
$OpenBSD: IdCache.pod,v 1.2 2023/05/16 11:20:00 espie Exp $
=head1 NAME
@ -8,16 +8,16 @@ OpenBSD::IdCache - cache for user and group look-ups
use OpenBSD::IdCache;
my $ucache = new OpenBSD::UidCache;
my $ucache = OpenBSD::UidCache->new;
my $uid = $ucache->lookup("espie");
my $gcache = new OpenBSD::GidCache;
my $gcache = OpenBSD::GidCache->new;
my $gid = $gcache->lookup("wheel", 0);
my $unamecache = new OpenBSD::UnameCache;
my $unamecache = OpenBSD::UnameCache->new;
my $name = $unamecache->lookup($uid);
my $gnamecache = new OpenBSD::GnameCache;
my $gnamecache = OpenBSD::GnameCache->new;
my $grname = $gnamecache->lookup($gid);
=head1 DESCRIPTION

View file

@ -1,4 +1,4 @@
$OpenBSD: Mtree.pod,v 1.1 2020/12/20 15:30:58 daniel Exp $
$OpenBSD: Mtree.pod,v 1.2 2023/05/16 14:04:16 espie Exp $
=head1 NAME
@ -10,19 +10,21 @@ OpenBSD::Mtree - simple C<mtree(8)> spec parser
my %hier;
OpenBSD::Mtree::parse(\%hier, "/", "/etc/mtree/4.4BSD.dist");
OpenBSD::Mtree::parse(\%hier, "/", "/etc/mtree/4.4BSD.dist", $extra);
=head1 DESCRIPTION
C<OpenBSD::Mtree> is a parser for C<mtree(8)> specifications that
can reconstruct directory hierarchies.
The basic function C<OpenBSD::Mtree::parse_fh(\%hash, $basedir, $fh)>
The basic function C<OpenBSD::Mtree::parse_fh(\%hash, $basedir, $fh, $extra)>
will populate the hash C<$hash> with defined entries for each directory
seen while reading from C<$fh>, assuming the specification is to be interpreted
relative to C<$basedir> (some canonicalization of directory names will
occur).
C<OpenBSD::Mtree:parse(\%hash, $basedir, $filename)> is a convenience
If C<$extra> is non null, each entry will itself be an empty hash.
C<OpenBSD::Mtree:parse(\%hash, $basedir, $filename, $extra)> is a convenience
function which also handles opening the filehandle from C<$filename>
and closing it after reading the specification.

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: OldLibs.pm,v 1.13 2022/04/27 15:04:11 espie Exp $
# $OpenBSD: OldLibs.pm,v 1.14 2023/05/16 14:31:26 espie Exp $
#
# Copyright (c) 2004-2010 Marc Espie <espie@openbsd.org>
#
@ -154,7 +154,7 @@ sub split_some_libs
my $c1 = {};
my $c2 = {};
$plist->separate_element($libs, $c1, $c2);
my $p1 = OpenBSD::PackingList::OldLibs->new;
my $p1 = OpenBSD::PackingList->new;
$p1->set_infodir($plist->infodir);
$plist->special_deep_copy($p1, $c1, {});
my $p2 = $plist->make_shallow_copy($c2);

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: PackingElement.pm,v 1.284 2022/11/04 13:22:15 espie Exp $
# $OpenBSD: PackingElement.pm,v 1.285 2023/05/16 14:28:39 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@ -27,6 +27,11 @@ require 5.008_000;
# This is the basic class, which is mostly abstract, except for
# create and register_with_factory.
# It does provide base methods for stuff under it, though.
# XXX PackingElement uses (very seldom) multiple inheritance:
# the subclasses ::DirBase and ::Unique are used as mix-ins
# and thus contain very limited functionality !
package OpenBSD::PackingElement;
our %keyword;
@ -84,6 +89,8 @@ sub register_manpage
{
}
# plist keeps a "state" while reading a plist
# $self->destate($plstate)
sub destate
{
}
@ -96,6 +103,14 @@ sub add_object
return $self;
}
# $class->add($plist, @args):
# create an object with the correct arguments
# returns the actual object created, IF ANY (XXX see subclasses
# for instances of annotations like @symlink that DON'T create
# an actual object)
#
# most add methods have ONE single argument, except for
# subclasses generated from comments !
sub add
{
my ($class, $plist, @args) = @_;
@ -118,6 +133,7 @@ sub write
}
}
# specialized version to avoid copying digital signatures over
sub write_no_sig
{
my ($self, $fh) = @_;
@ -208,6 +224,9 @@ sub cwd
return ${$_[0]->{cwd}};
}
# most objects should be fs relative, but there are
# exceptions, such as sample files that will get installed
# under /etc, or rc files !
sub absolute_okay() { 0 }
sub compute_fullname
{
@ -320,6 +339,7 @@ our @ISA=qw(OpenBSD::PackingElement::Object);
package OpenBSD::PackingElement::Meta;
our @ISA=qw(OpenBSD::PackingElement);
# XXX mix-in class, see comment at top of file
package OpenBSD::PackingElement::Unique;
our @ISA=qw(OpenBSD::PackingElement::Meta);
@ -514,6 +534,12 @@ sub destate
sub dirclass() { "OpenBSD::PackingElement::Sampledir" }
# TODO @ghost data is not yet used
# it's meant for files that used to be "registered" but are
# somewhat autogenerated or something, and should vanish in a transparent way.
#
# the keyword was introduced very early but is (still) not used
package OpenBSD::PackingElement::Ghost;
our @ISA = qw(OpenBSD::PackingElement::FileObject);
@ -596,7 +622,8 @@ __PACKAGE__->register_with_factory;
sub register_manpage
{
my ($self, $state, $key) = @_;
# XXX don't bother register stuff from partial packages
# optimization: don't bother registering stuff from partial packages
# (makewhatis will complain that the names don't match anyway)
return if defined $self->{tempname};
my $fname = $self->fullname;
if ($fname =~ m,^(.*/man(?:/\w+)?)/((?:man|cat)[1-9n]\w*/.*),) {
@ -724,7 +751,11 @@ our @ISA=qw(OpenBSD::PackingElement::FileBase);
sub keyword() { "ltlib" }
__PACKAGE__->register_with_factory;
# Comment is very special
# Comment is very special:
# - some annotations are comments for historic reasons
# - CVSTags need to be recognized for register-plist (obsolescent)
# - tools like update-plist will recognize @comment'ed entries
# and thus destate needs to run on normal comments
package OpenBSD::PackingElement::Comment;
our @ISA=qw(OpenBSD::PackingElement::Meta);
@ -900,7 +931,7 @@ our @ISA=qw(OpenBSD::PackingElement::UniqueOption);
sub category() { 'manual-installation' }
# XXX don't incorporate this in signatures.
# don't incorporate this in signatures for obvious reasons
sub write_no_sig()
{
}
@ -2156,7 +2187,8 @@ for my $k (qw(src display mtree ignore_inst dirrm pkgcfl pkgdep newdepend
__PACKAGE__->register_old_keyword($k);
}
# Real pkgpath objects, with matching properties
# pkgpath objects are parsed in extrainfo and pkgpath objects
# so that erroneous pkgpaths will be flagged early
package OpenBSD::PkgPath;
sub new
{

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: PackingList.pm,v 1.149 2022/06/06 07:21:17 espie Exp $
# $OpenBSD: PackingList.pm,v 1.150 2023/05/16 14:31:26 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@ -177,10 +177,7 @@ sub read
if (ref $a) {
$plist = $a;
} else {
$plist = new $a;
}
if (defined $subclass->{$code}) {
bless $plist, "OpenBSD::PackingList::".$subclass->{$code};
$plist = $a->new;
}
&$code($u,
sub {
@ -562,37 +559,4 @@ sub signature
return OpenBSD::Signature->from_plist($self);
}
$subclass = {
\&defaultCode => 'Full',
\&SharedItemsOnly => 'SharedItems',
\&DirrmOnly => 'SharedItems',
\&LibraryOnly => 'Libraries',
\&FilesOnly => 'Files',
\&PrelinkStuffOnly => 'Prelink',
\&DependOnly => 'Depend',
\&ExtraInfoOnly => 'ExtraInfo',
\&UpdateInfoOnly => 'UpdateInfo',
\&ConflictOnly => 'Conflict' };
package OpenBSD::PackingList::OldLibs;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::Full;
our @ISA = qw(OpenBSD::PackingList::OldLibs);
package OpenBSD::PackingList::SharedItems;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::Libraries;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::Files;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::Prelink;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::Depend;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::ExtraInfo;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::UpdateInfo;
our @ISA = qw(OpenBSD::PackingList);
package OpenBSD::PackingList::Conflict;
our @ISA = qw(OpenBSD::PackingList);
1;

View file

@ -1,6 +1,6 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
# $OpenBSD: PkgCreate.pm,v 1.185 2023/01/25 13:25:07 espie Exp $
# $OpenBSD: PkgCreate.pm,v 1.186 2023/05/16 14:30:55 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@ -434,7 +434,7 @@ sub set_destdir
{
my ($self, $state) = @_;
if ($self->name =~ m/^\//) {
$state->{archive}->destdir($state->{base});
$state->{archive}->set_destdir($state->{base});
} else {
$self->SUPER::set_destdir($state);
}
@ -585,7 +585,7 @@ sub set_destdir
{
my ($self, $state) = @_;
$state->{archive}->destdir($state->{base}."/".$self->cwd);
$state->{archive}->set_destdir($state->{base}."/".$self->cwd);
}
sub archive

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: Ustar.pm,v 1.91 2022/05/28 23:20:28 espie Exp $
# $OpenBSD: Ustar.pm,v 1.94 2023/05/16 16:55:32 espie Exp $
#
# Copyright (c) 2002-2014 Marc Espie <espie@openbsd.org>
#
@ -49,10 +49,10 @@ use File::Basename ();
use OpenBSD::IdCache;
use OpenBSD::Paths;
our $uidcache = new OpenBSD::UidCache;
our $gidcache = new OpenBSD::GidCache;
our $unamecache = new OpenBSD::UnameCache;
our $gnamecache = new OpenBSD::GnameCache;
our $uidcache = OpenBSD::UidCache->new;
our $gidcache = OpenBSD::GidCache->new;
our $unamecache = OpenBSD::UnameCache->new;
our $gnamecache = OpenBSD::GnameCache->new;
# This is a multiple of st_blksize everywhere....
my $buffsize = 2 * 1024 * 1024;
@ -71,19 +71,24 @@ sub new
destdir => $destdir} , $class;
}
# $self->set_description($description):
# application-level description of the archive for error messages
sub set_description
{
my ($self, $d) = @_;
$self->{description} = $d;
}
# $self->set_callback(sub($size_done) {}):
# for large file extraction, provide intermediate callbacks with the
# size already done for progress meters and the likes
sub set_callback
{
my ($self, $code) = @_;
$self->{callback} = $code;
}
sub fatal
sub _fatal
{
my ($self, $msg, @args) = @_;
$self->{state}->fatal("Ustar [#1][#2]: #3",
@ -91,7 +96,7 @@ sub fatal
$self->{state}->f($msg, @args));
}
sub new_object
sub _new_object
{
my ($self, $h, $class) = @_;
$h->{archive} = $self;
@ -112,10 +117,10 @@ sub skip
}
my $actual = read($self->{fh}, $temp, $toread);
if (!defined $actual) {
$self->fatal("Error while skipping archive: #1", $!);
$self->_fatal("Error while skipping archive: #1", $!);
}
if ($actual == 0) {
$self->fatal("Premature end of archive in header");
$self->_fatal("Premature end of archive in header");
}
$self->{swallow} -= $actual;
}
@ -139,7 +144,8 @@ my $unsupported = {
LONGNAME => 'Long file',
};
sub read_records
# helpers for the XHDR type
sub _read_records
{
my ($self, $size) = @_;
my $toread = $self->{swallow};
@ -150,10 +156,10 @@ sub read_records
$maxread = $toread if $maxread > $toread;
my $actual = read($self->{fh}, $buffer, $maxread);
if (!defined $actual) {
$self->fatal("Error reading from archive: #1", $!);
$self->_fatal("Error reading from archive: #1", $!);
}
if ($actual == 0) {
$self->fatal("Premature end of archive");
$self->_fatal("Premature end of archive");
}
$self->{swallow} -= $actual;
$toread -= $actual;
@ -162,7 +168,7 @@ sub read_records
return substr($result, 0, $size);
}
sub parse_records
sub _parse_records
{
my ($self, $result, $h) = @_;
open(my $fh, '<', \$h);
@ -187,7 +193,7 @@ sub next
my $header;
my $n = read($self->{fh}, $header, 512);
return if (defined $n) and $n == 0;
$self->fatal("Error while reading header")
$self->_fatal("Error while reading header")
unless defined $n and $n == 512;
if ($header eq "\0"x512) {
return $self->next;
@ -197,14 +203,14 @@ sub next
$linkname, $magic, $version, $uname, $gname, $major, $minor,
$prefix, $pad) = unpack(USTAR_HEADER, $header);
if ($magic ne "ustar\0" || $version ne '00') {
$self->fatal("Not an ustar archive header");
$self->_fatal("Not an ustar archive header");
}
# verify checksum
my $value = $header;
substr($value, 148, 8) = " "x8;
my $ck2 = unpack("%C*", $value);
if ($ck2 != oct($chksum)) {
$self->fatal("Bad archive checksum");
$self->_fatal("Bad archive checksum");
}
$name =~ s/\0*$//o;
$mode = oct($mode) & 0xfff;
@ -248,19 +254,19 @@ sub next
$self->{swallow} += 512 - $size % 512;
}
if ($type eq XHDR) {
my $h = $self->read_records($size);
my $h = $self->_read_records($size);
$result = $self->next;
$self->parse_records($result, $h);
$self->_parse_records($result, $h);
return $result;
}
if (defined $types->{$type}) {
$self->new_object($result, $types->{$type});
$self->_new_object($result, $types->{$type});
} else {
$self->fatal("Unsupported type #1 (#2)", $type,
$self->_fatal("Unsupported type #1 (#2)", $type,
$unsupported->{$type} // "unknown");
}
if (!$result->isFile && $result->{size} != 0) {
$self->fatal("Bad archive: non null size for #1 (#2)",
$self->_fatal("Bad archive: non null size for #1 (#2)",
$types->{$type}, $result->{name});
}
@ -268,7 +274,8 @@ sub next
return $result;
}
sub split_name
# helper for prepare: ustar has strong limitations wrt directory/filename
sub _split_name
{
my $name = shift;
my $prefix = '';
@ -285,7 +292,8 @@ sub split_name
return ($prefix, $name);
}
sub extended_record
# helper for prepare
sub _extended_record
{
my ($k, $v) = @_;
my $string = " $k=$v\n";
@ -299,7 +307,7 @@ sub extended_record
}
}
sub pack_header
sub _pack_header
{
my ($archive, $type, $size, $entry, $prefix, $name, $linkname,
$uname, $gname, $major, $minor) = @_;
@ -330,10 +338,10 @@ sub pack_header
my $whatever = "usualSuspect000";
sub mkheader
sub _mkheader
{
my ($archive, $entry, $type) = @_;
my ($prefix, $name) = split_name($entry->name);
my ($prefix, $name) = _split_name($entry->name);
my ($extendedname, $extendedlink);
my $linkname = $entry->{linkname};
my $size = $entry->{size};
@ -378,22 +386,22 @@ sub mkheader
$extendedlink = 1;
}
if (length $uname > MAXUSERNAME) {
$archive->fatal("Username too long #1", $uname);
$archive->_fatal("Username too long #1", $uname);
}
if (length $gname > MAXGROUPNAME) {
$archive->fatal("Groupname too long #1", $gname);
$archive->_fatal("Groupname too long #1", $gname);
}
my $header = $archive->pack_header($type, $size, $entry,
my $header = $archive->_pack_header($type, $size, $entry,
$prefix, $name, $linkname, $uname, $gname, $major, $minor);
my $x;
if ($extendedname) {
$x .= extended_record("path", $entry->name);
$x .= _extended_record("path", $entry->name);
}
if ($extendedlink) {
$x .= extended_record("linkpath",$entry->{linkname});
$x .= _extended_record("linkpath",$entry->{linkname});
}
if ($x) {
my $extended = $archive->pack_header(XHDR, length($x), $entry,
my $extended = $archive->_pack_header(XHDR, length($x), $entry,
'', $whatever, '', $uname, $gname, $major, $minor);
$whatever++;
if ((length $x) % 512) {
@ -445,25 +453,25 @@ sub prepare
} elsif (-d _) {
$class = "OpenBSD::Ustar::Dir";
}
$self->new_object($entry, $class);
$self->_new_object($entry, $class);
if (!$entry->isFile) {
$entry->{size} = 0;
}
return $entry;
}
sub pad
sub _pad
{
my $self = shift;
my $fh = $self->{fh};
print $fh "\0"x1024 or $self->fatal("Error writing to archive: #1", $!);
print $fh "\0"x1024 or $self->_fatal("Error writing to archive: #1", $!);
}
sub close
{
my $self = shift;
if (defined $self->{padout}) {
$self->pad;
$self->_pad;
}
close($self->{fh});
}
@ -478,6 +486,12 @@ sub destdir
}
}
sub set_destdir
{
my ($self, $d) = @_;
$self->{destdir} = $d;
}
sub fh
{
return $_[0]->{fh};
@ -495,24 +509,13 @@ sub recheck_owner
->lookup($entry->{gname});
}
sub fatal
sub _fatal
{
my ($self, @args) = @_;
$self->{archive}->fatal(@args);
$self->{archive}->_fatal(@args);
}
sub system
{
my ($self, @args) = @_;
$self->{archive}{state}->system(@args);
}
sub errsay
{
my ($self, @args) = @_;
$self->{archive}{state}->errsay(@args);
}
sub left_todo
sub _left_todo
{
my ($self, $toread) = @_;
return if $toread == 0;
@ -538,7 +541,7 @@ sub set_name
$self->{name} = $v;
}
sub set_modes_on_object
sub _set_modes_on_object
{
my ($self, $o) = @_;
chown $self->{uid}, $self->{gid}, $o;
@ -548,28 +551,28 @@ sub set_modes_on_object
}
}
sub set_modes
sub _set_modes
{
my $self = shift;
$self->set_modes_on_object($self->fullname);
$self->_set_modes_on_object($self->fullname);
}
sub ensure_dir
sub _ensure_dir
{
my ($self, $dir) = @_;
return if -d $dir;
$self->ensure_dir(File::Basename::dirname($dir));
$self->_ensure_dir(File::Basename::dirname($dir));
if (mkdir($dir)) {
return;
}
$self->fatal("Error making directory #1: #2", $dir, $!);
$self->_fatal("Error making directory #1: #2", $dir, $!);
}
sub make_basedir
sub _make_basedir
{
my $self = shift;
my $dir = $self->{destdir}.File::Basename::dirname($self->name);
$self->ensure_dir($dir);
$self->_ensure_dir($dir);
}
sub write
@ -579,8 +582,8 @@ sub write
my $out = $arc->{fh};
$arc->{padout} = 1;
my $header = $arc->mkheader($self, $self->type);
print $out $header or $self->fatal("Error writing to archive: #1", $!);
my $header = $arc->_mkheader($self, $self->type);
print $out $header or $self->_fatal("Error writing to archive: #1", $!);
$self->write_contents($arc);
my $k = $self->{key};
if (!defined $arc->{key}{$k}) {
@ -619,8 +622,8 @@ sub copy
my $out = $wrarc->{fh};
$self->resolve_links($wrarc);
$wrarc->{padout} = 1;
my $header = $wrarc->mkheader($self, $self->type);
print $out $header or $self->fatal("Error writing to archive: #1", $!);
my $header = $wrarc->_mkheader($self, $self->type);
print $out $header or $self->_fatal("Error writing to archive: #1", $!);
$self->copy_contents($wrarc);
}
@ -639,8 +642,8 @@ our @ISA=qw(OpenBSD::Ustar::Object);
sub create
{
my $self = shift;
$self->ensure_dir($self->fullname);
$self->set_modes;
$self->_ensure_dir($self->fullname);
$self->_set_modes;
}
sub isDir() { 1 }
@ -653,13 +656,13 @@ our @ISA=qw(OpenBSD::Ustar::Object);
sub create
{
my $self = shift;
$self->make_basedir;
$self->_make_basedir;
my $linkname = $self->{linkname};
if (defined $self->{cwd}) {
$linkname=$self->{cwd}.'/'.$linkname;
}
link $self->{destdir}.$linkname, $self->fullname or
$self->fatal("Can't link #1#2 to #1#3: #4",
$self->_fatal("Can't link #1#2 to #1#3: #4",
$self->{destdir}, $linkname, $self->name, $!);
}
@ -672,7 +675,7 @@ sub resolve_links
$self->{linkname} = $arc->{key}{$k};
} else {
print join("\n", keys(%{$arc->{key}})), "\n";
$self->fatal("Can't copy link over: original for #1 NOT available", $k);
$self->_fatal("Can't copy link over: original for #1 NOT available", $k);
}
}
@ -687,9 +690,9 @@ our @ISA=qw(OpenBSD::Ustar::Object);
sub create
{
my $self = shift;
$self->make_basedir;
$self->_make_basedir;
symlink $self->{linkname}, $self->fullname or
$self->fatal("Can't symlink #1 to #2: #3",
$self->_fatal("Can't symlink #1 to #2: #3",
$self->{linkname}, $self->fullname, $!);
require POSIX;
POSIX::lchown($self->{uid}, $self->{gid}, $self->fullname);
@ -706,11 +709,11 @@ our @ISA=qw(OpenBSD::Ustar::Object);
sub create
{
my $self = shift;
$self->make_basedir;
$self->_make_basedir;
require POSIX;
POSIX::mkfifo($self->fullname, $self->{mode}) or
$self->fatal("Can't create fifo #1: #2", $self->fullname, $!);
$self->set_modes;
$self->_fatal("Can't create fifo #1: #2", $self->fullname, $!);
$self->_set_modes;
}
sub isFifo() { 1 }
@ -722,11 +725,11 @@ our @ISA=qw(OpenBSD::Ustar::Object);
sub create
{
my $self = shift;
$self->make_basedir;
$self->system(OpenBSD::Paths->mknod,
$self->_make_basedir;
$self->{archive}{state}->system(OpenBSD::Paths->mknod,
'-m', $self->{mode}, '--', $self->fullname,
$self->devicetype, $self->{major}, $self->{minor});
$self->set_modes;
$self->_set_modes;
}
sub isDevice() { 1 }
@ -743,6 +746,8 @@ our @ISA=qw(OpenBSD::Ustar::Device);
sub type() { OpenBSD::Ustar::BLOCKDEVICE }
sub devicetype() { 'c' }
# This is very specific to classic Unix: files with series of 0s should
# have "gaps" created by using lseek while writing.
package OpenBSD::CompactWriter;
use constant {
@ -817,9 +822,9 @@ our @ISA=qw(OpenBSD::Ustar::Object);
sub create
{
my $self = shift;
$self->make_basedir;
$self->_make_basedir;
open(my $fh, '>', $self->fullname) or
$self->fatal("Can't write to #1: #2", $self->fullname, $!);
$self->_fatal("Can't write to #1: #2", $self->fullname, $!);
$self->extract_to_fh($fh);
}
@ -832,7 +837,7 @@ sub extract_to_fh
if ($self->{partial}) {
$toread -= length($self->{partial});
unless ($out->write($self->{partial})) {
$self->fatal("Error writing to #1: #2",
$self->_fatal("Error writing to #1: #2",
$self->fullname, $!);
}
}
@ -841,22 +846,22 @@ sub extract_to_fh
$maxread = $toread if $maxread > $toread;
my $actual = read($self->{archive}{fh}, $buffer, $maxread);
if (!defined $actual) {
$self->fatal("Error reading from archive: #1", $!);
$self->_fatal("Error reading from archive: #1", $!);
}
if ($actual == 0) {
$self->fatal("Premature end of archive");
$self->_fatal("Premature end of archive");
}
$self->{archive}{swallow} -= $actual;
unless ($out->write($buffer)) {
$self->fatal("Error writing to #1: #2",
$self->_fatal("Error writing to #1: #2",
$self->fullname, $!);
}
$toread -= $actual;
$self->left_todo($toread);
$self->_left_todo($toread);
}
$self->set_modes_on_object($fh);
$out->close or $self->fatal("Error closing #1: #2",
$self->_set_modes_on_object($fh);
$out->close or $self->_fatal("Error closing #1: #2",
$self->fullname, $!);
}
@ -876,10 +881,10 @@ sub contents
my $sz = $toread;
my $actual = read($self->{archive}{fh}, $buffer, $sz, $offset);
if (!defined $actual) {
$self->fatal("Error reading from archive: #1", $!);
$self->_fatal("Error reading from archive: #1", $!);
}
if ($actual != $sz) {
$self->fatal("Error: short read from archive");
$self->_fatal("Error: short read from archive");
}
$self->{archive}{swallow} -= $actual;
$toread -= $actual;
@ -896,7 +901,7 @@ sub write_contents
my $filename = $self->{realname};
my $size = $self->{size};
my $out = $arc->{fh};
open my $fh, "<", $filename or $self->fatal("Can't read file #1: #2",
open my $fh, "<", $filename or $self->_fatal("Can't read file #1: #2",
$filename, $!);
my $buffer;
@ -906,21 +911,21 @@ sub write_contents
$maxread = $toread if $maxread > $toread;
my $actual = read($fh, $buffer, $maxread);
if (!defined $actual) {
$self->fatal("Error reading from file: #1", $!);
$self->_fatal("Error reading from file: #1", $!);
}
if ($actual == 0) {
$self->fatal("Premature end of file");
$self->_fatal("Premature end of file");
}
unless (print $out $buffer) {
$self->fatal("Error writing to archive: #1", $!);
$self->_fatal("Error writing to archive: #1", $!);
}
$toread -= $actual;
$self->left_todo($toread);
$self->_left_todo($toread);
}
if ($size % 512) {
print $out "\0" x (512 - $size % 512) or
$self->fatal("Error writing to archive: #1", $!);
$self->_fatal("Error writing to archive: #1", $!);
}
}
@ -936,21 +941,21 @@ sub copy_contents
$maxread = $toread if $maxread > $toread;
my $actual = read($self->{archive}{fh}, $buffer, $maxread);
if (!defined $actual) {
$self->fatal("Error reading from archive: #1", $!);
$self->_fatal("Error reading from archive: #1", $!);
}
if ($actual == 0) {
$self->fatal("Premature end of archive");
$self->_fatal("Premature end of archive");
}
$self->{archive}{swallow} -= $actual;
unless (print $out $buffer) {
$self->fatal("Error writing to archive #1", $!);
$self->_fatal("Error writing to archive #1", $!);
}
$toread -= $actual;
}
if ($size % 512) {
print $out "\0" x (512 - $size % 512) or
$self->fatal("Error writing to archive: #1", $!);
$self->_fatal("Error writing to archive: #1", $!);
}
$self->alias($arc, $self->name);
}

View file

@ -1,4 +1,4 @@
$OpenBSD: Ustar.pod,v 1.1 2020/12/20 15:30:58 daniel Exp $
$OpenBSD: Ustar.pod,v 1.3 2023/05/16 10:52:58 espie Exp $
=head1 NAME
@ -56,7 +56,7 @@ to be usable on pipe outputs. For archive writing, the filehandle should
support C<print>.
Error messages and fatal errors will be handled through the C<$state> object,
which should conform to C<OpenBSD::State(3p)> (uses C<errsay> and C<fatal>).
which should conform to C<OpenBSD::BaseState(3p)> (uses C<errsay> and C<fatal>).
Note that read and write support are mutually exclusive, though there is
no need to specify the mode used at creation time; it is implicitly
@ -99,13 +99,21 @@ In case of errors, the archive will call C<$state-E<gt>fatal> with a suitable
error message that contains the last index name processed. The user may
set an optional archive description with C<set_description>.
The C<create> method can take an optional C<$callback> argument, which will
be called regularly while extracting large objects, as C<&$callback($donesize)>,
with C<$donesize> the number of bytes already extracted.
The archive object can take a description through C<$arc-E<gt>set_description>
which will be used in error messages related to archive extraction or creation.
The archive object can be embued with a C<$callback> through
C<$arch-E<gt>set_callback>, which will be called regularly while
extracting large objects, as C<&$callback($donesize)>,
with C<$donesize> the number of bytes already extracted, for use in
progressmeter-style user interactions.
Small files can also be directly extracted to a scalar using
C<$v = $o-E<gt>contents>.
Actual file objects can also be directly extracted to a temporary file using
C<$oE<gt>extract_to_fh($fh)>.
Actual writing is performed through C<$o-E<gt>write> and is not mandatory
either.

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
# $OpenBSD: md5.pm,v 1.18 2019/07/05 06:21:14 espie Exp $
# $OpenBSD: md5.pm,v 1.19 2023/05/16 14:29:20 espie Exp $
#
# Copyright (c) 2003-2007 Marc Espie <espie@openbsd.org>
#
@ -18,6 +18,9 @@
use strict;
use warnings;
# XXX even though there is ONE current implementation of OpenBSD::digest
# (SHA256) we keep the framework open in case we ever need to switch,
# as we did in the past with md5 -> sha256
package OpenBSD::digest;
sub new

View file

@ -1,4 +1,4 @@
$OpenBSD: md5.pod,v 1.1 2020/12/20 15:30:58 daniel Exp $
$OpenBSD: md5.pod,v 1.2 2023/05/16 11:53:01 espie Exp $
=head1 NAME
@ -51,7 +51,7 @@ create a new digest object from a string representation.
create a new digest object C<$o2> of the same type as C<$o>.
=item $o-E<gt>equal($o2)
=item $o-E<gt>equals($o2)
compare two digest objects. Returns true only if they match.

View file

@ -1,4 +1,4 @@
/* $OpenBSD: repo.c,v 1.44 2023/04/26 16:32:41 claudio Exp $ */
/* $OpenBSD: repo.c,v 1.45 2023/05/16 17:01:31 claudio Exp $ */
/*
* Copyright (c) 2021 Claudio Jeker <claudio@openbsd.org>
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
@ -806,6 +806,7 @@ rrdp_handle_file(unsigned int id, enum publish_type pt, char *uri,
ssize_t s;
char *fn = NULL;
int fd = -1, try = 0;
int flags;
rr = rrdp_find(id);
if (rr == NULL)
@ -850,8 +851,17 @@ rrdp_handle_file(unsigned int id, enum publish_type pt, char *uri,
if (repo_mkpath(AT_FDCWD, fn) == -1)
goto fail;
fd = open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0644);
flags = O_WRONLY|O_CREAT|O_TRUNC;
if (pt == PUB_ADD)
flags |= O_EXCL;
fd = open(fn, flags, 0644);
if (fd == -1) {
if (errno == EEXIST) {
warnx("%s: duplicate publish element for %s",
rr->notifyuri, fn);
free(fn);
return 0;
}
warn("open %s", fn);
goto fail;
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: bounce.c,v 1.88 2023/05/04 12:43:44 chrisz Exp $ */
/* $OpenBSD: bounce.c,v 1.89 2023/05/15 12:03:04 op Exp $ */
/*
* Copyright (c) 2009 Gilles Chehade <gilles@poolp.org>
@ -305,7 +305,7 @@ bounce_send(struct bounce_session *s, const char *fmt, ...)
}
static const char *
bounce_duration(long long int d)
bounce_duration(long long d)
{
static char buf[32];

View file

@ -1,4 +1,4 @@
/* $OpenBSD: lka_filter.c,v 1.69 2023/05/10 07:20:20 op Exp $ */
/* $OpenBSD: lka_filter.c,v 1.70 2023/05/15 12:03:04 op Exp $ */
/*
* Copyright (c) 2018 Gilles Chehade <gilles@poolp.org>
@ -933,13 +933,13 @@ filter_protocol_query(struct filter *filter, uint64_t token, uint64_t reqid, con
n = io_printf(lka_proc_get_io(filter->proc),
"filter|%s|%lld.%06ld|smtp-in|%s|%016"PRIx64"|%016"PRIx64"|%s|%s\n",
PROTOCOL_VERSION,
(long long int)tv.tv_sec, tv.tv_usec,
(long long)tv.tv_sec, tv.tv_usec,
phase, reqid, token, fs->rdns, param);
else
n = io_printf(lka_proc_get_io(filter->proc),
"filter|%s|%lld.%06ld|smtp-in|%s|%016"PRIx64"|%016"PRIx64"|%s\n",
PROTOCOL_VERSION,
(long long int)tv.tv_sec, tv.tv_usec,
(long long)tv.tv_sec, tv.tv_usec,
phase, reqid, token, param);
if (n == -1)
fatalx("failed to write to processor");
@ -957,7 +957,7 @@ filter_data_query(struct filter *filter, uint64_t token, uint64_t reqid, const c
"filter|%s|%lld.%06ld|smtp-in|data-line|"
"%016"PRIx64"|%016"PRIx64"|%s\n",
PROTOCOL_VERSION,
(long long int)tv.tv_sec, tv.tv_usec,
(long long)tv.tv_sec, tv.tv_usec,
reqid, token, line);
if (n == -1)
fatalx("failed to write to processor");
@ -1374,7 +1374,7 @@ report_smtp_broadcast(uint64_t reqid, const char *direction, struct timeval *tv,
va_start(ap, format);
if (io_printf(lka_proc_get_io(rp->name),
"report|%s|%lld.%06ld|%s|%s|%016"PRIx64"%s",
PROTOCOL_VERSION, (long long int)tv->tv_sec, tv->tv_usec,
PROTOCOL_VERSION, (long long)tv->tv_sec, tv->tv_usec,
direction, event, reqid,
format[0] != '\n' ? "|" : "") == -1 ||
io_vprintf(lka_proc_get_io(rp->name), format, ap) == -1)

View file

@ -171,7 +171,7 @@ maildir_engine(const char *dirname, int junk)
(void)strlcpy(hostname, "localhost", sizeof hostname);
(void)snprintf(filename, sizeof filename, "%lld.%08x.%s",
(long long int) time(NULL),
(long long)time(NULL),
arc4random(),
hostname);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: mta.c,v 1.243 2022/02/18 16:57:36 millert Exp $ */
/* $OpenBSD: mta.c,v 1.244 2023/05/16 17:48:52 op Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@ -489,38 +489,41 @@ mta_setup_dispatcher(struct dispatcher *dispatcher)
if (remote->tls_ciphers)
ciphers = remote->tls_ciphers;
if (ciphers && tls_config_set_ciphers(config, ciphers) == -1)
fatal("%s", tls_config_error(config));
fatalx("%s", tls_config_error(config));
if (remote->tls_protocols) {
if (tls_config_parse_protocols(&protos,
remote->tls_protocols) == -1)
fatal("failed to parse protocols \"%s\"",
fatalx("failed to parse protocols \"%s\"",
remote->tls_protocols);
if (tls_config_set_protocols(config, protos) == -1)
fatal("%s", tls_config_error(config));
fatalx("%s", tls_config_error(config));
}
if (remote->pki) {
pki = dict_get(env->sc_pki_dict, remote->pki);
if (pki == NULL)
fatal("client pki \"%s\" not found ", remote->pki);
fatalx("client pki \"%s\" not found", remote->pki);
tls_config_set_dheparams(config, dheparams[pki->pki_dhe]);
tls_config_use_fake_private_key(config);
if (tls_config_set_keypair_mem(config, pki->pki_cert,
pki->pki_cert_len, NULL, 0) == -1)
fatal("tls_config_set_keypair_mem");
fatalx("tls_config_set_keypair_mem: %s",
tls_config_error(config));
}
if (remote->ca) {
ca = dict_get(env->sc_ca_dict, remote->ca);
if (tls_config_set_ca_mem(config, ca->ca_cert, ca->ca_cert_len)
== -1)
fatal("tls_config_set_ca_mem");
fatalx("tls_config_set_ca_mem: %s",
tls_config_error(config));
}
else if (tls_config_set_ca_file(config, tls_default_ca_cert_file())
== -1)
fatal("tls_config_set_ca_file");
fatalx("tls_config_set_ca_file: %s",
tls_config_error(config));
if (remote->tls_verify) {
tls_config_verify(config);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: mta_session.c,v 1.147 2022/09/26 08:48:52 martijn Exp $ */
/* $OpenBSD: mta_session.c,v 1.148 2023/05/15 12:03:04 op Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@ -1157,7 +1157,7 @@ mta_response(struct mta_session *s, char *line)
s->rcptcount = 0;
if (s->relay->limits->sessdelay_transaction) {
log_debug("debug: mta: waiting for %llds before next transaction",
(long long int)s->relay->limits->sessdelay_transaction);
(long long)s->relay->limits->sessdelay_transaction);
s->hangon = s->relay->limits->sessdelay_transaction -1;
s->flags |= MTA_HANGON;
runq_schedule(hangon,
@ -1177,7 +1177,7 @@ mta_response(struct mta_session *s, char *line)
}
if (s->relay->limits->sessdelay_transaction) {
log_debug("debug: mta: waiting for %llds after reset",
(long long int)s->relay->limits->sessdelay_transaction);
(long long)s->relay->limits->sessdelay_transaction);
s->hangon = s->relay->limits->sessdelay_transaction -1;
s->flags |= MTA_HANGON;
runq_schedule(hangon,

View file

@ -1,4 +1,4 @@
/* $OpenBSD: smtp.c,v 1.173 2022/02/18 16:57:36 millert Exp $ */
/* $OpenBSD: smtp.c,v 1.174 2023/05/16 17:48:52 op Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@poolp.org>
@ -166,14 +166,14 @@ smtp_setup_listener_tls(struct listener *l)
if (l->tls_ciphers)
ciphers = l->tls_ciphers;
if (ciphers && tls_config_set_ciphers(config, ciphers) == -1)
fatal("%s", tls_config_error(config));
fatalx("%s", tls_config_error(config));
if (l->tls_protocols) {
if (tls_config_parse_protocols(&protos, l->tls_protocols) == -1)
fatal("failed to parse protocols \"%s\"",
fatalx("failed to parse protocols \"%s\"",
l->tls_protocols);
if (tls_config_set_protocols(config, protos) == -1)
fatal("%s", tls_config_error(config));
fatalx("%s", tls_config_error(config));
}
pki = l->pki[0];
@ -181,7 +181,8 @@ smtp_setup_listener_tls(struct listener *l)
fatal("no pki defined");
if (tls_config_set_dheparams(config, dheparams[pki->pki_dhe]) == -1)
fatal("tls_config_set_dheparams");
fatalx("tls_config_set_dheparams: %s",
tls_config_error(config));
tls_config_use_fake_private_key(config);
for (i = 0; i < l->pkicount; i++) {
@ -189,11 +190,13 @@ smtp_setup_listener_tls(struct listener *l)
if (i == 0) {
if (tls_config_set_keypair_mem(config, pki->pki_cert,
pki->pki_cert_len, NULL, 0) == -1)
fatal("tls_config_set_keypair_mem");
fatalx("tls_config_set_keypair_mem: %s",
tls_config_error(config));
} else {
if (tls_config_add_keypair_mem(config, pki->pki_cert,
pki->pki_cert_len, NULL, 0) == -1)
fatal("tls_config_add_keypair_mem");
fatalx("tls_config_add_keypair_mem: %s",
tls_config_error(config));
}
}
free(l->pki);
@ -203,7 +206,8 @@ smtp_setup_listener_tls(struct listener *l)
ca = dict_get(env->sc_ca_dict, l->ca_name);
if (tls_config_set_ca_mem(config, ca->ca_cert, ca->ca_cert_len)
== -1)
fatal("tls_config_set_ca_mem");
fatalx("tls_config_set_ca_mem: %s",
tls_config_error(config));
}
else if (tls_config_set_ca_file(config, tls_default_ca_cert_file())
== -1)
@ -216,7 +220,7 @@ smtp_setup_listener_tls(struct listener *l)
if (l->tls == NULL)
fatal("tls_server");
if (tls_configure(l->tls, config) == -1) {
fatal("tls_configure: %s", tls_error(l->tls));
fatalx("tls_configure: %s", tls_error(l->tls));
}
tls_config_free(config);
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: smtpc.c,v 1.19 2021/07/14 13:33:57 kn Exp $ */
/* $OpenBSD: smtpc.c,v 1.20 2023/05/16 17:48:52 op Exp $ */
/*
* Copyright (c) 2018 Eric Faurot <eric@openbsd.org>
@ -237,7 +237,7 @@ main(int argc, char **argv)
if (cafile == NULL)
cafile = tls_default_ca_cert_file();
if (tls_config_set_ca_file(tls_config, cafile) == -1)
fatal("tls_set_ca_file");
fatalx("tls_set_ca_file: %s", tls_config_error(tls_config));
if (!params.tls_verify) {
tls_config_insecure_noverifycert(tls_config);
tls_config_insecure_noverifyname(tls_config);
@ -455,7 +455,7 @@ smtp_require_tls(void *tag, struct smtp_client *proto)
fatal("tls_client");
if (tls_configure(tls, tls_config) == -1)
fatal("tls_configure");
fatalx("tls_configure: %s", tls_error(tls));
smtp_set_tls(proto, tls);
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: smtpctl.c,v 1.170 2022/02/25 17:31:40 rob Exp $ */
/* $OpenBSD: smtpctl.c,v 1.171 2023/05/15 12:03:04 op Exp $ */
/*
* Copyright (c) 2013 Eric Faurot <eric@openbsd.org>
@ -136,7 +136,7 @@ offline_file(void)
FILE *fp;
if (!bsnprintf(path, sizeof(path), "%s%s/%lld.XXXXXXXXXX", PATH_SPOOL,
PATH_OFFLINE, (long long int) time(NULL)))
PATH_OFFLINE, (long long)time(NULL)))
err(EX_UNAVAILABLE, "snprintf");
if ((fd = mkstemp(path)) == -1 || (fp = fdopen(fd, "w+")) == NULL) {

View file

@ -1,4 +1,4 @@
/* $OpenBSD: user.c,v 1.128 2019/10/17 21:54:29 millert Exp $ */
/* $OpenBSD: user.c,v 1.130 2023/05/16 21:28:46 millert Exp $ */
/* $NetBSD: user.c,v 1.69 2003/04/14 17:40:07 agc Exp $ */
/*
@ -171,7 +171,7 @@ enum {
#define MKDIR "/bin/mkdir"
#define MV "/bin/mv"
#define NOLOGIN "/sbin/nologin"
#define PAX "/bin/pax"
#define CP "/bin/cp"
#define RM "/bin/rm"
#define UNSET_INACTIVE "Null (unset)"
@ -200,20 +200,18 @@ static size_t expand_len(const char *, const char *);
static struct group *find_group_info(const char *);
static struct passwd *find_user_info(const char *);
static void checkeuid(void);
static void memsave(char **, const char *, size_t);
static void strsave(char **, const char *);
static void read_defaults(user_t *);
static int verbose;
/* if *cpp is non-null, free it, then assign `n' chars of `s' to it */
/* free *cpp, then store a copy of `s' in it */
static void
memsave(char **cpp, const char *s, size_t n)
strsave(char **cpp, const char *s)
{
free(*cpp);
if ((*cpp = calloc (n + 1, sizeof(char))) == NULL)
if ((*cpp = strdup(s)) == NULL)
err(1, NULL);
memcpy(*cpp, s, n);
(*cpp)[n] = '\0';
}
/* a replacement for system(3) */
@ -313,8 +311,8 @@ copydotfiles(char *skeldir, char *dir)
if (n == 0) {
warnx("No \"dot\" initialisation files found");
} else {
(void) asystem("cd %s && %s -rw -pe %s . %s",
skeldir, PAX, (verbose) ? "-v" : "", dir);
(void) asystem("%s -a %s %s/. %s",
CP, (verbose) ? "-v" : "", skeldir, dir);
}
return n;
}
@ -788,12 +786,12 @@ read_defaults(user_t *up)
unsigned char *cp;
unsigned char *s;
memsave(&up->u_primgrp, DEF_GROUP, strlen(DEF_GROUP));
memsave(&up->u_basedir, DEF_BASEDIR, strlen(DEF_BASEDIR));
memsave(&up->u_skeldir, DEF_SKELDIR, strlen(DEF_SKELDIR));
memsave(&up->u_shell, DEF_SHELL, strlen(DEF_SHELL));
memsave(&up->u_comment, DEF_COMMENT, strlen(DEF_COMMENT));
memsave(&up->u_class, DEF_CLASS, strlen(DEF_CLASS));
strsave(&up->u_primgrp, DEF_GROUP);
strsave(&up->u_basedir, DEF_BASEDIR);
strsave(&up->u_skeldir, DEF_SKELDIR);
strsave(&up->u_shell, DEF_SHELL);
strsave(&up->u_comment, DEF_COMMENT);
strsave(&up->u_class, DEF_CLASS);
up->u_rsize = 16;
up->u_defrc = 0;
if ((up->u_rv = calloc(up->u_rsize, sizeof(range_t))) == NULL)
@ -811,27 +809,27 @@ read_defaults(user_t *up)
if (strncmp(s, "group", 5) == 0) {
for (cp = s + 5 ; isspace((unsigned char)*cp); cp++) {
}
memsave(&up->u_primgrp, cp, strlen(cp));
strsave(&up->u_primgrp, cp);
} else if (strncmp(s, "base_dir", 8) == 0) {
for (cp = s + 8 ; isspace((unsigned char)*cp); cp++) {
}
memsave(&up->u_basedir, cp, strlen(cp));
strsave(&up->u_basedir, cp);
} else if (strncmp(s, "skel_dir", 8) == 0) {
for (cp = s + 8 ; isspace((unsigned char)*cp); cp++) {
}
memsave(&up->u_skeldir, cp, strlen(cp));
strsave(&up->u_skeldir, cp);
} else if (strncmp(s, "shell", 5) == 0) {
for (cp = s + 5 ; isspace((unsigned char)*cp); cp++) {
}
memsave(&up->u_shell, cp, strlen(cp));
strsave(&up->u_shell, cp);
} else if (strncmp(s, "password", 8) == 0) {
for (cp = s + 8 ; isspace((unsigned char)*cp); cp++) {
}
memsave(&up->u_password, cp, strlen(cp));
strsave(&up->u_password, cp);
} else if (strncmp(s, "class", 5) == 0) {
for (cp = s + 5 ; isspace((unsigned char)*cp); cp++) {
}
memsave(&up->u_class, cp, strlen(cp));
strsave(&up->u_class, cp);
} else if (strncmp(s, "inactive", 8) == 0) {
for (cp = s + 8 ; isspace((unsigned char)*cp); cp++) {
}
@ -839,7 +837,7 @@ read_defaults(user_t *up)
free(up->u_inactive);
up->u_inactive = NULL;
} else {
memsave(&up->u_inactive, cp, strlen(cp));
strsave(&up->u_inactive, cp);
}
} else if (strncmp(s, "range", 5) == 0) {
for (cp = s + 5 ; isspace((unsigned char)*cp); cp++) {
@ -858,7 +856,7 @@ read_defaults(user_t *up)
free(up->u_expire);
up->u_expire = NULL;
} else {
memsave(&up->u_expire, cp, strlen(cp));
strsave(&up->u_expire, cp);
}
}
free(s);
@ -1411,8 +1409,7 @@ moduser(char *login_name, char *newlogin, user_t *up)
if ((*pwp->pw_passwd != '\0') &&
(up->u_flags & F_PASSWORD) == 0) {
up->u_flags |= F_PASSWORD;
memsave(&up->u_password, pwp->pw_passwd,
strlen(pwp->pw_passwd));
strsave(&up->u_password, pwp->pw_passwd);
explicit_bzero(pwp->pw_passwd, strlen(pwp->pw_passwd));
}
}
@ -1807,34 +1804,34 @@ useradd(int argc, char **argv)
break;
case 'b':
defaultfield = 1;
memsave(&u.u_basedir, optarg, strlen(optarg));
strsave(&u.u_basedir, optarg);
break;
case 'c':
memsave(&u.u_comment, optarg, strlen(optarg));
strsave(&u.u_comment, optarg);
break;
case 'd':
memsave(&u.u_home, optarg, strlen(optarg));
strsave(&u.u_home, optarg);
u.u_flags |= F_HOMEDIR;
break;
case 'e':
defaultfield = 1;
memsave(&u.u_expire, optarg, strlen(optarg));
strsave(&u.u_expire, optarg);
break;
case 'f':
defaultfield = 1;
memsave(&u.u_inactive, optarg, strlen(optarg));
strsave(&u.u_inactive, optarg);
break;
case 'g':
defaultfield = 1;
memsave(&u.u_primgrp, optarg, strlen(optarg));
strsave(&u.u_primgrp, optarg);
break;
case 'k':
defaultfield = 1;
memsave(&u.u_skeldir, optarg, strlen(optarg));
strsave(&u.u_skeldir, optarg);
break;
case 'L':
defaultfield = 1;
memsave(&u.u_class, optarg, strlen(optarg));
strsave(&u.u_class, optarg);
break;
case 'm':
u.u_flags |= F_MKDIR;
@ -1843,7 +1840,7 @@ useradd(int argc, char **argv)
u.u_flags |= F_DUPUID;
break;
case 'p':
memsave(&u.u_password, optarg, strlen(optarg));
strsave(&u.u_password, optarg);
explicit_bzero(optarg, strlen(optarg));
break;
case 'r':
@ -1853,7 +1850,7 @@ useradd(int argc, char **argv)
break;
case 's':
defaultfield = 1;
memsave(&u.u_shell, optarg, strlen(optarg));
strsave(&u.u_shell, optarg);
break;
case 'u':
u.u_uid = strtonum(optarg, -1, UID_MAX, &errstr);
@ -1947,23 +1944,23 @@ usermod(int argc, char **argv)
u.u_flags |= F_ACCTLOCK;
break;
case 'c':
memsave(&u.u_comment, optarg, strlen(optarg));
strsave(&u.u_comment, optarg);
u.u_flags |= F_COMMENT;
break;
case 'd':
memsave(&u.u_home, optarg, strlen(optarg));
strsave(&u.u_home, optarg);
u.u_flags |= F_HOMEDIR;
break;
case 'e':
memsave(&u.u_expire, optarg, strlen(optarg));
strsave(&u.u_expire, optarg);
u.u_flags |= F_EXPIRE;
break;
case 'f':
memsave(&u.u_inactive, optarg, strlen(optarg));
strsave(&u.u_inactive, optarg);
u.u_flags |= F_INACTIVE;
break;
case 'g':
memsave(&u.u_primgrp, optarg, strlen(optarg));
strsave(&u.u_primgrp, optarg);
u.u_flags |= F_GROUP;
break;
case 'l':
@ -1975,7 +1972,7 @@ usermod(int argc, char **argv)
u.u_flags |= F_USERNAME;
break;
case 'L':
memsave(&u.u_class, optarg, strlen(optarg));
strsave(&u.u_class, optarg);
u.u_flags |= F_CLASS;
break;
case 'm':
@ -1985,12 +1982,12 @@ usermod(int argc, char **argv)
u.u_flags |= F_DUPUID;
break;
case 'p':
memsave(&u.u_password, optarg, strlen(optarg));
strsave(&u.u_password, optarg);
explicit_bzero(optarg, strlen(optarg));
u.u_flags |= F_PASSWORD;
break;
case 's':
memsave(&u.u_shell, optarg, strlen(optarg));
strsave(&u.u_shell, optarg);
u.u_flags |= F_SHELL;
break;
case 'u':
@ -2091,8 +2088,8 @@ userdel(int argc, char **argv)
(void)removehomedir(pwp->pw_name, pwp->pw_uid, pwp->pw_dir);
if (u.u_preserve) {
u.u_flags |= F_SHELL;
memsave(&u.u_shell, NOLOGIN, strlen(NOLOGIN));
memsave(&u.u_password, "*", strlen("*"));
strsave(&u.u_shell, NOLOGIN);
strsave(&u.u_password, "*");
u.u_flags |= F_PASSWORD;
openlog("userdel", LOG_PID, LOG_USER);
return moduser(*argv, *argv, &u) ? EXIT_SUCCESS : EXIT_FAILURE;
@ -2225,7 +2222,7 @@ groupmod(int argc, char **argv)
dupgid = 1;
break;
case 'n':
memsave(&newname, optarg, strlen(optarg));
strsave(&newname, optarg);
break;
case 'v':
verbose = 1;