Bug 115557 - jdk1.6.0: Runtime.exec(...) fails always
Summary: jdk1.6.0: Runtime.exec(...) fails always
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: java (show other bugs)
Version: 6.2-STABLE
Hardware: Any Any
: Normal Affects Only Me
Assignee: Greg Lewis
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-08-15 19:10 UTC by Ronald Klop
Modified: 2007-08-28 16:40 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ronald Klop 2007-08-15 19:10:00 UTC
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     root@ronald.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);
    }
 
}
Comment 1 Greg Lewis freebsd_committer freebsd_triage 2007-08-15 21:34:45 UTC
Responsible Changed
From-To: freebsd-java->glewis

I'll take it.
Comment 2 michiel 2007-08-27 20:50:40 UTC
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
Comment 3 dfilter service freebsd_committer freebsd_triage 2007-08-28 16:24:37 UTC
glewis      2007-08-28 15:24:32 UTC

  FreeBSD ports repository

  Modified files:
    java/jdk16           Makefile 
  Added files:
    java/jdk16/files     patch-j2se-lang-UNIXProcess_md.c 
  Log:
  . Sync the BSD specific code with the changes between 1.5 and 1.6 and
    start closing file descriptors at FAIL_FILENO + 1 rather than 3.  This
    fixes the problem with determining the exit code for exec()'ed processes.
  
  PR:             115557
  Submitted by:   Michiel Boland <michiel@boland.org>
  
  Revision  Changes    Path
  1.144     +1 -1      ports/java/jdk16/Makefile
  1.1       +31 -0     ports/java/jdk16/files/patch-j2se-lang-UNIXProcess_md.c (new)
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
Comment 4 Greg Lewis freebsd_committer freebsd_triage 2007-08-28 16:29:30 UTC
State Changed
From-To: open->closed

Thanks, Michiel!  I've committed your patch.