Browse Source

util: seek_data_cb: Check validity of offset

Luke Dashjr 11 years ago
parent
commit
7f4c2f1acc
1 changed files with 11 additions and 0 deletions
  1. 11 0
      util.c

+ 11 - 0
util.c

@@ -197,12 +197,23 @@ static int seek_data_cb(void *user_data, curl_off_t offset, int origin)
 	
 	switch (origin) {
 		case SEEK_SET:
+			if (offset < 0 || offset > ub->len)
+				return 1;
 			ub->pos = offset;
 			break;
 		case SEEK_CUR:
+			// Check the offset is valid, taking care to avoid overflows or negative unsigned numbers
+			if (offset < 0 && ub->pos < (size_t)-offset)
+				return 1;
+			if (ub->len < offset)
+				return 1;
+			if (ub->pos > ub->len - offset)
+				return 1;
 			ub->pos += offset;
 			break;
 		case SEEK_END:
+			if (offset > 0 || (size_t)-offset > ub->len)
+				return 1;
 			ub->pos = ub->len + offset;
 			break;
 		default: