sync code with last improvements from OpenBSD

This commit is contained in:
purplerain 2023-09-03 19:42:11 +00:00
parent 151b4b8168
commit e70dd78b1d
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
19 changed files with 587 additions and 31 deletions

View file

@ -6610,6 +6610,7 @@ t/op/svleak.pl Test file for svleak.t
t/op/svleak.t See if stuff leaks SVs t/op/svleak.t See if stuff leaks SVs
t/op/switch.t See if switches (given/when) work t/op/switch.t See if switches (given/when) work
t/op/symbolcache.t See if undef/delete works on stashes with functions t/op/symbolcache.t See if undef/delete works on stashes with functions
t/op/syscall_emulator.t Tests that syscall works via the emulator
t/op/sysio.t See if sysread and syswrite work t/op/sysio.t See if sysread and syswrite work
t/op/taint.t See if tainting works t/op/taint.t See if tainting works
t/op/threads.t Misc. tests for perl features with threads t/op/threads.t Misc. tests for perl features with threads

View file

@ -541,7 +541,7 @@ c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro_core.c p
c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
c3 = taint.c toke.c util.c deb.c run.c builtin.c universal.c pad.c globals.c keywords.c c3 = taint.c toke.c util.c deb.c run.c builtin.c universal.c pad.c globals.c keywords.c
c4 = perlio.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c caretx.c dquote.c time64.c c4 = perlio.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c caretx.c dquote.c time64.c
c5 = $(mallocsrc) c5 = $(mallocsrc) syscall_emulator.c
!NO!SUBS! !NO!SUBS!
@ -557,7 +557,7 @@ c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c $(mini_only_src)
obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro_core$(OBJ_EXT) keywords$(OBJ_EXT) builtin$(OBJ_EXT) obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro_core$(OBJ_EXT) keywords$(OBJ_EXT) builtin$(OBJ_EXT)
obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT) dquote$(OBJ_EXT) time64$(OBJ_EXT) obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT) dquote$(OBJ_EXT) time64$(OBJ_EXT) syscall_emulator$(OBJ_EXT)
# split the objects into 3 exclusive sets: those used by both miniperl and # split the objects into 3 exclusive sets: those used by both miniperl and
# perl, and those used by just one or the other. Doesn't include the # perl, and those used by just one or the other. Doesn't include the

View file

@ -1,4 +1,4 @@
# $OpenBSD: Makefile.bsd-wrapper,v 1.113 2023/02/15 01:38:20 afresh1 Exp $ # $OpenBSD: Makefile.bsd-wrapper,v 1.114 2023/09/03 01:43:09 afresh1 Exp $
# #
# Build wrapper for Perl # Build wrapper for Perl
# #
@ -39,11 +39,18 @@ cleandir:
fi fi
cd ${.CURDIR} && ${MAKE} -f Makefile.bsd-wrapper1 cleandir cd ${.CURDIR} && ${MAKE} -f Makefile.bsd-wrapper1 cleandir
all: config.sh all: syscall_emulator.c config.sh
cd ${.CURDIR} && exec ${MAKE} -f Makefile.bsd-wrapper1 perl.build cd ${.CURDIR} && exec ${MAKE} -f Makefile.bsd-wrapper1 perl.build
cd ${.CURDIR} && exec ${MAKE} -f Makefile.bsd-wrapper1 mansrc.build cd ${.CURDIR} && exec ${MAKE} -f Makefile.bsd-wrapper1 mansrc.build
install: install:
cd ${.CURDIR} && exec ${MAKE} -f Makefile.bsd-wrapper1 install cd ${.CURDIR} && exec ${MAKE} -f Makefile.bsd-wrapper1 install
syscall_emulator.c: gen_syscall_emulator.pl syscall_emulator.h /usr/include/sys/syscall.h /usr/include/sys/syscallargs.h
/usr/bin/perl $(.CURDIR)/gen_syscall_emulator.pl > $@
syscall_emulator.h:
ln -sf $(.CURDIR)/$@ $@
.include <bsd.obj.mk> .include <bsd.obj.mk>

View file

