summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--java/io/FileDescriptor.java4
-rw-r--r--java/net/PlainDatagramSocketImpl.java5
-rw-r--r--java/util/PropertyPermission.java29
-rw-r--r--native/jni/java-net/javanet.c25
5 files changed, 67 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 5c47900a3..6cbd3579b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2003-03-20 John Leuner <jewel@debian.org>
+
+ Patches from Stephen Crawley
+ * java/util/PropertyPermission.java: Fix to prevent recursive call during
+ initialization
+ * java/io/FileDescriptor.java (close) : clear nativeFD on success
+ * java/net/PlainDatagramSocketImpl.java (setTTL): remap the TTL passed
+ as an unsigned byte to an integer in the range 0..255
+ * native/jni/java-net/javanet.c (_javanet_get_option):
+ implement ..._get(SOCKOPT_SO_BINDADDR) -> 'getsockname' syscall
+ * native/jni/java-net/javanet.c (_javanet_set_option):
+ implement ..._set(SOCKOPT_SO_BINDADDR) -> Exception
+
+
2003-03-20 Raif S. Naffah <raif@fl.net.au>
* java.security.Security (getAlgorithms(String): fixed a bug.
diff --git a/java/io/FileDescriptor.java b/java/io/FileDescriptor.java
index 84c830c6d..fc3e1fd77 100644
--- a/java/io/FileDescriptor.java
+++ b/java/io/FileDescriptor.java
@@ -197,12 +197,12 @@ public final class FileDescriptor
{
if (nativeFd == -1L)
return;
-
try
{
nativeClose(nativeFd);
+ nativeFd = -1L;
}
- catch(IOException e)
+ catch (IOException e)
{
nativeFd = -1L;
throw new IOException(e.getMessage());
diff --git a/java/net/PlainDatagramSocketImpl.java b/java/net/PlainDatagramSocketImpl.java
index fadc77851..42868edde 100644
--- a/java/net/PlainDatagramSocketImpl.java
+++ b/java/net/PlainDatagramSocketImpl.java
@@ -191,7 +191,10 @@ public class PlainDatagramSocketImpl extends DatagramSocketImpl
*/
protected synchronized void setTTL(byte ttl) throws IOException
{
- setOption(IP_TTL, new Integer(ttl));
+ if (ttl > 0)
+ setOption(IP_TTL, new Integer(ttl));
+ else
+ setOption(IP_TTL, new Integer(ttl + 256));
}
/**
diff --git a/java/util/PropertyPermission.java b/java/util/PropertyPermission.java
index bb03e45f3..0d439d888 100644
--- a/java/util/PropertyPermission.java
+++ b/java/util/PropertyPermission.java
@@ -121,7 +121,7 @@ public final class PropertyPermission extends BasicPermission
super(name);
if (actions == null)
throw new IllegalArgumentException();
- setActions(actions.toLowerCase());
+ setActions(actions);
}
/**
@@ -134,14 +134,37 @@ public final class PropertyPermission extends BasicPermission
*/
private void setActions(String str)
{
+ // Initialising the class java.util.Locale ...
+ // tries to initialise the Locale.defaultLocale static
+ // which calls System.getProperty,
+ // which calls SecurityManager.checkPropertiesAccess,
+ // which creates a PropertyPermission with action "read,write",
+ // which calls setActions("read,write").
+ // If we now were to call toLowerCase on 'str',
+ // this would call Locale.getDefault() which returns null
+ // because Locale.defaultLocale hasn't been set yet
+ // then toLowerCase will fail with a null pointer exception.
+ //
+ // The solution is to take a punt on 'str' being lower case, and
+ // test accordingly. If that fails, we convert 'str' to lower case
+ // and try the tests again.
if ("read".equals(str))
actions = READ;
else if ("write".equals(str))
actions = WRITE;
else if ("read,write".equals(str) || "write,read".equals(str))
actions = READ | WRITE;
- else
- throw new IllegalArgumentException("illegal action " + str);
+ else {
+ String lstr = str.toLowerCase();
+ if ("read".equals(lstr))
+ actions = READ;
+ else if ("write".equals(lstr))
+ actions = WRITE;
+ else if ("read,write".equals(lstr) || "write,read".equals(lstr))
+ actions = READ | WRITE;
+ else
+ throw new IllegalArgumentException("illegal action " + str);
+ }
}
/**
diff --git a/native/jni/java-net/javanet.c b/native/jni/java-net/javanet.c
index 3ffe446a9..c7120cc31 100644
--- a/native/jni/java-net/javanet.c
+++ b/native/jni/java-net/javanet.c
@@ -992,7 +992,7 @@ _javanet_set_option(JNIEnv *env, jobject this, jint option_id, jobject val)
optval = (*env)->CallIntMethod(env, val, mid);
if ((*env)->ExceptionOccurred(env))
return;
-
+
rc = setsockopt(fd, IPPROTO_IP, IP_TTL, &optval, sizeof(int));
break;
@@ -1038,10 +1038,14 @@ _javanet_set_option(JNIEnv *env, jobject this, jint option_id, jobject val)
rc = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&optval,
sizeof(int));
break;
+
+ case SOCKOPT_SO_BINDADDR:
+ JCL_ThrowException(env, SOCKET_EXCEPTION, "This option cannot be set");
+ break;
- default:
- JCL_ThrowException(env, SOCKET_EXCEPTION, "Unrecognized option");
- return;
+ default:
+ JCL_ThrowException(env, SOCKET_EXCEPTION, "Unrecognized option");
+ return;
}
/* Check to see if above operations succeeded */
@@ -1182,6 +1186,19 @@ _javanet_get_option(JNIEnv *env, jobject this, jint option_id)
return(_javanet_create_inetaddress(env, ntohl(si.sin_addr.s_addr)));
break;
+ case SOCKOPT_SO_BINDADDR:
+ memset(&si, 0, sizeof(struct sockaddr_in));
+ optlen = sizeof(struct sockaddr_in);
+ rc = getsockname(fd, (struct sockaddr *) &si, &optlen);
+ if (rc == -1)
+ {
+ JCL_ThrowException(env, SOCKET_EXCEPTION, strerror(errno));
+ return(0);
+ }
+
+ return(_javanet_create_inetaddress(env, ntohl(si.sin_addr.s_addr)));
+ break;
+
case SOCKOPT_SO_REUSEADDR:
optlen = sizeof(int);
rc = getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, &optlen);