Make improvements

- Get mprotect_test working on aarch64
- Get completion working on python.com repl again
- Improve quality of printvideo.com and printimage.com
- Fix bug in openpty() so examples/script.c works again
This commit is contained in:
Justine Tunney 2023-06-06 09:12:30 -07:00
parent b94b29d79c
commit 61b9677c05
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
11 changed files with 107 additions and 134 deletions

View file

@ -38,11 +38,11 @@
signed char g_magikarp[8]; signed char g_magikarp[8];
const signed char kMagikarp[8][8] = { const signed char kMagikarp[8][8] = {
{-1, -3, 3, 17, 17, 3, -3, -1}, /* 1331+161 derived w/ one off cas */ {-1, -1, 3, 15, 15, 3, -1, -1}, // magic kernel sharp
{-1, -3, 6, 28, 6, -3, -1, 0}, /* no due to the convolution theorem? */ {-1, -3, 6, 28, 6, -3, -1, 0}, //
{0, 0, -11, 53, -11, 0, 0, 0}, /* no plus, some random experimenting */ {0, 0, -11, 53, -11, 0, 0, 0}, //
{-2, -6, 2, 22, 22, 2, -6, -2}, /* one a line please clang-format? */ {-2, -6, 2, 22, 22, 2, -6, -2}, //
{-3, -9, 1, 27, 27, 1, -9, -3}, {-3, -9, 1, 27, 27, 1, -9, -3}, //
}; };
signed char g_magkern[8]; signed char g_magkern[8];

View file

@ -99,7 +99,7 @@ int openpty(int *mfd, int *sfd, char *name, //
return efault(); return efault();
} }
BLOCK_CANCELLATIONS; BLOCK_CANCELLATIONS;
rc = openpty(mfd, sfd, name, tio, wsz); rc = openpty_impl(mfd, sfd, name, tio, wsz);
ALLOW_CANCELLATIONS; ALLOW_CANCELLATIONS;
return rc; return rc;
} }

View file

