mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-19 00:03:45 +02:00
@@ -391,8 +391,7 @@ void *rmalloc(size_t *size); /* don't ever use this */
|
|||||||
void rset(void *buf, size_t n);
|
void rset(void *buf, size_t n);
|
||||||
void *mkrbuf(size_t n);
|
void *mkrbuf(size_t n);
|
||||||
char *mkrstr(size_t n);
|
char *mkrstr(size_t n);
|
||||||
int win_lottery(void);
|
size_t rsize(size_t n);
|
||||||
size_t rsize(void);
|
|
||||||
|
|
||||||
/* Helper functions for command: dump
|
/* Helper functions for command: dump
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -72,62 +72,20 @@
|
|||||||
* or your program dies.
|
* or your program dies.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MAX_ALLOC (2 << 16)
|
|
||||||
|
|
||||||
int
|
|
||||||
win_lottery(void) /* are u lucky? */
|
|
||||||
{
|
|
||||||
size_t size = rsize();
|
|
||||||
size_t size2 = rsize();
|
|
||||||
char *s = NULL;
|
|
||||||
|
|
||||||
if (size &&
|
|
||||||
size == size2 &&
|
|
||||||
size <= MAX_ALLOC << 1) {
|
|
||||||
|
|
||||||
if (!memcmp(s = mkrbuf(size << 1),
|
|
||||||
s + size, size))
|
|
||||||
size2 = 1; /* winner! */
|
|
||||||
else
|
|
||||||
size2 = 0;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
free_if_null(&s);
|
|
||||||
return (int)size2;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
rsize(void)
|
|
||||||
{
|
|
||||||
size_t rval = 0;
|
|
||||||
|
|
||||||
/* clamp rand to prevent modulo bias */
|
|
||||||
size_t limit = SIZE_MAX - (SIZE_MAX % MAX_ALLOC);
|
|
||||||
|
|
||||||
do {
|
|
||||||
rset(&rval, sizeof(rval));
|
|
||||||
} while (rval >= limit);
|
|
||||||
|
|
||||||
return rval % MAX_ALLOC;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
rmalloc(size_t *rval)
|
rmalloc(size_t *rval)
|
||||||
{
|
{
|
||||||
/* clamp rand to prevent modulo bias */
|
return if_err(rval == NULL, EFAULT) ?
|
||||||
size_t limit = SIZE_MAX - (SIZE_MAX % MAX_ALLOC);
|
NULL : mkrstr(*rval = rsize(BUFSIZ));
|
||||||
|
}
|
||||||
|
|
||||||
if (if_err(rval == NULL, EFAULT))
|
size_t
|
||||||
return NULL;
|
rsize(size_t n)
|
||||||
|
{
|
||||||
|
size_t rval = SIZE_MAX;
|
||||||
|
for (; rval >= SIZE_MAX - (SIZE_MAX % n); rset(&rval, sizeof(rval)));
|
||||||
|
|
||||||
do {
|
return rval % n;
|
||||||
rset(rval, sizeof(*rval));
|
|
||||||
} while (*rval >= limit || *rval == 0);
|
|
||||||
|
|
||||||
return mkrstr(*rval %= MAX_ALLOC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
@@ -157,7 +115,7 @@ mkrstr(size_t n) /* emulates spkmodem-decode */
|
|||||||
void *
|
void *
|
||||||
mkrbuf(size_t n)
|
mkrbuf(size_t n)
|
||||||
{
|
{
|
||||||
void *buf;
|
void *buf = "";
|
||||||
|
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
err_no_cleanup(0, EPERM, "mkrbuf: zero-byte request");
|
err_no_cleanup(0, EPERM, "mkrbuf: zero-byte request");
|
||||||
|
|||||||
@@ -2,31 +2,38 @@
|
|||||||
* Copyright (c) 2026 Leah Rowe <leah@libreboot.org>
|
* Copyright (c) 2026 Leah Rowe <leah@libreboot.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __OpenBSD__
|
|
||||||
#include <sys/param.h> /* pledge(2) */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "include/common.h"
|
#include "include/common.h"
|
||||||
|
#define MAX_ALLOC (1 << 17)
|
||||||
|
|
||||||
|
static int rigged(char **s);
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int lucky;
|
char *s = "You lose!";
|
||||||
#if defined(__OpenBSD__) && defined(OpenBSD)
|
int lucky = rigged(&s);
|
||||||
#if (OpenBSD) >= 509
|
|
||||||
|
#ifdef __OpenBSD__
|
||||||
if (pledge("stdio", NULL) == -1)
|
if (pledge("stdio", NULL) == -1)
|
||||||
err_no_cleanup(0, errno, "openbsd won it");
|
err_no_cleanup(0, errno, "openbsd wins");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
printf("%s\n", s);
|
||||||
setvbuf(stdout, NULL, _IONBF, 0);
|
return lucky;
|
||||||
|
}
|
||||||
|
|
||||||
lucky = win_lottery();
|
static int
|
||||||
|
rigged(char **s) /* are u lucky? */
|
||||||
|
{
|
||||||
|
size_t size[2] = { rsize(MAX_ALLOC), rsize(MAX_ALLOC) };
|
||||||
|
|
||||||
printf("%s\n", lucky ? "You won!" : "You lose! Sorry!");
|
return !(size[0] && size[0] == size[1] && size[0] <= MAX_ALLOC << 1 &&
|
||||||
return lucky ? EXIT_SUCCESS : EXIT_FAILURE;
|
s != NULL) || memcmp(*s = mkrbuf(size[0] << 1), *s + size[0],
|
||||||
|
size[0]);
|
||||||
}/*
|
}/*
|
||||||
|
|
||||||
( >:3 )
|
( >:3 )
|
||||||
/| |\
|
/| |\ it could be you!
|
||||||
/ \ */
|
/ \ */
|
||||||
|
|||||||
Reference in New Issue
Block a user