@ -103,12 +103,19 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
"panic: av_extend_guts() negative count (%" IVdf ")", (IV)key); "panic: av_extend_guts() negative count (%" IVdf ")", (IV)key);
if (key > *maxp) { if (key > *maxp) {
SSize_t ary_offset = *maxp + 1; SSize_t ary_offset = *maxp + 1; /* Start NULL initialization
SSize_t to_null = 0; * from this element */
SSize_t to_null = 0; /* How many elements to Zero */
SSize_t newmax = 0; SSize_t newmax = 0;
if (av && *allocp != *arrayp) { /* a shifted SV* array exists */ if (av && *allocp != *arrayp) { /* a shifted SV* array exists */
/* to_null will contain the number of elements currently
* shifted and about to be unshifted. If the array has not
* been shifted to the maximum possible extent, this will be
* a smaller number than (*maxp - AvFILLp(av)). */
to_null = *arrayp - *allocp; to_null = *arrayp - *allocp;
*maxp += to_null; *maxp += to_null;
ary_offset = AvFILLp(av) + 1; ary_offset = AvFILLp(av) + 1;
@ -116,6 +123,13 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
if (key > *maxp - 10) { if (key > *maxp - 10) {
newmax = key + *maxp; newmax = key + *maxp;
/* Zero everything above AvFILLp(av), which could be more
* elements than have actually been shifted. If we don't
* do this, trailing elements at the end of the resized
* array may not be correctly initialized. */
to_null = *maxp - AvFILLp(av);
goto resize; goto resize;
} }
} else if (*allocp) { /* a full SV* array exists */ } else if (*allocp) { /* a full SV* array exists */
@ -167,7 +181,9 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
#ifdef Perl_safesysmalloc_size #ifdef Perl_safesysmalloc_size
resized: resized:
#endif #endif
to_null += newmax - *maxp; to_null += newmax - *maxp; /* Initialize all new elements
* (newmax - *maxp) in addition to
* any previously specified */
*maxp = newmax; *maxp = newmax;
/* See GH#18014 for discussion of when this might be needed: */ /* See GH#18014 for discussion of when this might be needed: */
@ -193,7 +209,7 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
* don't get any special treatment here. * don't get any special treatment here.
* See https://github.com/Perl/perl5/pull/18690 for more detail */ * See https://github.com/Perl/perl5/pull/18690 for more detail */
ary_offset = 0; ary_offset = 0;
to_null = *maxp+1; to_null = *maxp+1; /* Initialize all new array elements */
goto zero; goto zero;
} }

View file

@ -1,7 +1,7 @@
# #
# Override default paths when building in the SecBSD src tree # Override default paths when building in the SecBSD src tree
# #
# $OpenBSD: config.over,v 1.22 2017/02/05 00:33:38 afresh1 Exp $ # $OpenBSD: config.over,v 1.23 2023/09/03 01:43:09 afresh1 Exp $
# #
# We use a different architecture name than the default # We use a different architecture name than the default
@ -64,3 +64,9 @@ myuname='secbsd'
# force to use ranlib # force to use ranlib
ranlib='ranlib' ranlib='ranlib'
# Enable the syscall emulator,
# enabling syscall even if we don't have it
d_syscall=define
d_syscallproto=define

View file

@ -0,0 +1,360 @@
#!/usr/bin/perl
# $OpenBSD: gen_syscall_emulator.pl,v 1.1 2023/09/03 01:43:09 afresh1 Exp $ #
use v5.36;
use autodie;
# Copyright (c) 2023 Andrew Hewus Fresh <afresh1@openbsd.org>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
my $includes = '/usr/include';
# Because perl uses a long for every syscall argument,
# if we are building a syscall_emulator for use by perl,
# taking that into account make things work more consistently
# across different OpenBSD architectures.
# Unfortunately there doesn't appear to be an easy way
# to make everything work "the way it was".
use constant PERL_LONG_ARGS => 1;
# See also /usr/src/sys/kern/syscalls.master
my %syscalls = parse_syscalls(
"$includes/sys/syscall.h",
"$includes/sys/syscallargs.h",
)->%*;
delete $syscalls{MAXSYSCALL}; # not an actual function
# The ordered list of all the headers we need
my @headers = qw<
sys/syscall.h
stdarg.h
errno.h
sys/socket.h
sys/event.h
sys/futex.h
sys/ioctl.h
sys/ktrace.h
sys/mman.h
sys/mount.h
sys/msg.h
sys/poll.h
sys/ptrace.h
sys/resource.h
sys/select.h
sys/sem.h
sys/shm.h
sys/stat.h
sys/sysctl.h
sys/time.h
sys/uio.h
sys/wait.h
dirent.h
fcntl.h
sched.h
signal.h
stdlib.h
stdio.h
syslog.h
tib.h
time.h
unistd.h
>;
foreach my $header (@headers) {
my $filename = "$includes/$header";
open my $fh, '<', $filename;
my $content = do { local $/; readline $fh };
close $fh;
foreach my $name (sort keys %syscalls) {
my $s = $syscalls{$name};
my $func_sig = find_func_sig($content, $name, $s);
if (ref $func_sig) {
die "Multiple defs for $name <$header> <$s->{header}>"
if $s->{header};
$s->{func} = $func_sig;
$s->{header} = $header;
} elsif ($func_sig) {
$s->{mismatched_sig} = "$func_sig <$header>";
}
}
}
say "/*\n * Generated from gen_syscall_emulator.pl\n */";
say "#include <$_>" for @headers;
print <<"EOL";
#include "syscall_emulator.h"
long
syscall_emulator(int syscall, ...)
{
long ret = 0;
va_list args;
va_start(args, syscall);
switch(syscall) {
EOL
foreach my $name (
sort { $syscalls{$a}{id} <=> $syscalls{$b}{id} } keys %syscalls
) {
my %s = %{ $syscalls{$name} };
# Some syscalls we can't emulate, so we comment those out.
$s{skip} //= "Indirect syscalls not supported"
if !$s{argtypes} && ($s{args}[-1] || '') eq '...';
$s{skip} //= "Mismatched func: $s{mismatched_sig}"
if $s{mismatched_sig} and not $s{func};
$s{skip} //= "No signature found in headers"
unless $s{header};
my $ret = $s{ret} eq 'void' ? '' : 'ret = ';
$ret .= '(long)' if $s{ret} eq 'void *';
my (@args, @defines);
my $argname = '';
if ($s{argtypes}) {
if (@{ $s{argtypes} } > 1) {
@defines = map {
my $t = $_->{type};
my $n = $_->{name};
$n = "_$n" if $n eq $name; # link :-/
push @args, $n;
PERL_LONG_ARGS
? "$t $n = ($t)va_arg(args, long);"
: "$t $n = va_arg(args, $t);"
} @{ $s{argtypes} };
} else {
if (@{ $s{argtypes} }) {
$argname = " // " . join ', ',
map { $_->{name} }
@{ $s{argtypes} };
}
@args = map { "va_arg(args, $_->{type})" }
@{ $s{argtypes} };
}
} else {
@args = @{ $s{args} };
# If we didn't find args in syscallargs.h but have args
# we don't know how to write our function.
$s{skip} //= "Not found in sys/syscallargs.h"
if @args;
}
#my $header = $s{header} ? " <$s{header}>" : '';
my $indent = "\t";
say "$indent/* $s{skip}" if $s{skip};
$indent .= ' *' if $s{skip};
say "${indent} $s{signature} <sys/syscall.h>"
if $s{skip} && $s{skip} =~ /Mismatch/;
my $brace = @defines ? " {" : "";
say "${indent}case $s{define}:$brace"; # // $s{id}";
say "${indent}\t$_" for @defines;
#say "${indent}\t// $s{signature}$header";
say "${indent}\t$ret$name(" . join(', ', @args) . ");$argname";
say "${indent}\tbreak;";
say "${indent}}" if $brace;
say "\t */" if $s{skip};
}
print <<"EOL";
default:
ret = -1;
errno = ENOSYS;
}
va_end(args);
return ret;
}
EOL
sub parse_syscalls($syscall, $args)
{
my %s = parse_syscall_h($syscall)->%*;
my %a = parse_syscallargs_h($args)->%*;
$s{$_}{argtypes} = $a{$_} for grep { $a{$_} } keys %s;
return \%s;
}
sub parse_syscall_h($filename)
{
my %s;
open my $fh, '<', $filename;
while (readline $fh) {
if (m{^/\*
\s+ syscall: \s+ "(?<name>[^"]+)"
\s+ ret: \s+ "(?<ret> [^"]+)"
\s+ args: \s+ (?<args>.*?)
\s* \*/
|
^\#define \s+ (?<define>SYS_(?<name>\S+)) \s+ (?<id>\d+)
}x)
{
my $name = $+{name};
$s{$name}{$_} = $+{$_} for keys %+;
$s{$name}{args} = [ $+{args} =~ /"(.*?)"/g ]
if exists $+{args};
}
}
close $fh;
foreach my $name (keys %s) {
my %d = %{ $s{$name} };
next unless $d{ret}; # the MAXSYSCALL
my $ret = $d{ret};
my @args = @{ $d{args} || [] };
@args = 'void' unless @args;
if ($args[-1] ne '...') {
my @a;
for (@args) {
push @a, $_;
last if $_ eq '...';
}
@args = @a;
}
my $args = join ", ", @args;
$s{$name}{signature} = "$ret\t$name($args);" =~ s/\s+/ /gr;
#print " $s{$name}{signature}\n";
}
return \%s;
}
sub parse_syscallargs_h($filename)
{
my %args;
open my $fh, '<', $filename;
while (readline $fh) {
if (my ($syscall) = /^struct \s+ sys_(\w+)_args \s+ \{/x) {
$args{$syscall} = [];
while (readline $fh) {
last if /^\s*\};\s*$/;
if (/syscallarg
\( (?<type> [^)]+ ) \)
\s+ (?<name> \w+ ) \s* ;
/x) {
push @{$args{$syscall}}, {%+};
}
}
}
}
close $fh;
return \%args;
}
sub find_func_sig($content, $name, $s)
{
my $re = $s->{re} //= qr{^
(?<ret> \S+ (?: [^\S\n]+ \S+)? ) [^\S\n]* \n?
\b \Q$name\E \( (?<args> [^)]* ) \)
[^;]*;
}xms;
$content =~ /$re/ || return !!0;
my $ret = $+{ret};
my $args = $+{args};
for ($ret, $args) {
s/^\s+//;
s/\s+$//;
s/\s+/ /g;
}
# The actual functions may have this extra annotation
$args =~ s/\*\s*__restrict/*/g;
my %func_sig = ( ret => $ret, args => [ split /\s*,\s*/, $args ] );
return "$ret $name($args);" =~ s/\s+/ /gr
unless sigs_match($s, \%func_sig);
return \%func_sig;
}
# Tests whether two types are equivalent.
# Sometimes there are two ways to represent the same thing
# and it seems the functions and the syscalls
# differ a fair amount.
sub types_match($l, $r)
{
state %m = (
caddr_t => 'char *',
idtype_t => 'int',
nfds_t => 'u_int',
__off_t => 'off_t',
pid_t => 'int',
__size_t => 'u_long',
size_t => 'u_long',
'unsigned int' => 'u_int',
'unsigned long' => 'u_long',
);
$l //= '__undef__';
$r //= '__undef__';
s/\b volatile \s+//x for $l, $r;
s/\b const \s+//x for $l, $r;
s/\s* \[\d*\] $/ \*/x for $l, $r;
my ($f, $s) = sort { length($a) <=> length($b) } $l, $r;
if (index($s, $f) == 0) {
$s =~ s/^\Q$f\E\s*//;
if ( $s && $s =~ /^\w+$/ ) {
#warn "prefix ['$f', '$s']\n";
s/\s*\Q$s\E$// for $l, $r;
}
}
$l = $m{$l} //= $l;
$r = $m{$r} //= $r;
return $l eq $r;
}
# Tests whether two function signatures match,
# expected to be left from syscall.h, right from the appopriate header.
sub sigs_match($l, $r)
{
return !!0 unless types_match( $l->{ret}, $l->{ret} );
my @l_args = @{ $l->{args} || [] };
my @r_args = @{ $r->{args} || [] };
for (\@l_args, \@r_args) {
@{$_} = 'void' unless @{$_};
}
for my $i ( 0 .. $#l_args ) {
return !!0 unless types_match($l_args[$i], $r_args[$i]);
last if $l_args[$i] eq '...';
}
return !!1;
}