@ -35,8 +35,8 @@
*/ */
int mprotect(void *addr, size_t size, int prot) { int mprotect(void *addr, size_t size, int prot) {
int64_t rc; int64_t rc;
if (SupportsWindows() && (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | if (prot &
PROT_GROWSDOWN | PROT_GROWSUP))) { ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_GROWSDOWN | PROT_GROWSUP)) {
errno = EINVAL; // unix checks prot before checking size errno = EINVAL; // unix checks prot before checking size
rc = -1; rc = -1;
} else if (!size) { } else if (!size) {

View file

@ -70,7 +70,7 @@ int __cxa_atexit(void *, void *, void *) libcesque;
int atfork(void *, void *) libcesque; int atfork(void *, void *) libcesque;
int atexit(void (*)(void)) libcesque; int atexit(void (*)(void)) libcesque;
char *getenv(const char *) nosideeffect libcesque; char *getenv(const char *) nosideeffect libcesque;
int putenv(char *) paramsnonnull(); int putenv(char *);
int setenv(const char *, const char *, int); int setenv(const char *, const char *, int);
int unsetenv(const char *); int unsetenv(const char *);
int clearenv(void); int clearenv(void);

View file

@ -32,7 +32,7 @@ struct lconv {
int wcwidth(wchar_t) pureconst; int wcwidth(wchar_t) pureconst;
int wcswidth(const wchar_t *, size_t) strlenesque; int wcswidth(const wchar_t *, size_t) strlenesque;
int wcsnwidth(const wchar_t *, size_t, int) strlenesque; int wcsnwidth(const wchar_t *, size_t, size_t) strlenesque;
struct lconv *localeconv(void); struct lconv *localeconv(void);
COSMOPOLITAN_C_END_ COSMOPOLITAN_C_END_

View file

@ -21,7 +21,7 @@
/** /**
* Returns monospace display width of wide character string. * Returns monospace display width of wide character string.
*/ */
int wcsnwidth(const wchar_t *pwcs, size_t n, int o) { int wcsnwidth(const wchar_t *pwcs, size_t n, size_t o) {
int w, width = 0; int w, width = 0;
for (; *pwcs && n-- > 0; pwcs++) { for (; *pwcs && n-- > 0; pwcs++) {
if ((w = wcwidth(*pwcs)) < 0) { if ((w = wcwidth(*pwcs)) < 0) {

View file

@ -23,9 +23,9 @@
#include "libc/fmt/bing.internal.h" #include "libc/fmt/bing.internal.h"
#include "libc/log/check.h" #include "libc/log/check.h"
#include "libc/math.h" #include "libc/math.h"
#include "libc/mem/gc.internal.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nexgen32e/x86feature.h" #include "libc/nexgen32e/x86feature.h"
#include "libc/mem/gc.internal.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "libc/testlib/ezbench.h" #include "libc/testlib/ezbench.h"
#include "libc/testlib/testlib.h" #include "libc/testlib/testlib.h"
@ -124,21 +124,21 @@ TEST(magikarp, testHalfYX) {
Magikarp2xX(32, 61, M, 16, 61); Magikarp2xX(32, 61, M, 16, 61);
EXPECT_STREQ(u"\n\ EXPECT_STREQ(u"\n\
nooppppqqqqqqqqqqqqqqqqqpppooon\n\ nooppppqqqqqqqqqqqqqqqqqpppooon\n\
opppqqqqqppppoppoppppqqqqqppppo\n\ opppqqqqqpppppoooppppqqqqqppppo\n\
ppqqqqpppooooommmoooopppqqqqppp\n\ ppqqqqpppoooonnnnnooopppqqqqppp\n\
pqqqppponmmllllllllmmmnpppqqqqp\n\ pqqqppponnmllllllllmnnnoppqqqqp\n\
qqqppoomllllllllllllllmnoppqqqq\n\ qqqppoommlllllllllllllmnoppqqqq\n\
qqppoomlllllllmmmllllllmnoppqqq\n\ qqpponmllllllmmmmllllllmnoppqqq\n\
qppponlllllmoqttspnlllllmnoppqq\n\ qppponlllllmoqttspolllllmnoppqq\n\
qpponmllllmosyzz{vqnllllmmoppqq\n\ qpponmllllmosxzzyvqnllllmmoppqq\n\
qpponmllllmorwzzyupnllllmmoppqq\n\ qpponmllllmorwyyyupnllllmmoppqq\n\
qqpponlllllloprrqomlllllmnoppqq\n\ qqpponllllllnprrqomlllllmnoppqq\n\
qqpponnmlllllllllllllllmnnppqqq\n\ qqpponnmlllllllllllllllmnnppqqq\n\
qqqppponmlllllllllllllnooppqqqp\n\ qqqppponmllllllllllllmmooppqqqp\n\
pqqqqpppoommmlllllmmmoopppqqqpp\n\ pqqqqppoonmmmlllllmmnoopppqqqpp\n\
pppqqqqpppooooooooooppppqqqqppp\n\ pppqqqqpppooooooooooopppqqqqppp\n\
oopppqqqqqqpppppppppqqqqqqpppoo\n\ oopppqqqqqqpppppppppqqqqqqpppoo\n\
noopopppqqqqqqqqqqqqqqqppoooonn", noooopppqqqqqqqqqqqqqqqppoooonn",
gc(bingblit(32, 61, M, 16, 31))); gc(bingblit(32, 61, M, 16, 31)));
} }

View file

@ -16,15 +16,15 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "dsp/scale/scale.h"
#include "dsp/core/c1331.h" #include "dsp/core/c1331.h"
#include "dsp/core/c161.h" #include "dsp/core/c161.h"
#include "dsp/core/core.h" #include "dsp/core/core.h"
#include "dsp/core/half.h" #include "dsp/core/half.h"
#include "dsp/scale/scale.h"
#include "libc/fmt/bing.internal.h" #include "libc/fmt/bing.internal.h"
#include "libc/macros.internal.h" #include "libc/macros.internal.h"
#include "libc/mem/mem.h"
#include "libc/mem/gc.internal.h" #include "libc/mem/gc.internal.h"
#include "libc/mem/mem.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#include "libc/testlib/ezbench.h" #include "libc/testlib/ezbench.h"
@ -196,41 +196,23 @@ pqpppppppppppppppppoooooooooooooooooooooooppppppppppppppppprp",
Magikarp2xY(32, 61, M[0], 32, 61); Magikarp2xY(32, 61, M[0], 32, 61);
AbsoluteDifference(16, 61, D[0], 16, 61, G[0], 16, 61, M[0]); AbsoluteDifference(16, 61, D[0], 16, 61, G[0], 16, 61, M[0]);
EXPECT_STREQ(u"\n\ EXPECT_STREQ(u"\n\
pnpppppppppppppppoooooooooooooooooooooooooooppppppppppppppprp\n\ popppppppppppppppooooooonnnnnnnnnnnnnooooooopppppppppppppppqp\n\
ppppppppppooooonnnnmmmmmmmmmmmmmmmmmmmmmmmnnnnooooopppppppppp\n\ ppppppppppooooonnnnnmmmmmmmmmmmmmmmmmmmmmnnnnnooooopppppppppp\n\
ppppppoononnnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnonoopppppp\n\ ppppppoononnnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnonoopppppp\n\
pppoononnmmmmmmmmmmmmmmmmmnnnnnnnnnmmmmmmmmmmmmmmmmmnnonooppp\n\ pppoononnmmmmmmmmmmmmmmmmmnnnnnnnnnmmmmmmmmmmmmmmmmmnnonooppp\n\
poonnnnmmmmmmmmmmmnnnnoooppppqqqppppooonnnnmmmmmmmmmmmnnnnoop\n\ poonnnnmmmmmmmmmmmnnnnoooppppqqqppppooonnnnmmmmmmmmmmmnnnnoop\n\
oonnnnmmmmmmmmmnooppqqrrsstttttttttssrrqqppoonmmmmmmmmmnnnnoo\n\ oonnnnmmmmmmmmmnooppqqrrsstttttttttssrrqqppoonmmmmmmmmmnnnnoo\n\
onnnnmmmmmmmnnnoppqrsttuvvwwwwwwwwwvvuttsrqpponnnmmmmmmmnnnno\n\ onnnnmmmmmmmnnnoppqqsttuvvwwwwwwwwwvvuttsqqpponnnmmmmmmmnnnno\n\
onnnmmmmmmmmnnoopqrsttuvwwxxyyyyyxxwwvuttsrqpoonnmmmmmmmmnnno\n\ onnnmmmmmmmmnnoopqrsttuvwwxxyyyyyxxwwvuttsrqpoonnmmmmmmmmnnno\n\
onnnmmmmmmmmnnoopqrsstuvwwxxyyyyyxxwwvutssrqpoonnmmmmmmmmnnno\n\ onnnmmmmmmmmnnoopqrsstuvwwxxyyyyyxxwwvutssrqpoonnmmmmmmmmnnno\n\
oonnnmmmmmmmmnnoopprrsttuuvvwwwwwvvuuttsrrppoonnmmmmmmmmnnnoo\n\ oonnnmmmmmmmmnnoopprrsttuuvvwwwwwvvuuttsrrppoonnmmmmmmmmnnnoo\n\
ooonnmmmmmmmmmmmnoopoqqqrrsssssssssrrqqqopoonmmmmmmmmmmmnnooo\n\ ooonnmmmmmmmmmmmnoopoqqqrrsssssssssrrqqqopoonmmmmmmmmmmmnnooo\n\
pooonnnmmmmmmmmmmmmmnnnnoooopppppoooonnnnmmmmmmmmmmmmmnnnooop\n\ pooonnnmmmmmmmmmmmnmnnnoopoopppppoopoonnnmnmmmmmmmmmmmnnnooop\n\
ppppoononnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnonoopppp\n\ ppppoononnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnonoopppp\n\
pppppppoonoonnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnoonooppppppp\n\ pppppppoonoonnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnoonooppppppp\n\
pppppppppppoooooonnnnmmmmmmmmmmmmmmmmmmmnnnnooooooppppppppppp\n\ pppppppppppoooooonnnnnnmmmmmmmmmmmmmmmnnnnnnooooooppppppppppp\n\
pqpppppppppppppppppoooooooooooooooooooooooppppppppppppppppprp", pqpppppppppppppppppoooooooooooooooooooooooppppppppppppppppprp",
gc(bingblit(16, 61, M[0], 16, 61))); gc(bingblit(16, 61, M[0], 16, 61)));
EXPECT_STREQ(u"\n\
                                                           \n\
                                                         \n\
                                                             \n\
                                                             \n\
                                                             \n\
                                                             \n\
                                                           \n\
                                                             \n\
                                                             \n\
                                                             \n\
                                                         \n\
                                                           \n\
                                                             \n\
                                                             \n\
                                                        \n\
                                                             ",
gc(bingblit(16, 61, D[0], 16, 61)));
} }
TEST(Magikarp2xX, testDecimateX) { TEST(Magikarp2xX, testDecimateX) {
@ -274,7 +256,7 @@ ppppppppppooooooooooopppppppppp",
Magikarp2xX(32, 61, M[0], 32, 61); Magikarp2xX(32, 61, M[0], 32, 61);
EXPECT_STREQ(u"\n\ EXPECT_STREQ(u"\n\
pppppppppoooooooooooooppppppppp\n\ pppppppppoooooooooooooppppppppp\n\
nppppppooonnnnnnnnnnooooppppprp\n\ oppppppooonnnnnnnnnnoooopppppqp\n\
pppppooonnnnmmmmmmnnnnooopppppp\n\ pppppooonnnnmmmmmmnnnnooopppppp\n\
ppppooonnnmmmmmmmmmmmnnnooppppp\n\ ppppooonnnmmmmmmmmmmmnnnooppppp\n\
pppoonnnmmmmmmmmmmmmmmmnnoopppp\n\ pppoonnnmmmmmmmmmmmmmmmnnoopppp\n\
@ -286,13 +268,13 @@ oonnmmmmnoopqqrrqqpponmmmmmnnoo\n\
onnmmmmmnopqrsssssrqpnnmmmmnnoo\n\ onnmmmmmnopqrsssssrqpnnmmmmnnoo\n\
onmmmmmnopqstuuuutsrqoommmmmnoo\n\ onmmmmmnopqstuuuutsrqoommmmmnoo\n\
onnmmmmnpqrtuvvvvvtsrponmmmmnno\n\ onnmmmmnpqrtuvvvvvtsrponmmmmnno\n\
onmmmmnnpqtuvwxxwwutsponmmmmmno\n\ onmmmmnopqsuvwxxwwutsqonmmmmmno\n\
onmmmmnoqrsvwxyyxxvurronmmmmmno\n\ onmmmmnoqrsuwxyyxwvusqpnmmmmmno\n\
onmmmmnopstvwxyyyxwutronmmmmmno\n\ onmmmmnopstvwxyyyxvusrpnmmmmmno\n\
onmmmmnopssvwxyyyxwtsronmmmmmno\n\ onmmmmnoprtvwxyyyxwtsrpnmmmmmno\n\
onmmmmnopqtuvxxxxwvurqpnmmmmmno\n\ onmmmmnoprtuvxxxxwvtrqpnmmmmmno\n\
onmmmmmnorsuvwwwwvutrqonmmmmmno\n\ onmmmmmnpqstvwwwwvutrqonmmmmmno\n\
onmmmmmnoqrstuvvvutrqpnnmmmmnoo\n\ onmmmmmnoqrstuvvvutrqponmmmmnoo\n\
onmmmmmnnoqrsttttssqponmmmmmnoo\n\ onmmmmmnnoqrsttttssqponmmmmmnoo\n\
oonmmmmmnooqrrrrrrqpoommmmmmnoo\n\ oonmmmmmnooqrrrrrrqpoommmmmmnoo\n\
oonmmmmmnnnoppqqqpponnmmmmmnooo\n\ oonmmmmmnnnoppqqqpponnmmmmmnooo\n\
@ -307,40 +289,6 @@ qpppppppoooonnnnnnnoooopppppprp\n\
ppppppppppooooooooooopppppppppp", ppppppppppooooooooooopppppppppp",
gc(bingblit(32, 61, M[0], 32, 31))); gc(bingblit(32, 61, M[0], 32, 31)));
AbsoluteDifference(32, 31, D, 32, 31, G[0], 32, 61, M[0]); AbsoluteDifference(32, 31, D, 32, 31, G[0], 32, 61, M[0]);
EXPECT_STREQ(u"\n\
                               \n\
                              \n\
                              \n\
                              \n\
                             \n\
                              \n\
                              \n\
                             \n\
                            \n\
                              \n\
                            \n\
                               \n\
                               \n\
                             \n\
                            \n\
                               \n\
                             \n\
                              \n\
                             \n\
                              \n\
                               \n\
                               \n\
                            \n\
                             \n\
                              \n\
                              \n\
                              \n\
                              \n\
                              \n\
                               \n\
                               \n\
                               ",
gc(bingblit(32, 31, D, 32, 31)));
} }
TEST(magikarp_vs_gyarados, testHalf) { TEST(magikarp_vs_gyarados, testHalf) {
@ -352,22 +300,22 @@ TEST(magikarp_vs_gyarados, testHalf) {
Magikarp2xX(32, 61, M[0], 16, 61); Magikarp2xX(32, 61, M[0], 16, 61);
AbsoluteDifference(16, 31, D, 16, 31, G[0], 32, 61, M[0]); AbsoluteDifference(16, 31, D, 16, 31, G[0], 32, 61, M[0]);
EXPECT_STREQ(u"\n\ EXPECT_STREQ(u"\n\
oppppppppooooooooooooopppppppqp\n\ pppppppppooonnnnnnooooppppppppp\n\
pppppooonnmmmmmmmmmmmnnoopppppp\n\ pppppooonnmmmmmmmmmmnnnoopppppp\n\
ppponnmmmmmmmmmmmmmmmmmmnnnpppp\n\ ppponnmmmmmmmmmmmmmmmmmmnnopppp\n\
ppnommmmmmmmmnnnnnmmmmmmmmnoopp\n\ pponmmmmmmmmmnnnnnmmmmmmmmnoopp\n\
pnnnmmmmmnnoppqqpponnnmmmmmnnop\n\ pnnnmmmmmnnoppqqpponnnmmmmmnnop\n\
onnmmmmmopqrstttttsrqpnmmmmnnoo\n\ onnmmmmnopqrstttttsrqpnmmmmnnoo\n\
onnmmmnnpqtuvwwwwwutsponmmmmnno\n\ onnmmmnopqsuvwwwwwutrponmmmmnno\n\
onmmmmnopstvwxyyyxwutronmmmmmno\n\ onmmmmnopstvwxyyyxvusrpnmmmmmno\n\
onmmmmnopssvwxyyyxwtsronmmmmmno\n\ onmmmmnoprtvwxyyyxwtsrpnmmmmmno\n\
onmmmmmooqstuvwwwvusrponmmmmnoo\n\ onmmmmmooqstuvwwwvusrponmmmmnoo\n\
oommmmmmnopqrsssssqqpommmmmmnoo\n\ oommmmmmnopqrsssssrqponmmmmmnoo\n\
ponmmmmmmmnnoopppoonnmmmmmmnoop\n\ ponmmmmmmnnopoppooonnmmmmmmnoop\n\
ppoonmmmmmmmmmmmmmmmmmmmmmonppp\n\ ppoonmmmmmmmmmmmmmmmmmmmmmnoppp\n\
ppppnonmmmmmmmmmmmmmmmmmooopppp\n\ ppppoonmmmmmmmmmmmmmmmmmooopppp\n\
ppppppooonnmmmmmmmmmnnooopppppp\n\ ppppppooonnnmmmmmmmnnnooopppppp\n\
qpppppppppoooooooooooppppppppqp", ppppppppppoooooooooooppppppppqp",
gc(bingblit(32, 61, M[0], 16, 31))); gc(bingblit(32, 61, M[0], 16, 31)));
EXPECT_STREQ(u"\n\ EXPECT_STREQ(u"\n\
ppppppppooooooooooooooopppppppp\n\ ppppppppooooooooooooooopppppppp\n\
@ -388,22 +336,22 @@ pppppooonnnmmmmmmmmmnnnoooppppp\n\
pppppppppoooooooooooooppppppppq", pppppppppoooooooooooooppppppppq",
gc(bingblit(16, 31, G[0], 16, 31))); gc(bingblit(16, 31, G[0], 16, 31)));
EXPECT_STREQ(u"\n\ EXPECT_STREQ(u"\n\
                           \n\                        \n\
                            \n\                            \n\
                           \n\                             \n\
                         \n\                            \n\
                         \n\                          \n\
                        \n\                          \n\
                       \n\                       \n\
                         \n\                         \n\
                         \n\                           \n\
                         \n\                          \n\
                          \n\                             \n\
                           \n\                        \n\
                            \n\                               \n\
                         \n\                           \n\
                           \n\                          \n\
                          ",                            ",
gc(bingblit(16, 31, D, 16, 31))); gc(bingblit(16, 31, D, 16, 31)));
} }

View file

@ -35,18 +35,36 @@
#include "libc/x/x.h" #include "libc/x/x.h"
#include "third_party/xed/x86.h" #include "third_party/xed/x86.h"
#ifdef __x86_64__
volatile bool gotsegv; volatile bool gotsegv;
volatile bool gotbusted; volatile bool gotbusted;
struct sigaction old[2]; struct sigaction old[2];
char testlib_enable_tmp_setup_teardown; char testlib_enable_tmp_setup_teardown;
#ifdef __x86_64__
static const char kRet31337[] = {
0xb8, 0x69, 0x7a, 0x00, 0x00, // mov $31337,%eax
0xc3, // ret
};
#elif defined(__aarch64__)
static const uint32_t kRet31337[] = {
0x528f4d20, // mov w0,#31337
0xd65f03c0, // ret
};
#else
#error "unsupported architecture"
#endif
void SkipOverFaultingInstruction(struct ucontext *ctx) { void SkipOverFaultingInstruction(struct ucontext *ctx) {
#ifdef __x86_64__
struct XedDecodedInst xedd; struct XedDecodedInst xedd;
xed_decoded_inst_zero_set_mode(&xedd, XED_MACHINE_MODE_LONG_64); xed_decoded_inst_zero_set_mode(&xedd, XED_MACHINE_MODE_LONG_64);
xed_instruction_length_decode(&xedd, (void *)ctx->uc_mcontext.rip, 15); xed_instruction_length_decode(&xedd, (void *)ctx->uc_mcontext.rip, 15);
ctx->uc_mcontext.rip += xedd.length; ctx->uc_mcontext.rip += xedd.length;
#elif defined(__aarch64__)
ctx->uc_mcontext.pc += 4;
#else
#error "unsupported architecture"
#endif
} }
void OnSigSegv(int sig, struct siginfo *si, void *vctx) { void OnSigSegv(int sig, struct siginfo *si, void *vctx) {
@ -125,7 +143,7 @@ TEST(mprotect, testSegfault_writeToReadOnlyAnonymous) {
TEST(mprotect, testExecOnly_canExecute) { TEST(mprotect, testExecOnly_canExecute) {
char *p = _mapanon(FRAMESIZE); char *p = _mapanon(FRAMESIZE);
void (*f)(void) = (void *)p; void (*f)(void) = (void *)p;
p[0] = 0xC3; // RET memcpy(p, kRet31337, sizeof(kRet31337));
ASSERT_SYS(0, 0, mprotect(p, FRAMESIZE, PROT_EXEC | PROT_READ)); ASSERT_SYS(0, 0, mprotect(p, FRAMESIZE, PROT_EXEC | PROT_READ));
f(); f();
// On all supported platforms, PROT_EXEC implies PROT_READ. There is // On all supported platforms, PROT_EXEC implies PROT_READ. There is
@ -146,11 +164,6 @@ TEST(mprotect, testProtNone_cantEvenRead) {
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE)); EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
} }
static const char kRet31337[] = {
0xb8, 0x69, 0x7a, 0x00, 0x00, // mov $31337,%eax
0xc3, // ret
};
TEST(mprotect, testExecJit_actuallyWorks) { TEST(mprotect, testExecJit_actuallyWorks) {
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE)); int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
memcpy(p, kRet31337, sizeof(kRet31337)); memcpy(p, kRet31337, sizeof(kRet31337));
@ -163,6 +176,7 @@ TEST(mprotect, testExecJit_actuallyWorks) {
TEST(mprotect, testRwxMap_vonNeumannRules) { TEST(mprotect, testRwxMap_vonNeumannRules) {
if (IsOpenbsd()) return; // boo if (IsOpenbsd()) return; // boo
if (IsXnuSilicon()) return; // boo
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE)); int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
memcpy(p, kRet31337, sizeof(kRet31337)); memcpy(p, kRet31337, sizeof(kRet31337));
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE | PROT_EXEC)); EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE | PROT_EXEC));
@ -216,5 +230,3 @@ TEST(mprotect, testZeroSize_doesNothing) {
EXPECT_FALSE(gotsegv); EXPECT_FALSE(gotsegv);
EXPECT_FALSE(gotbusted); EXPECT_FALSE(gotbusted);
} }
#endif /* __x86_64__ */

