mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-15 04:50:40 +08:00
* feat: ship the self-hosted native scriptc CLI - Run the shared compiler and CLI natively, including library builds and compile-time evaluation. - Install native platform packages and ship relocatable standalone distributions. - Preserve program semantics and reuse validated build artifacts for fast rebuilds. * fix: complete native CLI integration and validation - Preserve library diagnostics and run recursive compiler work on the main stack. - Restore packaged helper permissions and exercise native npm and Wasm library builds. - Recover interrupted Sandbox status probes within the original command deadline.
47 lines
1.7 KiB
C
47 lines
1.7 KiB
C
#ifndef _WIN32
|
|
#define _POSIX_C_SOURCE 200809L
|
|
#endif
|
|
#include <stdint.h>
|
|
#include <limits.h>
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#ifdef _WIN32
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#else
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
/* Accept only directories owned by this user with private POSIX access.
|
|
* Windows inherits the user's cache ACL; reject reparse points so an
|
|
* installed cache directory cannot redirect compiler payloads elsewhere. */
|
|
uint8_t scriptc_native_private_directory(const uint8_t *bytes, size_t size, uint8_t harden) {
|
|
if (size == 0 || memchr(bytes, 0, size) != NULL) return 0;
|
|
#ifdef _WIN32
|
|
(void)harden;
|
|
if (size > INT_MAX) return 0;
|
|
int length = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (const char *)bytes, (int)size, NULL, 0);
|
|
if (length <= 0) return 0;
|
|
wchar_t *path = malloc(((size_t)length + 1) * sizeof(wchar_t));
|
|
if (!path) return 0;
|
|
if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (const char *)bytes, (int)size, path, length) != length) { free(path); return 0; }
|
|
path[length] = 0;
|
|
DWORD attrs = GetFileAttributesW(path);
|
|
free(path);
|
|
return attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY) != 0 && (attrs & FILE_ATTRIBUTE_REPARSE_POINT) == 0;
|
|
#else
|
|
char *path = malloc(size + 1);
|
|
if (!path) return 0;
|
|
memcpy(path, bytes, size);
|
|
path[size] = 0;
|
|
struct stat info;
|
|
int ok = lstat(path, &info) == 0 && S_ISDIR(info.st_mode) && info.st_uid == getuid();
|
|
if (ok && harden && (info.st_mode & 077) != 0) ok = chmod(path, 0700) == 0;
|
|
if (ok) ok = lstat(path, &info) == 0 && S_ISDIR(info.st_mode) && info.st_uid == getuid() && (info.st_mode & 077) == 0;
|
|
free(path);
|
|
return ok;
|
|
#endif
|
|
}
|