View file

@ -30,6 +30,8 @@
#define PERL_IN_PP_SYS_C #define PERL_IN_PP_SYS_C
#include "perl.h" #include "perl.h"
#include "time64.h" #include "time64.h"
#include "syscall_emulator.h"
#define syscall syscall_emulator
#ifdef I_SHADOW #ifdef I_SHADOW
/* Shadow password support for solaris - pdo@cs.umd.edu /* Shadow password support for solaris - pdo@cs.umd.edu

View file

@ -0,0 +1 @@
long syscall_emulator(int, ...);

View file

@ -6,7 +6,7 @@ BEGIN {
set_up_inc('.', '../lib'); set_up_inc('.', '../lib');
} }
plan (194); plan (195);
# #
# @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them # @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them
@ -686,4 +686,8 @@ $#a = -1; $#a++;
'holes passed to sub do not lose their position (aelem, mg)'; 'holes passed to sub do not lose their position (aelem, mg)';
} }
# GH #21235
fresh_perl_is('my @x;$x[0] = 1;shift @x;$x[22] = 1;$x[25] = 1;','',
{}, 'unshifting and growing an array initializes trailing elements');
"We're included by lib/Tie/Array/std.t so we need to return something true"; "We're included by lib/Tie/Array/std.t so we need to return something true";

View file

@ -0,0 +1,148 @@
#!/usr/bin/perl
# $OpenBSD: syscall_emulator.t,v 1.1 2023/09/03 01:43:09 afresh1 Exp $ #
# Copyright (c) 2023 Andrew Hewus Fresh <afresh1@openbsd.org>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
BEGIN {
chdir 't' if -d 't';
require "./test.pl";
set_up_inc( qw(. ../lib lib ../dist/base/lib) );
}
use v5.36;
use File::Temp;
use POSIX qw< S_IRUSR S_IWUSR S_IRGRP S_IROTH O_CREAT O_WRONLY O_RDONLY >;
use constant {
PROT_READ => 0x01,
MAP_PRIVATE => 0x0002,
MAP_FAILED => -1,
};
my $dir = File::Temp->newdir("syscall_emulator-XXXXXXXXX");
{
local $ENV{PERL5LIB} = join ':', @INC;
open(my $fh, '-|', $^X, "../utils/h2ph", '-d', $dir,
"/usr/include/sys/syscall.h") or die "h2ph: $!";
note <$fh>;
close($fh) or die $! ? "h2ph: $!" : "h2ph: $?";
local @INC = ("$dir/usr/include", "$dir");
require 'sys/syscall.ph';
}
my $filename = "test.txt";
my $file = "$dir/$filename";
my $fd;
my $out = "Hello World\n";
my $in = "\0" x 32;
my ($in_p, $in_v);
my $sb = "\0" x 4096;
my $st_mode;
my $perms = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
plan tests => 17;
ok(!
(($fd = syscall(SYS_open(), $file, O_CREAT|O_WRONLY, $perms)) < 0),
"Opened $filename for write/create"
);
ok(!
(syscall(SYS_write(), $fd, $out, length $out) <= 0),
"Wrote out to $filename"
);
ok(!
(syscall(SYS_close(), $fd) != 0),
"closed $filename"
);
ok(!
(syscall(SYS_stat(), $file, $sb) != 0),
"stat $filename"
);
# fortunately st_mode is the first unsigned long in stat struct
$st_mode = unpack "L", $sb;
ok( ($st_mode & 0777) == ($perms & 0777),
sprintf "new file %s has correct permissions (%o)",
$filename, $st_mode & 0777
);
ok(!
(($fd = syscall(SYS_open(), $file, O_RDONLY)) < 0),
"Opened $filename for read"
);
ok(!
(syscall(SYS_read(), $fd, $in, length $in) <= 0),
"read from $filename"
);
$in = unpack 'Z*', $in;
ok( length($in) == length($out) && ($in eq $out),
"Read written content from $filename"
);
ok(!
(syscall(SYS_lseek(), $fd, 0, SEEK_SET) < 0),
"lseek on fd"
);
ok(!
(syscall(SYS_pread(), $fd, $in = "\0" x 32, 5, 3) < 0),
"pread on fd"
);
$in = unpack 'Z*', $in;
ok( length($in) == 5 && ($in eq substr $out, 3, 5),
"Read written content from $filename ($in)"
);
ok(!
(syscall(SYS_lseek(), $fd, 0, SEEK_SET) < 0),
"lseek on fd"
);
ok(!
(syscall(SYS_lseek(), $fd, 0, SEEK_SET) < 0),
"lseek on fd"
);
ok(!
(($in_p = syscall(SYS_mmap(), undef, length($out), PROT_READ, MAP_PRIVATE,
$fd, 0)) == MAP_FAILED),
"mmap fd"
);
# From ingy's Pointer module
$in_v = unpack "p*", pack "L!", $in_p;
ok( length($in_v) == length($out) && ($in_v eq $out),
"Read written content from $filename"
);
ok(!
(syscall(SYS_munmap(), $in_p, length($out)) != 0),
"munmap fd"
);
ok(!
(syscall(SYS_close(), $fd) != 0),
"closed $filename"
);

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: bsd.port.mk.5,v 1.583 2023/09/02 17:19:57 espie Exp $ .\" $OpenBSD: bsd.port.mk.5,v 1.585 2023/09/03 12:24:16 espie Exp $
.\" .\"
.\" Copyright (c) 2000-2008 Marc Espie .\" Copyright (c) 2000-2008 Marc Espie
.\" .\"
@ -24,7 +24,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.Dd $Mdocdate: September 2 2023 $ .Dd $Mdocdate: September 3 2023 $
.Dt BSD.PORT.MK 5 .Dt BSD.PORT.MK 5
.Os .Os
.Sh NAME .Sh NAME
@ -2151,6 +2151,7 @@ Defaults to
If set, points to a local directory common for all instances of If set, points to a local directory common for all instances of
concurrent ports builds. concurrent ports builds.
.It Ev LOCK_CMD .It Ev LOCK_CMD
User settings.
Expands to a command that will acquire a lock, namely Expands to a command that will acquire a lock, namely
.Xr portlock 1 . .Xr portlock 1 .
See also See also
@ -2808,6 +2809,10 @@ derived from the
Do not override without very good reasons, Do not override without very good reasons,
namely software that coexist as different incompatible versions with the namely software that coexist as different incompatible versions with the
same stem, e.g., already a mess. same stem, e.g., already a mess.
Also See the description of
.Fl P
in
.Xr pkg_create 1
.It Ev PKGSTEM .It Ev PKGSTEM
Base for the package name without any version number. Base for the package name without any version number.
Used in Used in
@ -2840,12 +2845,6 @@ plists actually get saved into
.Pa ${PLIST_REPOSITORY}/${MACHINE_ARCH} .Pa ${PLIST_REPOSITORY}/${MACHINE_ARCH}
.Pc . .Pc .
If set to empty, will not register anything: very much unsafe. If set to empty, will not register anything: very much unsafe.
.It Ev PORTS_BUILD_XENOCARA_TOO
EXPERIMENTAL.
Set to
.Sq Yes
to build xenocara through ports.
This is highly experimental and not recommended.
.It Ev PORTROACH .It Ev PORTROACH
Controls the behavior of Controls the behavior of
.Pa misc/portroach .Pa misc/portroach

View file

@ -1,4 +1,4 @@
/* $OpenBSD: identcpu.c,v 1.137 2023/08/16 04:07:37 jsg Exp $ */ /* $OpenBSD: identcpu.c,v 1.138 2023/09/03 09:30:43 mlarkin Exp $ */
/* $NetBSD: identcpu.c,v 1.1 2003/04/26 18:39:28 fvdl Exp $ */ /* $NetBSD: identcpu.c,v 1.1 2003/04/26 18:39:28 fvdl Exp $ */
/* /*
@ -228,6 +228,7 @@ const struct {
}, cpu_cpuid_perf_eax[] = { }, cpu_cpuid_perf_eax[] = {
{ CPUIDEAX_VERID, "PERF" }, { CPUIDEAX_VERID, "PERF" },
}, cpu_cpuid_apmi_edx[] = { }, cpu_cpuid_apmi_edx[] = {
{ CPUIDEDX_HWPSTATE, "HWPSTATE" },
{ CPUIDEDX_ITSC, "ITSC" }, { CPUIDEDX_ITSC, "ITSC" },
}, cpu_amdspec_ebxfeatures[] = { }, cpu_amdspec_ebxfeatures[] = {
{ CPUIDEBX_INVLPGB, "INVLPGB" }, { CPUIDEBX_INVLPGB, "INVLPGB" },

View file

@ -1,4 +1,4 @@
/* $OpenBSD: vmm_machdep.c,v 1.5 2023/08/15 08:27:29 miod Exp $ */ /* $OpenBSD: vmm_machdep.c,v 1.6 2023/09/03 09:30:43 mlarkin Exp $ */
/* /*
* Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org> * Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
* *
@ -6319,7 +6319,7 @@ vmm_handle_cpuid(struct vcpu *vcpu)
*rax = eax; *rax = eax;
*rbx = ebx; *rbx = ebx;
*rcx = ecx; *rcx = ecx;
*rdx = edx; *rdx = edx & VMM_APMI_EDX_MASK;
break; break;
case 0x80000008: /* Phys bits info and topology (AMD) */ case 0x80000008: /* Phys bits info and topology (AMD) */
*rax = eax; *rax = eax;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: specialreg.h,v 1.108 2023/08/16 04:07:37 jsg Exp $ */ /* $OpenBSD: specialreg.h,v 1.109 2023/09/03 09:30:43 mlarkin Exp $ */
/* $NetBSD: specialreg.h,v 1.1 2003/04/26 18:39:48 fvdl Exp $ */ /* $NetBSD: specialreg.h,v 1.1 2003/04/26 18:39:48 fvdl Exp $ */
/* $NetBSD: x86/specialreg.h,v 1.2 2003/04/25 21:54:30 fvdl Exp $ */ /* $NetBSD: x86/specialreg.h,v 1.2 2003/04/25 21:54:30 fvdl Exp $ */
@ -329,6 +329,7 @@
* "Advanced Power Management Information" bits (CPUID function 0x80000007): * "Advanced Power Management Information" bits (CPUID function 0x80000007):
* EDX bits. * EDX bits.
*/ */
#define CPUIDEDX_HWPSTATE (1 << 7) /* Hardware P State Control */
#define CPUIDEDX_ITSC (1 << 8) /* Invariant TSC */ #define CPUIDEDX_ITSC (1 << 8) /* Invariant TSC */
/* /*

View file

@ -1,4 +1,4 @@
/* $OpenBSD: vmmvar.h,v 1.91 2023/04/26 15:11:21 mlarkin Exp $ */ /* $OpenBSD: vmmvar.h,v 1.92 2023/09/03 09:30:43 mlarkin Exp $ */
/* /*
* Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org> * Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
* *
@ -559,6 +559,7 @@ struct vm_mprotect_ept_params {
CPUIDEBX_STIBP | CPUIDEBX_IBRS_ALWAYSON | CPUIDEBX_STIBP_ALWAYSON | \ CPUIDEBX_STIBP | CPUIDEBX_IBRS_ALWAYSON | CPUIDEBX_STIBP_ALWAYSON | \
CPUIDEBX_IBRS_PREF | CPUIDEBX_SSBD | CPUIDEBX_VIRT_SSBD | \ CPUIDEBX_IBRS_PREF | CPUIDEBX_SSBD | CPUIDEBX_VIRT_SSBD | \
CPUIDEBX_SSBD_NOTREQ) CPUIDEBX_SSBD_NOTREQ)
#define VMM_APMI_EDX_MASK ~(CPUIDEDX_HWPSTATE)
/* /*
* SEFF flags - copy from host minus: * SEFF flags - copy from host minus:

View file

@ -1,4 +1,4 @@
/* $OpenBSD: map.c,v 1.22 2023/08/13 09:48:27 mpi Exp $ */ /* $OpenBSD: map.c,v 1.23 2023/09/03 10:26:35 mpi Exp $ */
/* /*
* Copyright (c) 2020 Martin Pieuchot <mpi@openbsd.org> * Copyright (c) 2020 Martin Pieuchot <mpi@openbsd.org>
@ -176,6 +176,7 @@ map_insert(struct map *map, const char *key, struct bt_arg *bval,
val += ba2long(bval->ba_value, dtev); val += ba2long(bval->ba_value, dtev);
mep->mval->ba_value = (void *)val; mep->mval->ba_value = (void *)val;
break; break;
case B_AT_BI_COMM:
case B_AT_BI_KSTACK: case B_AT_BI_KSTACK:
case B_AT_BI_USTACK: case B_AT_BI_USTACK:
free(mep->mval); free(mep->mval);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: server.c,v 1.127 2023/07/12 12:37:27 tb Exp $ */ /* $OpenBSD: server.c,v 1.128 2023/09/03 10:18:18 nicm Exp $ */
/* /*
* Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org> * Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
@ -1461,7 +1461,7 @@ server_bufferevent_write_chunk(struct client *clt,
struct evbuffer *buf, size_t size) struct evbuffer *buf, size_t size)
{ {
int ret; int ret;
ret = server_bufferevent_write(clt, buf->buffer, size); ret = server_bufferevent_write(clt, EVBUFFER_DATA(buf), size);
if (ret != -1) if (ret != -1)
evbuffer_drain(buf, size); evbuffer_drain(buf, size);
return (ret); return (ret);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: relay.c,v 1.256 2023/06/06 15:16:52 beck Exp $ */ /* $OpenBSD: relay.c,v 1.257 2023/09/03 10:22:03 nicm Exp $ */
/* /*
* Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org> * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
@ -2629,7 +2629,7 @@ relay_bufferevent_write_chunk(struct ctl_relay_event *cre,
struct evbuffer *buf, size_t size) struct evbuffer *buf, size_t size)
{ {
int ret; int ret;
ret = relay_bufferevent_write(cre, buf->buffer, size); ret = relay_bufferevent_write(cre, EVBUFFER_DATA(buf), size);
if (ret != -1) if (ret != -1)
evbuffer_drain(buf, size); evbuffer_drain(buf, size);
return (ret); return (ret);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: mft.c,v 1.96 2023/06/29 10:28:25 tb Exp $ */ /* $OpenBSD: mft.c,v 1.97 2023/09/03 10:48:50 job Exp $ */
/* /*
* Copyright (c) 2022 Theo Buehler <tb@openbsd.org> * Copyright (c) 2022 Theo Buehler <tb@openbsd.org>
* Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
@ -233,6 +233,7 @@ mft_parse_filehash(struct parse *p, const FileAndHash *fh)
int rc = 0; int rc = 0;
struct mftfile *fent; struct mftfile *fent;
enum rtype type; enum rtype type;
size_t new_idx = 0;
if (!valid_mft_filename(fh->file->data, fh->file->length)) { if (!valid_mft_filename(fh->file->data, fh->file->length)) {
warnx("%s: RFC 6486 section 4.2.2: bad filename", p->fn); warnx("%s: RFC 6486 section 4.2.2: bad filename", p->fn);
@ -256,8 +257,15 @@ mft_parse_filehash(struct parse *p, const FileAndHash *fh)
p->found_crl = 1; p->found_crl = 1;
} }
/* Insert the filename and hash value. */ if (filemode)
fent = &p->res->files[p->res->filesz++]; fent = &p->res->files[p->res->filesz++];
else {
/* Fisher-Yates shuffle */
new_idx = arc4random_uniform(p->res->filesz + 1);
p->res->files[p->res->filesz++] = p->res->files[new_idx];
fent = &p->res->files[new_idx];
}
fent->type = type; fent->type = type;
fent->file = fn; fent->file = fn;
fn = NULL; fn = NULL;