acme, sam: handle >1GB files correctly
TBR=rsc
https://codereview.appspot.com/74060043
diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h
index d0feb09..5c156eb 100644
--- a/src/cmd/acme/dat.h
+++ b/src/cmd/acme/dat.h
@@ -69,7 +69,7 @@
struct Block
{
- uint addr; /* disk address in bytes */
+ vlong addr; /* disk address in bytes */
union
{
uint n; /* number of used runes in block */
@@ -80,7 +80,7 @@
struct Disk
{
int fd;
- uint addr; /* length of temp file */
+ vlong addr; /* length of temp file */
Block *free[Maxblock/Blockincr+1];
};
diff --git a/src/cmd/acme/disk.c b/src/cmd/acme/disk.c
index 857d932..8d95fa1 100644
--- a/src/cmd/acme/disk.c
+++ b/src/cmd/acme/disk.c
@@ -82,6 +82,9 @@
b = blist;
blist = b->u.next;
b->addr = d->addr;
+ if(d->addr+size < d->addr){
+ error("temp file overflow");
+ }
d->addr += size;
}
b->u.n = n;
diff --git a/src/cmd/sam/disk.c b/src/cmd/sam/disk.c
index 81c9838..50bbc07 100644
--- a/src/cmd/sam/disk.c
+++ b/src/cmd/sam/disk.c
@@ -75,6 +75,9 @@
b = blist;
blist = b->u.next;
b->addr = d->addr;
+ if(d->addr+size < d->addr){
+ panic("temp file overflow");
+ }
d->addr += size;
}
b->u.n = n;
diff --git a/src/cmd/sam/sam.h b/src/cmd/sam/sam.h
index f182ec9..c2aaa07 100644
--- a/src/cmd/sam/sam.h
+++ b/src/cmd/sam/sam.h
@@ -113,7 +113,7 @@
struct Block
{
- uint addr; /* disk address in bytes */
+ vlong addr; /* disk address in bytes */
union {
uint n; /* number of used runes in block */
Block *next; /* pointer to next in free list */
@@ -123,7 +123,7 @@
struct Disk
{
int fd;
- uint addr; /* length of temp file */
+ vlong addr; /* length of temp file */
Block *free[Maxblock/Blockincr+1];
};