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