ref: 37345fce96f5df24f6fce02b876b37314ada0320
parent: d81e6dbca628a7a568aa662d442f49fe00ca6955
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Thu Sep 9 18:50:11 EDT 2021
fix renaming
--- a/ext4srv.c
+++ b/ext4srv.c
@@ -604,7 +604,7 @@
static void
rwstat(Req *r)
{
- int res, isdir, wrperm, isowner;
+ int res, isdir, wrperm, isowner, n;
char *old, *new, *err, *s;
struct ext4_inode inode;
u32int uid, gid;
@@ -642,12 +642,18 @@
/* permission to rename */
if(r->d.name != nil && r->d.name[0] != 0){
- if((s = strrchr(old, '/')) != nil)
- *s = 0;
- if((new = smprint("%M/%s%s%s", a->p, s ? old : "", s ? "/" : "", r->d.name)) == nil){
+ if((s = strrchr(old, '/')) == nil){
+ err = "botched name";
+ goto error;
+ }
+ n = s - old;
+ if((new = malloc(n + 1 + strlen(r->d.name) + 1)) == nil){
err = "memory";
goto error;
}
+ memmove(new, old, n);
+ new[n++] = '/';
+ strcpy(new+n, r->d.name);
/* check parent write permission */
o = *a;