View file

@ -215,7 +215,10 @@ Complete(const char *p, linenoiseCompletions *c)
static void static void
TerminalCompletion(const char *p, linenoiseCompletions *c) TerminalCompletion(const char *p, linenoiseCompletions *c)
{ {
// Complete(p, c); PyGILState_STATE gilstate;
gilstate = PyGILState_Ensure();
Complete(p, c);
PyGILState_Release(gilstate);
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
PyErr_Clear(); PyErr_Clear();
} }

View file

@ -1533,6 +1533,7 @@ static void TryToOpenFrameBuffer(void) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
sigset_t wut; sigset_t wut;
const char *s;
gamma_ = 2.4; gamma_ = 2.4;
volscale_ -= 2; volscale_ -= 2;
dither_ = true; dither_ = true;
@ -1546,8 +1547,17 @@ int main(int argc, char *argv[]) {
if (!tuned_) PickDefaults(); if (!tuned_) PickDefaults();
if (optind == argc) PrintUsage(EX_USAGE, stderr); if (optind == argc) PrintUsage(EX_USAGE, stderr);
patharg_ = argv[optind]; patharg_ = argv[optind];
sox_ = strdup(commandvenv("SOX", "sox")); s = commandvenv("SOX", "sox");
ffplay_ = strdup(commandvenv("FFPLAY", "ffplay")); sox_ = s ? strdup(s) : 0;
s = commandvenv("FFPLAY", "ffplay");
ffplay_ = s ? strdup(s) : 0;
if (!sox_ && !ffplay_) {
fprintf(stderr, "please install either the "
"`play` (sox) or "
"`ffplay` (ffmpeg) "
"commands, so printvideo.com can play audio\n");
usleep(10000);
}
infd_ = STDIN_FILENO; infd_ = STDIN_FILENO;
outfd_ = STDOUT_FILENO; outfd_ = STDOUT_FILENO;
if (!setjmp(jb_)) { if (!setjmp(jb_)) {