From bc9562c64e9ff2d8e7209edbc65fcdbc645d2139 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 27 Jan 2026 11:42:03 -0600 Subject: [PATCH] tests: Accidentally found a couple buffer overruns - Off-by-one in test_btree_find_general[_sparse]_fuzz Because we can only create named btrees via splitting, these always start with one entry. If all operations are randomly selected to be splits, this can lead to an overflow of the sim buffer (sounds unlikely, but relatively easily for small N). The fix is to use a `for (lfs3_size_t i = 1; i < N; i++)` loop to account for the initial entry. Note we already use this in the test_btree_split_* tests. An alternative is allocating space for N+1 entries, but this seems unintuitive with N usually being associated with the upper bound on btree size. - Off-by-one in our sim rename pattern When renaming, we don't bother to update sim_size, because after the rename the sim_size size will be unchanged. But this means the sim_size is out-of-date during the memmove that reinserts the renamed entry. Buffer overflow! To fix we just need to use sim_size-1 to account for the temporarily deleted entry. This is messy C code, so not surprised it went unnoticed, even though this pattern ended up in quite a few tests. Found while running with HEAP=1. This was just intended to test HEAP=1, but I guess the injected heap hooks result in a more fragile heap? They increase all allocations by one word, and maybe this reduces alignment padding? Not exactly sure. But it's a good argument for maybe adding heap canaries in the future. Previously we ran Valgrind on all tests, but it's unclear if this will still be reasonable with the number of tests we have now. --- tests/test_badblocks.toml | 40 ++++++++++++++++++------------------- tests/test_btree.toml | 4 ++-- tests/test_ck.toml | 20 +++++++++---------- tests/test_dirs.toml | 4 ++-- tests/test_exhaustion.toml | 20 +++++++++---------- tests/test_files.toml | 8 ++++---- tests/test_gc.toml | 20 +++++++++---------- tests/test_grow.toml | 20 +++++++++---------- tests/test_relocations.toml | 20 +++++++++---------- tests/test_stickynotes.toml | 14 ++++++------- tests/test_trvs.toml | 20 +++++++++---------- 11 files changed, 95 insertions(+), 95 deletions(-) diff --git a/tests/test_badblocks.toml b/tests/test_badblocks.toml index e96b2eb8..c7daf2bd 100644 --- a/tests/test_badblocks.toml +++ b/tests/test_badblocks.toml @@ -360,7 +360,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -703,9 +703,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -1301,11 +1301,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -1787,13 +1787,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -2327,7 +2327,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -2672,9 +2672,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -3272,11 +3272,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -3759,13 +3759,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; diff --git a/tests/test_btree.toml b/tests/test_btree.toml index 9f0c5329..53ca06c0 100644 --- a/tests/test_btree.toml +++ b/tests/test_btree.toml @@ -4015,7 +4015,7 @@ code = ''' memcpy(&sim_names[0], "___", 3); uint32_t prng = SEED; - for (lfs3_size_t i = 0; i < N; i++) { + for (lfs3_size_t i = 1; i < N; i++) { // choose a pseudo-random op uint8_t op = TEST_PRNG(&prng) % 3; // choose a pseudo-random bid @@ -4203,7 +4203,7 @@ code = ''' sim_weights[0] = W; uint32_t prng = SEED; - for (lfs3_size_t i = 0; i < N; i++) { + for (lfs3_size_t i = 1; i < N; i++) { // choose a pseudo-random op uint8_t op = TEST_PRNG(&prng) % 3; // choose a pseudo-random bid diff --git a/tests/test_ck.toml b/tests/test_ck.toml index 31033fa0..49a19eae 100644 --- a/tests/test_ck.toml +++ b/tests/test_ck.toml @@ -2941,7 +2941,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -3302,9 +3302,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -4185,11 +4185,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -4818,13 +4818,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; diff --git a/tests/test_dirs.toml b/tests/test_dirs.toml index 8926798a..f64b9af0 100644 --- a/tests/test_dirs.toml +++ b/tests/test_dirs.toml @@ -6717,7 +6717,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -6883,7 +6883,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; diff --git a/tests/test_exhaustion.toml b/tests/test_exhaustion.toml index 45417856..2fd3b77c 100644 --- a/tests/test_exhaustion.toml +++ b/tests/test_exhaustion.toml @@ -146,7 +146,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -406,9 +406,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -1063,11 +1063,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -1602,13 +1602,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; diff --git a/tests/test_files.toml b/tests/test_files.toml index fc97d7d0..e8654a4a 100644 --- a/tests/test_files.toml +++ b/tests/test_files.toml @@ -2796,9 +2796,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -3010,9 +3010,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } diff --git a/tests/test_gc.toml b/tests/test_gc.toml index b168db12..aadc5d10 100644 --- a/tests/test_gc.toml +++ b/tests/test_gc.toml @@ -3337,7 +3337,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -3692,9 +3692,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -4300,11 +4300,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -4781,13 +4781,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; diff --git a/tests/test_grow.toml b/tests/test_grow.toml index 8b55fcd4..0b0ebf33 100644 --- a/tests/test_grow.toml +++ b/tests/test_grow.toml @@ -712,7 +712,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -1139,9 +1139,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -1611,11 +1611,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -2147,13 +2147,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; diff --git a/tests/test_relocations.toml b/tests/test_relocations.toml index 6791f6ed..ec143417 100644 --- a/tests/test_relocations.toml +++ b/tests/test_relocations.toml @@ -174,7 +174,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -442,9 +442,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -833,11 +833,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -1288,13 +1288,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; diff --git a/tests/test_stickynotes.toml b/tests/test_stickynotes.toml index fd7a9c0f..6a3d6ad7 100644 --- a/tests/test_stickynotes.toml +++ b/tests/test_stickynotes.toml @@ -11126,11 +11126,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -11580,13 +11580,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; diff --git a/tests/test_trvs.toml b/tests/test_trvs.toml index 23f49f3b..0fb4ad28 100644 --- a/tests/test_trvs.toml +++ b/tests/test_trvs.toml @@ -9498,7 +9498,7 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); sim[k] = y; } break; @@ -9835,9 +9835,9 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); sim[k] = y; sim_prngs[k] = wprng; } @@ -10427,11 +10427,11 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky; @@ -10915,13 +10915,13 @@ code = ''' } // then insert memmove(&sim[k+1], &sim[k], - (sim_size-k)*sizeof(lfs3_size_t)); + (sim_size-1-k)*sizeof(lfs3_size_t)); memmove(&sim_prngs[k+1], &sim_prngs[k], - (sim_size-k)*sizeof(uint32_t)); + (sim_size-1-k)*sizeof(uint32_t)); memmove(&sim_isstickys[k+1], &sim_isstickys[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); memmove(&sim_isdirs[k+1], &sim_isdirs[k], - (sim_size-k)*sizeof(bool)); + (sim_size-1-k)*sizeof(bool)); sim[k] = y; sim_prngs[k] = wprng; sim_isstickys[k] = sticky;