diff --git a/src/org/jitsi/impl/neomedia/RTPConnectorInputStream.java b/src/org/jitsi/impl/neomedia/RTPConnectorInputStream.java index 70ff8881456086577d7af2c0a42271fddccfe448..576a750d0340bcb27d940d8a5e6cb2e381d36405 100755 --- a/src/org/jitsi/impl/neomedia/RTPConnectorInputStream.java +++ b/src/org/jitsi/impl/neomedia/RTPConnectorInputStream.java @@ -341,7 +341,8 @@ public void run() * If we got extended, the delivery of the packet may have been * canceled. */ - if ((pkt != null) && (transferHandler != null) && !closed) + if ((pkt != null) && (!pkt.isInvalid()) + && (transferHandler != null) && !closed) transferHandler.transferData(this); } } diff --git a/src/org/jitsi/impl/neomedia/RawPacket.java b/src/org/jitsi/impl/neomedia/RawPacket.java index db1b51730e9fdf391e27aa379bf1e2cb494c72bd..9a88e8afbc659dba881e85eabdd8d4bcb2b4b7f6 100644 --- a/src/org/jitsi/impl/neomedia/RawPacket.java +++ b/src/org/jitsi/impl/neomedia/RawPacket.java @@ -21,6 +21,7 @@ * @author Bing SU (nova.su@gmail.com) * @author Emil Ivov * @author Damian Minkov + * @author Boris Grozev */ public class RawPacket { @@ -470,7 +471,7 @@ public long[] extractCsrcList() */ public int getPaddingSize() { - if ((buffer[offset] & 0x4) == 0) + if ((buffer[offset] & 0x20) == 0) return 0; else return buffer[offset + length - 1]; @@ -958,4 +959,24 @@ public int getHeaderExtensionType() return readUnsignedShortAsInt( offset + FIXED_HEADER_SIZE + getCsrcCount()*4); } + + /** + * Perform checks on the packet represented by this instance and + * return <tt>true</tt> if it is found to be invalid. A return value of + * <tt>false</tt> does not necessarily mean that the packet is valid. + * + * @return <tt>true</tt> if the RTP/RTCP packet represented by this + * instance is found to be invalid, <tt>false</tt> otherwise. + */ + public boolean isInvalid() + { + if (buffer == null) + return true; + if (buffer.length < offset + length) + return true; + if (length < FIXED_HEADER_SIZE || length < getHeaderLength()) + return true; + + return false; + } } diff --git a/src/org/jitsi/impl/neomedia/transform/TransformUDPInputStream.java b/src/org/jitsi/impl/neomedia/transform/TransformUDPInputStream.java index e1ab8c4666673c6a85c3cb5284237a5eb77fc5db..90614d6282d169774dc4eacc80199c484fe62c20 100644 --- a/src/org/jitsi/impl/neomedia/transform/TransformUDPInputStream.java +++ b/src/org/jitsi/impl/neomedia/transform/TransformUDPInputStream.java @@ -62,6 +62,10 @@ protected RawPacket createRawPacket(DatagramPacket datagramPacket) PacketTransformer transformer = getTransformer(); RawPacket pkt = super.createRawPacket(datagramPacket); + /* Don't try to transform invalid packets */ + if (pkt.isInvalid()) + return pkt; + return (transformer == null) ? pkt : transformer.reverseTransform(pkt); }