On Thu, Dec 04, 2003 at 04:21:06PM +0100, Mark Wielaard wrote:
> Hi,
>
> On Thu, 2003-12-04 at 13:16, Michael Koch wrote:
> > I commit the attached patch together with some native parts to libgcj.
> > Can some brave soul please test it on classpath (with kissme or so)
> > and report back ?
>
> I quickly tried.
> There don't seem to be any Mauve tests affected.
> But this is the result from running the udp-tests from
> http://www.scheinwelt.at/~norbertf/gcj/tests/
> We should turn these into mauve tests.
Here is a patch for this. Please test. Its against an old CVS snapshot
and without changelog entry yet as CVS is down anyways.
Michael
diff -urN /home/mkoch/src/cvs/classpath/java/net/DatagramPacket.java
/home/mkoch/src/classpath/java/net/DatagramPacket.java
--- /home/mkoch/src/cvs/classpath/java/net/DatagramPacket.java 2003-11-25
11:15:13.000000000 +0100
+++ /home/mkoch/src/classpath/java/net/DatagramPacket.java 2003-12-04
16:44:14.000000000 +0100
@@ -78,13 +78,18 @@
private int offset;
/**
- * The length of the data buffer to send
+ * The length of the data buffer to send.
*/
- private int length;
+ int length;
/**
+ * The maximal length of the buffer.
+ */
+ int maxlen;
+
+ /**
* The address to which the packet should be sent or from which it
- * was received
+ * was received.
*/
private InetAddress address;
@@ -106,21 +111,9 @@
*/
public DatagramPacket(byte[] buf, int offset, int length)
{
- if (buf == null)
- throw new NullPointerException("Null buffer");
- if (offset < 0)
- throw new IllegalArgumentException("Invalid offset: " + offset);
- if (length < 0)
- throw new IllegalArgumentException("Invalid length: " + length);
- if (offset + length > buf.length)
- throw new IllegalArgumentException("Potential buffer overflow - offset: "
- + offset + " length: " + length);
-
- buffer = buf;
- this.offset = offset;
- this.length = length;
- this.address = null;
- this.port = -1;
+ setData(buf, offset, length);
+ address = null;
+ port = -1;
}
/**
@@ -150,25 +143,9 @@
public DatagramPacket(byte[] buf, int offset, int length,
InetAddress address, int port)
{
- if (buf == null)
- throw new NullPointerException("Null buffer");
- if (offset < 0)
- throw new IllegalArgumentException("Invalid offset: " + offset);
- if (length < 0)
- throw new IllegalArgumentException("Invalid length: " + length);
- if (offset + length > buf.length)
- throw new IllegalArgumentException("Potential buffer overflow - offset: "
- + offset + " length: " + length);
- if (port < 0 || port > 65535)
- throw new IllegalArgumentException("Invalid port: " + port);
- if (address == null)
- throw new NullPointerException("Null address");
-
- buffer = buf;
- this.offset = offset;
- this.length = length;
- this.address = address;
- this.port = port;
+ setData(buf, offset, length);
+ setAddress(address);
+ setPort(port);
}
/**
@@ -203,8 +180,13 @@
SocketAddress address)
throws SocketException
{
- this(buf, offset, length, ((InetSocketAddress)address).getAddress(),
- ((InetSocketAddress)address).getPort());
+ if (! (address instanceof InetSocketAddress))
+ throw new IllegalArgumentException("unsupported address type");
+
+ InetSocketAddress tmp = (InetSocketAddress) address;
+ setData(buf, offset, length);
+ setAddress(tmp.getAddress());
+ setPort(tmp.getPort());
}
/**
@@ -223,8 +205,7 @@
public DatagramPacket(byte[] buf, int length, SocketAddress address)
throws SocketException
{
- this(buf, 0, length, ((InetSocketAddress)address).getAddress(),
- ((InetSocketAddress)address).getPort());
+ this(buf, 0, length, address);
}
/**
@@ -330,9 +311,10 @@
public void setSocketAddress(SocketAddress address)
throws IllegalArgumentException
{
- if (address == null) throw new IllegalArgumentException();
+ if (address == null)
+ throw new IllegalArgumentException("address may not be null");
- InetSocketAddress tmp = (InetSocketAddress)address;
+ InetSocketAddress tmp = (InetSocketAddress) address;
this.address = tmp.getAddress();
this.port = tmp.getPort();
}
@@ -359,14 +341,9 @@
*
* @since 1.1
*/
- public synchronized void setData(byte[] buf)
+ public void setData(byte[] buf)
{
- // This form of setData requires setLength to be called separately
- // and subsequently.
- if (buf == null)
- throw new NullPointerException("Null buffer");
-
- buffer = buf;
+ setData(buf, 0, buf.length);
}
/**
@@ -388,15 +365,10 @@
throw new NullPointerException("Null buffer");
if (offset < 0)
throw new IllegalArgumentException("Invalid offset: " + offset);
- if (length < 0)
- throw new IllegalArgumentException("Invalid length: " + length);
- if (offset + length > buf.length)
- throw new IllegalArgumentException("Potential buffer overflow - offset: "
- + offset + " length: " + length);
buffer = buf;
this.offset = offset;
- this.length = length;
+ setLength(length);
}
/**
@@ -418,6 +390,6 @@
+ offset + " length: " + length);
this.length = length;
+ this.maxlen = length;
}
-} // class DatagramPacket
-
+}
diff -urN
/home/mkoch/src/cvs/classpath/native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c
/home/mkoch/src/classpath/native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c
---
/home/mkoch/src/cvs/classpath/native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c
2003-12-02 09:13:17.000000000 +0100
+++
/home/mkoch/src/classpath/native/jni/java-net/gnu_java_net_PlainDatagramSocketImpl.c
2003-12-04 16:42:33.000000000 +0100
@@ -163,6 +163,7 @@
#ifndef WITHOUT_NETWORK
unsigned int addr, port, maxlen, offset, bytes_read;
jclass cls, addr_cls;
+ jfieldID fid;
jmethodID mid;
jarray arr;
unsigned char octets[4];
@@ -224,7 +225,14 @@
DBG("PlainDatagramSocketImpl.receive(): Got the offset\n");
/* Now get the maximal available length from the packet */
- maxlen = (*env)->GetArrayLength(env,arr) - offset;
+ fid = (*env)->GetFieldID(env, cls, "maxlen", "I");
+ if (fid == NULL)
+ {
+ JCL_ThrowException(env, IO_EXCEPTION, "Internal error: maxlen");
+ return;
+ }
+
+ maxlen = (*env)->GetIntField(env, packet, fid);
/* Receive the packet */
/* should we try some sort of validation on the length? */
@@ -318,20 +326,15 @@
DBG("PlainDatagramSocketImpl.receive(): Stored the port\n");
/* Store back the length */
- mid = (*env)->GetMethodID(env, cls, "setLength", "(I)V");
- if (mid == NULL)
+ fid = (*env)->GetFieldID(env, cls, "length", "I");
+ if (fid == NULL)
{
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error: setLength");
- return;
- }
-
- (*env)->CallVoidMethod(env, packet, mid, bytes_read);
- if ((*env)->ExceptionOccurred(env))
- {
- JCL_ThrowException(env, IO_EXCEPTION, "Internal error: call setLength");
+ JCL_ThrowException(env, IO_EXCEPTION, "Internal error: length");
return;
}
+ (*env)->SetIntField(env, packet, fid, bytes_read);
+
DBG("PlainDatagramSocketImpl.receive(): Stored the length\n");
#else /* not WITHOUT_NETWORK */
#endif /* not WITHOUT_NETWORK */
_______________________________________________
Classpath mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/classpath