/** * grow (and free) the buffer as necessary * @throws IOException if the headers are too big */ private void ensureCapacity() throws IOException { if (_headerBuffer.getValid() >= MAX_HEADER_SIZE) throw new IOException("Max header size exceeded: " + MAX_HEADER_SIZE); if (_headerBuffer.getValid() + 1 >= _headerBuffer.getData().length) { int newSize = (int)(_headerBuffer.getData().length * 1.5); ByteArray newBuf = new ByteArray(new byte[newSize]); System.arraycopy(_headerBuffer.getData(), 0, newBuf.getData(), 0, _headerBuffer.getValid()); newBuf.setValid(_headerBuffer.getValid()); newBuf.setOffset(0); // if we changed the ByteArray size, don't put it back in the cache if (_headerBuffer.getData().length == CACHE_SIZE) _cache.release(_headerBuffer); _headerBuffer = newBuf; } }
/** */ private void writeComplete(byte target[], int offset) { if (_releasedAfter > 0) { RuntimeException e = new RuntimeException("use after free in FragmentedMessage"); _log.error("FM writeComplete() 2", e); throw e; } for (int i = 0; i <= _highFragmentNum; i++) { ByteArray ba = _fragments[i]; System.arraycopy(ba.getData(), ba.getOffset(), target, offset, ba.getValid()); offset += ba.getValid(); } _completed = true; }
@Override public final boolean equals(Object o) { if (o == this) return true; if (o == null) return false; if (o instanceof ByteArray) { ByteArray ba = (ByteArray)o; return compare(getData(), _offset, _valid, ba.getData(), ba.getOffset(), ba.getValid()); } try { byte val[] = (byte[]) o; return compare(getData(), _offset, _valid, val, 0, val.length); } catch (Throwable t) { return false; } }
public ByteArray acquirePayload() { _payload = new ByteArray(new byte[Packet.MAX_PAYLOAD_SIZE]); return _payload; }
@Override public final int hashCode() { return DataHelper.hashCode(getData()); }
/** are the headers finished? */ private boolean headerReceived() { if (_headerBuffer.getValid() < 3) return false; byte first = _headerBuffer.getData()[_headerBuffer.getValid()-3]; byte second = _headerBuffer.getData()[_headerBuffer.getValid()-2]; byte third = _headerBuffer.getData()[_headerBuffer.getValid()-1]; return (isNL(second) && isNL(third)) || // \n\n (isNL(first) && isNL(third)); // \n\r\n }
public final void release(ByteArray entry, boolean shouldZero) { if (entry == null || entry.getData() == null) return; if (entry.getData().length != _entrySize) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(ByteCache.class); if (log.shouldLog(Log.WARN)) log.warn("Bad size", new Exception("I did it")); return; } entry.setValid(0); entry.setOffset(0); if (shouldZero) Arrays.fill(entry.getData(), (byte)0x0); super.release(entry); }
@Override public void write(byte buf[], int off, int len) throws IOException { if (_headerWritten) { out.write(buf, off, len); //out.flush(); return; } for (int i = 0; i < len; i++) { ensureCapacity(); _headerBuffer.getData()[_headerBuffer.getValid()] = buf[off+i]; _headerBuffer.setValid(_headerBuffer.getValid()+1); if (headerReceived()) { writeHeader(); _headerWritten = true; if (i + 1 < len) { // write out the remaining out.write(buf, off+i+1, len-i-1); //out.flush(); } return; } } }
public int getPayloadSize() { return (_payload == null ? 0 : _payload.getValid()); }
packet.setLocalPort(fromPort); packet.setRemotePort(toPort); packet.setPayload(new ByteArray(payload)); if (timeoutMs > MAX_PING_TIMEOUT) timeoutMs = MAX_PING_TIMEOUT; if (ba == null) return new byte[0]; byte[] rv = new byte[ba.getValid()]; System.arraycopy(ba, ba.getOffset(), rv, 0, ba.getValid()); return rv;
if (_received == 0 && (_dataBuf == null || _dataBuf.getData().length < _framelen)) { if (_dataBuf != null && _dataBuf.getData().length == BUFFER_SIZE) releaseReadBuf(_dataBuf); if (_framelen > BUFFER_SIZE) { _log.info("Allocating big ByteArray: " + _framelen); byte[] data = new byte[_framelen]; _dataBuf = new ByteArray(data); } else { _dataBuf = acquireReadBuf(); byte[] data = _dataBuf.getData(); buf.get(data, _received, toGet); _received += toGet; if (_dataBuf.getData().length == BUFFER_SIZE) releaseReadBuf(_dataBuf); _dataBuf = null;
/** * Send bytes through the SAM STREAM session socket sender * * @throws IOException if the client didnt provide enough data */ @Override public void sendBytes(InputStream in, int size) throws IOException { if (_log.shouldLog(Log.DEBUG)) _log.debug("Handler " + _id + ": sending " + size + " bytes"); ByteArray ba = _cache.acquire(); int read = DataHelper.read(in, ba.getData(), 0, size); if (read != size) throw new IOException("Insufficient data from the SAM client (" + read + "/" + size + ")"); ba.setValid(read); synchronized (_data) { _data.add(ba); _data.notifyAll(); } }
public boolean receiveIV(byte ivData[], int ivOffset, byte payload[], int payloadOffset) { //if (true) // foo! // return true; byte iv[] = new byte[HopProcessor.IV_LENGTH]; DataHelper.xor(ivData, ivOffset, payload, payloadOffset, iv, 0, HopProcessor.IV_LENGTH); ByteArray ba = new ByteArray(iv); boolean isNew = _received.add(ba); return isNew; } }
@Override public String toString() { return super.toString() + "/" + DataHelper.toString(getData(), 32) + "." + _valid; }
if (_log.shouldLog(Log.DEBUG)) _log.debug("received msg ID " + messageId + " with " + (payload != null ? payload.getValid() + " bytes" : "no payload")); synchronized (_dataLock) { if (messageId <= _highestReadyBlockId) { if (!_locallyClosed && payload.getValid() > 0) { if (_log.shouldLog(Log.DEBUG)) _log.debug("accepting bytes as ready: " + payload.getValid()); _readyDataBlocks.add(payload); if (ba.getData() != null && ba.getValid() > 0) { _readyDataBlocks.add(ba);