Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions integration-tests/js-compute/fixtures/module-mode/src/kv-store.js
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,16 @@ const debug = sdkVersion.endsWith('-debug');
}
},
);
routes.set('/kv-store/put/key-parameter-containing-nul-byte', async () => {
await assertRejects(
async () => {
let store = new KVStore(KV_STORE_NAME);
await store.put('a\x00;b', '');
},
TypeError,
`KVStore key can not contain ; character`,
);
});
routes.set('/kv-store/put/value-parameter-as-undefined', async () => {
const store = new KVStore(KV_STORE_NAME);
let result = store.put('undefined', undefined);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@
"GET /kv-store/put/key-parameter-containing-special-characters": {
"flake": true
},
"GET /kv-store/put/key-parameter-containing-nul-byte": { "flake": true },
"GET /kv-store/put/value-parameter-as-undefined": { "flake": true },
"GET /kv-store/put/value-parameter-not-supplied": { "flake": true },
"GET /kv-store/put/value-parameter-readablestream-empty": { "flake": true },
Expand Down
9 changes: 5 additions & 4 deletions runtime/fastly/builtins/kv-store.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ api::Engine *ENGINE;

std::string_view bad_chars{"#;?^|\n\r"};

std::optional<char> find_invalid_character_for_kv_store_key(const char *str) {
std::optional<char> find_invalid_character_for_kv_store_key(const char *str, size_t len) {
std::optional<char> res;

std::string_view view{str, strlen(str)};
std::string_view view{str, len};

auto it = std::find_if(view.begin(), view.end(),
[](auto c) { return bad_chars.find(c) != std::string_view::npos; });
Expand Down Expand Up @@ -195,7 +195,7 @@ bool parse_and_validate_key(JSContext *cx, const char *key, size_t len) {
}

auto key_chars = key;
auto res = find_invalid_character_for_kv_store_key(key_chars);
auto res = find_invalid_character_for_kv_store_key(key_chars, len);
if (res.has_value()) {
std::string character;
switch (res.value()) {
Expand Down Expand Up @@ -231,7 +231,8 @@ bool parse_and_validate_key(JSContext *cx, const char *key, size_t len) {
return false;
}

if (strcmp(key_chars, ".") == 0 || strcmp(key_chars, "..") == 0) {
if ((len == 1 && key_chars[0] == '.') ||
(len == 2 && key_chars[0] == '.' && key_chars[1] == '.')) {
JS_ReportErrorNumberASCII(cx, FastlyGetErrorMessage, nullptr, JSMSG_KV_STORE_KEY_RELATIVE);
return false;
}
Expand Down
Loading