diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | java/io/FileDescriptor.java | 4 | ||||
-rw-r--r-- | java/net/PlainDatagramSocketImpl.java | 5 | ||||
-rw-r--r-- | java/util/PropertyPermission.java | 29 | ||||
-rw-r--r-- | native/jni/java-net/javanet.c | 25 |
5 files changed, 67 insertions, 10 deletions
@@ -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); |