mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-23 11:44:53 +00:00
Merge pull request #2718 from cesanta/pathissane
change mg_path_is_sane()
This commit is contained in:
9 files changed
+45
-33
No files matched your search
+2
-2
@@ -769,7 +769,7 @@ static int uri_to_path2(struct mg_connection *c, struct mg_http_message *hm,
|
||||
path_size - n, 0);
|
||||
}
|
||||
path[path_size - 1] = '\0'; // Double-check
|
||||
if (!mg_path_is_sane(path)) {
|
||||
if (!mg_path_is_sane(mg_str_n(path, path_size))) {
|
||||
mg_http_reply(c, 400, "", "Invalid path");
|
||||
return -1;
|
||||
}
|
||||
@@ -927,7 +927,7 @@ long mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,
|
||||
} else if (file[0] == '\0') {
|
||||
mg_http_reply(c, 400, "", "file required");
|
||||
res = -1;
|
||||
} else if (mg_path_is_sane(file) == false) {
|
||||
} else if (mg_path_is_sane(mg_str(file)) == false) {
|
||||
mg_http_reply(c, 400, "", "%s: invalid file", file);
|
||||
res = -2;
|
||||
} else if (offset < 0) {
|
||||
|
||||
@@ -173,11 +173,12 @@ void mg_unhex(const char *buf, size_t len, unsigned char *to) {
|
||||
}
|
||||
}
|
||||
|
||||
bool mg_path_is_sane(const char *path) {
|
||||
const char *s = path;
|
||||
if (path[0] == '.' && path[1] == '.') return false; // Starts with ..
|
||||
for (; s[0] != '\0'; s++) {
|
||||
if (s[0] == '/' || s[0] == '\\') { // Subdir?
|
||||
bool mg_path_is_sane(const struct mg_str path) {
|
||||
const char *s = path.buf;
|
||||
size_t n = path.len;
|
||||
if (path.buf[0] == '.' && path.buf[1] == '.') return false; // Starts with ..
|
||||
for (; s[0] != '\0' && n > 0; s++, n--) {
|
||||
if ((s[0] == '/' || s[0] == '\\') && n >= 2) { // Subdir?
|
||||
if (s[1] == '.' && s[2] == '.') return false; // Starts with ..
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,4 +28,4 @@ bool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char delim);
|
||||
char *mg_hex(const void *buf, size_t len, char *dst);
|
||||
void mg_unhex(const char *buf, size_t len, unsigned char *to);
|
||||
unsigned long mg_unhexn(const char *s, size_t len);
|
||||
bool mg_path_is_sane(const char *path);
|
||||
bool mg_path_is_sane(const struct mg_str path);
|
||||
Reference in new issue
Block a user