Commit Diff


commit - 75a69d3b20b73b4a66530043090198b8be1d7d0a
commit + 39ef727f465306bad804814e58ee0a94224c9fec
blob - c9e4493ec806417f257af70770f5f1bc53cb97a3
blob + 4e79affdf78b453823d1008793f09f3b65e75f9c
--- src/libbio/bseek.c
+++ src/libbio/bseek.c
@@ -5,6 +5,7 @@ off_t
 Bseek(Biobuf *bp, off_t offset, int base)
 {
 	vlong n, d;
+	int bufsz;
 
 	switch(bp->state) {
 	default:
@@ -28,13 +29,16 @@ Bseek(Biobuf *bp, off_t offset, int base)
 		 */
 		if(base == 0) {
 			d = n - Boffset(bp);
-			bp->icount += d;
-			if(d >= 0) {
-				if(bp->icount <= 0)
-					return n;
-			} else {
-				if(bp->ebuf - bp->gbuf >= -bp->icount)
-					return n;
+			bufsz = bp->ebuf - bp->gbuf;
+			if(-bufsz <= d && d <= bufsz){
+				bp->icount += d;
+				if(d >= 0) {
+					if(bp->icount <= 0)
+						return n;
+				} else {
+					if(bp->ebuf - bp->gbuf >= -bp->icount)
+						return n;
+				}
 			}
 		}