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];
 };