summaryrefslogtreecommitdiff
path: root/kernel/fs.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2019-09-20 13:09:26 -0400
committerRobert Morris <[email protected]>2019-09-20 13:09:26 -0400
commit7c7ed208221dbd115c7cc88faa0e42150cfa14a2 (patch)
treef37450d7fc3017c63c6dd50afc68800b3c294bfb /kernel/fs.c
parente1a37303c89696a110c61a156768ea15cc03a246 (diff)
downloadxv6-labs-7c7ed208221dbd115c7cc88faa0e42150cfa14a2.tar.gz
xv6-labs-7c7ed208221dbd115c7cc88faa0e42150cfa14a2.tar.bz2
xv6-labs-7c7ed208221dbd115c7cc88faa0e42150cfa14a2.zip
don't leak a file system block if the buf argument to write is invalid
and a usertest
Diffstat (limited to 'kernel/fs.c')
-rw-r--r--kernel/fs.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/fs.c b/kernel/fs.c
index 5505408..53586d5 100644
--- a/kernel/fs.c
+++ b/kernel/fs.c
@@ -505,10 +505,15 @@ writei(struct inode *ip, int user_src, uint64 src, uint off, uint n)
brelse(bp);
}
- if(n > 0 && off > ip->size){
- ip->size = off;
+ if(n > 0){
+ if(off > ip->size)
+ ip->size = off;
+ // write the i-node back to disk even if the size didn't change
+ // because the loop above might have called bmap() and added a new
+ // block to ip->addrs[].
iupdate(ip);
}
+
return n;
}