comparison src/com/tmate/hgkit/fs/DataAccessProvider.java @ 23:6f9aca1a97be

Severe defect in buffer wrap on seek
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 06 Jan 2011 03:30:43 +0100
parents 382cfe9463db
children 71a9ba42cee8
comparison
equal deleted inserted replaced
22:603806cd2dc6 23:6f9aca1a97be
1 /* 1 /*
2 * Copyright (c) 2010 Artem Tikhomirov 2 * Copyright (c) 2010, 2011 Artem Tikhomirov
3 */ 3 */
4 package com.tmate.hgkit.fs; 4 package com.tmate.hgkit.fs;
5 5
6 import java.io.File; 6 import java.io.File;
7 import java.io.FileInputStream; 7 import java.io.FileInputStream;
108 return bufferStartInFile + buffer.position() >= size; 108 return bufferStartInFile + buffer.position() >= size;
109 } 109 }
110 110
111 @Override 111 @Override
112 public void seek(long offset) throws IOException { 112 public void seek(long offset) throws IOException {
113 if (offset > size) {
114 throw new IllegalArgumentException();
115 }
113 if (offset < bufferStartInFile + buffer.limit() && offset >= bufferStartInFile) { 116 if (offset < bufferStartInFile + buffer.limit() && offset >= bufferStartInFile) {
114 buffer.position((int) (offset - bufferStartInFile)); 117 buffer.position((int) (offset - bufferStartInFile));
115 } else { 118 } else {
116 // out of current buffer, invalidate it (force re-read) 119 // out of current buffer, invalidate it (force re-read)
117 // XXX or ever re-read it right away? 120 // XXX or ever re-read it right away?
128 if (newPos >= 0 && newPos < buffer.limit()) { 131 if (newPos >= 0 && newPos < buffer.limit()) {
129 // no need to move file pointer, just rewind/seek buffer 132 // no need to move file pointer, just rewind/seek buffer
130 buffer.position(newPos); 133 buffer.position(newPos);
131 } else { 134 } else {
132 // 135 //
133 seek(fileChannel.position()+ bytes); 136 seek(bufferStartInFile + newPos);
134 } 137 }
135 } 138 }
136 139
137 private boolean fill() throws IOException { 140 private boolean fill() throws IOException {
138 if (!buffer.hasRemaining()) { 141 if (!buffer.hasRemaining()) {