提交 a184838e 创建 作者: Austin Clements's avatar Austin Clements

Enforce that a vmnode's sz must agree with its number of pages

Maybe we want vmnode to just take a byte size...
上级 49ba38fa
...@@ -31,6 +31,9 @@ vmnode::vmnode(u64 npg, vmntype ntype, inode *i, u64 off, u64 s) ...@@ -31,6 +31,9 @@ vmnode::vmnode(u64 npg, vmntype ntype, inode *i, u64 off, u64 s)
{ {
if (npg > NELEM(page)) if (npg > NELEM(page))
panic("vmnode too big\n"); panic("vmnode too big\n");
// XXX Maybe vmnode should take just a byte size
if (ip && (sz > npages * PGSIZE || sz <= (npages - 1) * PGSIZE))
panic("vmnode bad size %lu for npages %lu", sz, npages);
memset(page, 0, npg * sizeof(page[0])); memset(page, 0, npg * sizeof(page[0]));
if (type == EAGER && ip) { if (type == EAGER && ip) {
allocall(false); allocall(false);
...@@ -130,8 +133,10 @@ vmnode::loadpg(off_t off) ...@@ -130,8 +133,10 @@ vmnode::loadpg(off_t off)
mtwriteavar("vmnode:%016x", this); mtwriteavar("vmnode:%016x", this);
#endif #endif
assert(off <= sz);
char *p = page[off/PGSIZE]; char *p = page[off/PGSIZE];
s64 filen = off > sz ? 0 : MIN(PGSIZE, sz-off); s64 filen = MIN(PGSIZE, sz-off);
off_t fileo = offset+off; off_t fileo = offset+off;
// //
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论