mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 14:02:52 +02:00
7b5349e85d
i should probably test musl as well, on linux libreboot-utils is stable on the glibc systems i tested with linux. it is quite buggy on bsd systems. it's irresponsible to let users compile this until i've properly tested the code. putting this error in for now. i made lbmk use the old nvmutil version for now, and retro fitted several improvements to i/o there from lbutils, changes that i know are stable on bsd. Signed-off-by: Leah Rowe <leah@libreboot.org>
153 lines
3.1 KiB
C
153 lines
3.1 KiB
C
/* SPDX-License-Identifier: MIT ( >:3 )
|
|
* Copyright (c) 2026 Leah Rowe <leah@libreboot.org> /| |\
|
|
* / \
|
|
* Hardened mktemp (mkhtemp!)
|
|
*
|
|
* WORK IN PROGRESS (proof of concept), or, v0.0000001
|
|
* DO NOT PUT THIS IN YOUR LINUX DISTRO YET.
|
|
*
|
|
* In other words: for reference only -- PATCHES WELCOME!
|
|
*
|
|
* I will remove this notice when the code is mature, and
|
|
* probably contact several of your projects myself.
|
|
*
|
|
* See README. This is an ongoing project; no proper docs
|
|
* yet, and no manpage (yet!) - the code is documentation,
|
|
* while the specification that it implements evolves.
|
|
*/
|
|
|
|
#ifndef _XOPEN_SOURCE
|
|
#define _XOPEN_SOURCE 700
|
|
#endif
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <limits.h>
|
|
#include <stdarg.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include "include/common.h"
|
|
|
|
static void
|
|
exit_cleanup(void);
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
#ifndef __linux__
|
|
#error This code is currently buggy on BSD systems. Only use on Linux.
|
|
#endif
|
|
size_t len;
|
|
size_t tlen;
|
|
size_t xc = 0;
|
|
|
|
char *tmpdir = NULL;
|
|
char *template = NULL;
|
|
char *p;
|
|
char *s = NULL;
|
|
char *rp;
|
|
char resolved[PATH_MAX];
|
|
char c;
|
|
|
|
int fd = -1;
|
|
int type = MKHTEMP_FILE;
|
|
|
|
(void) errhook(exit_cleanup);
|
|
(void) lbsetprogname(argv[0]);
|
|
|
|
#ifdef __OpenBSD__
|
|
/* https://man.openbsd.org/pledge.2 */
|
|
if (pledge("stdio flock rpath wpath cpath fattr", NULL) == -1)
|
|
exitf("pledge");
|
|
#endif
|
|
|
|
while ((c =
|
|
getopt(argc, argv, "qdp:")) != -1) {
|
|
|
|
switch (c) {
|
|
case 'd':
|
|
type = MKHTEMP_DIR;
|
|
break;
|
|
|
|
case 'p':
|
|
tmpdir = optarg;
|
|
break;
|
|
|
|
case 'q': /* don't print errors */
|
|
/* (exit status unchanged) */
|
|
break;
|
|
|
|
default:
|
|
goto err_usage;
|
|
}
|
|
}
|
|
|
|
if (optind < argc)
|
|
template = argv[optind];
|
|
if (optind + 1 < argc)
|
|
goto err_usage;
|
|
|
|
/* custom template e.g. foo.XXXXXXXXXXXXXXXXXXXXX */
|
|
if (template != NULL) {
|
|
for (p = template + slen(template, PATH_MAX, &tlen);
|
|
p > template && *--p == 'X'; xc++);
|
|
|
|
if (xc < 3) /* the gnu mktemp errs on less than 3 */
|
|
exitf(
|
|
"template must have 3 X or more on end (12+ advised");
|
|
}
|
|
|
|
/* user supplied -p PATH - WARNING:
|
|
* this permits symlinks, but only here,
|
|
* not in the library, so they are resolved
|
|
* here first, and *only here*. the mkhtemp
|
|
* library blocks them. be careful
|
|
* when using -p
|
|
*/
|
|
if (tmpdir != NULL) {
|
|
rp = realpath(tmpdir, resolved);
|
|
if (rp == NULL)
|
|
exitf("%s", tmpdir);
|
|
|
|
tmpdir = resolved;
|
|
}
|
|
|
|
if (new_tmp_common(&fd, &s, type,
|
|
tmpdir, template) < 0)
|
|
exitf("%s", s);
|
|
|
|
#ifdef __OpenBSD__
|
|
if (pledge("stdio", NULL) == -1)
|
|
exitf("pledge");
|
|
#endif
|
|
|
|
if (s == NULL)
|
|
exitf("bad string initialisation");
|
|
if (*s == '\0')
|
|
exitf("empty string initialisation");
|
|
|
|
slen(s, PATH_MAX, &len); /* Nullterminierung prüfen */
|
|
/* for good measure. (bonus: also re-checks length overflow) */
|
|
|
|
printf("%s\n", s);
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
err_usage:
|
|
exitf(
|
|
"usage: %s [-d] [-p dir] [template]\n", lbgetprogname());
|
|
}
|
|
|
|
static void
|
|
exit_cleanup(void)
|
|
{
|
|
return;
|
|
}
|