List Info

Thread: java/115557: jdk1.6.0: Runtime.exec(...) fails always




java/115557: jdk1.6.0: Runtime.exec(...) fails always
user name
2007-08-15 12:51:11
>Number:         115557
>Category:       java
>Synopsis:       jdk1.6.0: Runtime.exec(...) fails
always
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    freebsd-java
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Aug 15 18:10:00 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Ronald Klop
>Release:        FreeBSD 6.2-STABLE i386
>Organization:
>Environment:


System: FreeBSD 6.2-STABLE #29: Sat Jul 14 14:44:18 CEST
2007
    rootguido.klop.ws:/usr/obj/usr/src/sys/GUIDO



>Description:


When I run this programm, I always get exitCode == 255.
$ java -version
java version "1.6.0_01-p1"
Java(TM) SE Runtime Environment (build
1.6.0_01-p1-root_12_aug_2007_22_50-b00)
Java HotSpot(TM) Client VM (build
1.6.0_01-p1-root_12_aug_2007_22_50-b00, mixed mode)
$ uname -a
FreeBSD ronald.office.base.nl 6.2-STABLE FreeBSD 6.2-STABLE
#74: Sat Jul 14 13:11:40 CEST 2007     rootronald.office.base.nl:/usr/obj/usr/src/sys/RONALD 
i386
 
I found it with other code, but this is my small testcase to
reproduce it.



>How-To-Repeat:


Compile and run this java programm.

import java.io.IOException;
 
final class ExecTest {
 
    public static void main(String[] args) throws
IOException, InterruptedException {
        Runtime rt = Runtime.getRuntime();
        Process p = rt.exec("/bin/ls");
        int exitCode = p.waitFor();
        System.out.println("ExitCode: " +
exitCode);
    }
 
}



>Fix:





>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
freebsd-javafreebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-java

To unsubscribe, send any mail to
"freebsd-java-unsubscribefreebsd.org"

Re: java/115557: jdk1.6.0: Runtime.exec(...) fails always
country flaguser name
Netherlands
2007-08-27 14:50:40
In jdk 1.6 there is some magic performed via file descriptor
3 in 
j2se/src/solaris/native/java/lang/UNIXProcess_md.c that was
not in jdk15. 
The problem is that the closeDescriptors() function in the
patchset was 
not updated to take this into account.

diff -ur bsd-jdk16-patches-1.orig/jdk16.patches
bsd-jdk16-patches-1/jdk16.patches
--- bsd-jdk16-patches-1.orig/jdk16.patches	2007-07-24
09:05:48.000000000 +0200
+++ bsd-jdk16-patches-1/jdk16.patches	2007-08-27
20:44:20.000000000 +0200
 -80764,7
+80764,7 
  +static int
  +closeDescriptors(void)
  +{
-+	return _thread_sys_closefrom(3);
++	return _thread_sys_closefrom(FAIL_FILENO + 1);
  +}
  +
  +#elif defined(_ALLBSD_SOURCE)
 -80782,7
+80782,7 
  +    /*
  +     * BSDNOTE: There's no known way to find list of all
open file descriptors
  +     * associated with process in FreeBSD.  Therefore we
have to pass from
-+     * fd == 3 to maximum fd per process number.  It's
possible to retrive
++     * fd == FAIL_FILENO + 1 to maximum fd per process
number.  It's possible to retrive
  +     * max number of fd's with three ways:
sysctl(kern.maxfilesperproc),
  +     * getrlimit(RLIMIT_NOFILE) and getdtablesize().  In
current implementation
  +     * getdtablesize() returns MIN() of first two ways.
 -80797,7
+80797,7 
  +    max_fd = getdtablesize();
  +    ebadf = 0;
  +
-+    for (i = 3; i < max_fd; i++) {
++    for (i = FAIL_FILENO + 1; i < max_fd; i++) {
  +	if (close(i) < 0) { ebadf++; } else { ebadf = 0; }
  +	/*
  +         * GUESS_FINISHED subsequent calls to close()
returned EBADF, assume
_______________________________________________
freebsd-javafreebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-java

To unsubscribe, send any mail to
"freebsd-java-unsubscribefreebsd.org"

[1-2]

about | contact  Other archives ( Real Estate discussion Medical topics )