ref: 473a93d794e0e83295e012dd66969ad569044a8d
parent: ea93dce7dc0ab842cbef53e04ca8b819e8a5dd66
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Apr 6 23:40:16 EDT 2025
gefs: allow large snapshot names in gefs when scanning the snapshot name table, a long snapshot would trigger an error copying the key-value pairs, and we could mutate the key we were looking up, leading to finding the wrong value; all other places where the user can control the input uses Kvmax for the size of the return buffer, so we should use that here. We should also separate the input and output variables in btlookup.
--- a/sys/src/cmd/gefs/fs.c
+++ b/sys/src/cmd/gefs/fs.c
@@ -615,18 +615,18 @@
{
static char *tagname[] = {"minute", "hour", "day"};
static int scale[] = {60, 3600, 24*3600};
- char *p, pfx[128], rbuf[128];
+ char *p, pfx[32], rbuf[Kvmax+1];
int i, n, div, cnt, op;
- Kvp kv;
+ Kvp kv, r;
pfx[0] = Kconf;
n = snprint(pfx+1, sizeof(pfx)-1, "retain");
kv.k = pfx;
kv.nk = n+1;
- if(btlookup(mnt->root, &kv, &kv, rbuf, sizeof(rbuf)-1)
- || btlookup(&fs->snap, &kv, &kv, rbuf, sizeof(rbuf)-1)){
- p[kv.nv] = 0;
- p = kv.v;
+ if(btlookup(mnt->root, &kv, &r, rbuf, sizeof(rbuf)-1)
+ || btlookup(&fs->snap, &kv, &r, rbuf, sizeof(rbuf)-1)){
+ p = r.v;
+ p[r.nv] = 0;
}else
p = "60@m 24@h @d";
while(*p){
--
⑨