mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 14:58:30 +00:00
Make improvements to redbean (#373)
* Allow ProgramUniprocess to be set on Windows * Add closing p tag to Maxmind example * Enable using symlinked directories with redbean -A flag * Rename gc in redbean for consistency * Improve StoreFile by adding checks and skipping ./ in stored path * Add freeing memory in redbean LuaEncodeUrl Ref #366
This commit is contained in:
parent
0cb6b6ff4b
commit
d5ff2c3fb9
2 changed files with 18 additions and 12 deletions
|
@ -297,14 +297,14 @@ local function main()
|
||||||
if geo then
|
if geo then
|
||||||
Dump(geo)
|
Dump(geo)
|
||||||
else
|
else
|
||||||
Write('<p>Not found\n')
|
Write('<p>Not found</p>\n')
|
||||||
end
|
end
|
||||||
|
|
||||||
Write('<h3>Maxmind ASN DB</h3>')
|
Write('<h3>Maxmind ASN DB</h3>')
|
||||||
if asn then
|
if asn then
|
||||||
Dump(asn)
|
Dump(asn)
|
||||||
else
|
else
|
||||||
Write('<p>Not found\n')
|
Write('<p>Not found</p>\n')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -3515,23 +3515,30 @@ static void StoreAsset(char *path, size_t pathlen, char *data, size_t datalen,
|
||||||
|
|
||||||
static void StoreFile(char *path) {
|
static void StoreFile(char *path) {
|
||||||
char *p;
|
char *p;
|
||||||
size_t n;
|
size_t plen, tlen;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (lstat(path, &st) == -1) DIEF("Can't stat %`'s: %m", path);
|
char *target = path;
|
||||||
if (!(p = xslurp(path, &n))) DIEF("Can't read %`'s: %m", path);
|
if (startswith(target, "./")) target += 2;
|
||||||
StoreAsset(path, strlen(path), p, n, st.st_mode & 0777);
|
tlen = strlen(target);
|
||||||
|
if (!IsReasonablePath(target, tlen))
|
||||||
|
DIEF("(cfg) error: can't store %`'s: contains '.' or '..' segments", target);
|
||||||
|
if (lstat(path, &st) == -1) DIEF("(cfg) error: can't stat %`'s: %m", path);
|
||||||
|
if (!(p = xslurp(path, &plen))) DIEF("(cfg) error: can't read %`'s: %m", path);
|
||||||
|
StoreAsset(target, tlen, p, plen, st.st_mode & 0777);
|
||||||
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void StorePath(const char *dirpath) {
|
static void StorePath(const char *dirpath) {
|
||||||
DIR *d;
|
DIR *d;
|
||||||
char *path;
|
char *path;
|
||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
if (!isdirectory(dirpath)) return StoreFile(dirpath);
|
if (!isdirectory(dirpath) && !endswith(dirpath, "/"))
|
||||||
if (!(d = opendir(dirpath))) DIEF("Can't open %`'s", dirpath);
|
return StoreFile(dirpath);
|
||||||
|
if (!(d = opendir(dirpath))) DIEF("(cfg) error: can't open %`'s", dirpath);
|
||||||
while ((e = readdir(d))) {
|
while ((e = readdir(d))) {
|
||||||
if (strcmp(e->d_name, ".") == 0) continue;
|
if (strcmp(e->d_name, ".") == 0) continue;
|
||||||
if (strcmp(e->d_name, "..") == 0) continue;
|
if (strcmp(e->d_name, "..") == 0) continue;
|
||||||
path = _gc(xjoinpaths(dirpath, e->d_name));
|
path = gc(xjoinpaths(dirpath, e->d_name));
|
||||||
if (e->d_type == DT_DIR) {
|
if (e->d_type == DT_DIR) {
|
||||||
StorePath(path);
|
StorePath(path);
|
||||||
} else {
|
} else {
|
||||||
|
@ -4630,6 +4637,7 @@ static int LuaEncodeUrl(lua_State *L) {
|
||||||
}
|
}
|
||||||
data = EncodeUrl(&h, &size);
|
data = EncodeUrl(&h, &size);
|
||||||
lua_pushlstring(L, data, size);
|
lua_pushlstring(L, data, size);
|
||||||
|
free(h.params.p);
|
||||||
free(data);
|
free(data);
|
||||||
} else {
|
} else {
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
|
@ -5153,9 +5161,7 @@ static int LuaProgramUniprocess(lua_State *L) {
|
||||||
return luaL_argerror(L, 1, "invalid uniprocess mode; boolean expected");
|
return luaL_argerror(L, 1, "invalid uniprocess mode; boolean expected");
|
||||||
|
|
||||||
lua_pushboolean(L, uniprocess);
|
lua_pushboolean(L, uniprocess);
|
||||||
if (!IsWindows()) { // uniprocess can't be disabled on Windows yet
|
if (lua_isboolean(L, 1)) uniprocess = lua_toboolean(L, 1);
|
||||||
if (lua_isboolean(L, 1)) uniprocess = lua_toboolean(L, 1);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue