Bug#348792: libgcj6: string-to-double conversion can throw NullPointerException
Package: libgcj6
Version: 4.0.2-7
Severity: important
For some reason, attempting to convert decimal strings that correspond
to numbers below a certain threshold (between 4.24374e-214 and
4.24375e-214) to doubles (which should have an appreciably wider
range) ends up segfaulting within the guts of libgcj:
$ cat DoubleConvTest.java
class DoubleConvTest {
public static void main(String[] args) {
String s = args[0];
System.out.print("in: " + s + "\n");
Double d = new Double(s);
System.out.print("out: " + d + "\n");
}
}
$ gcj -g --main=DoubleConvTest DoubleConvTest.java -o DoubleConvTest
$ gdb --args ./DoubleConvTest 4e-214
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) run
Starting program: /home/amu/tmp/DoubleConvTest 4e-214
[Thread debugging using libthread_db enabled]
[New Thread 46912531307856 (LWP 10872)]
[New Thread 1082132832 (LWP 10875)]
in: 4e-214
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 46912531307856 (LWP 10872)]
0x00002aaaab8dd4bb in _Jv_mult (ptr=0x7fffffaa9b30, a=0x7fffffaaa640, b=0xffff)
at ../../../src/libjava/java/lang/mprec.c:328
328 ../../../src/libjava/java/lang/mprec.c: No such file or directory.
in ../../../src/libjava/java/lang/mprec.c
(gdb) where
#0 0x00002aaaab8dd4bb in _Jv_mult (ptr=0x7fffffaa9b30, a=0x7fffffaaa640,
b=0xffff) at ../../../src/libjava/java/lang/mprec.c:328
#1 0x00002aaaab8dd64d in _Jv_pow5mult (ptr=0x7fffffaa9b30, b=0x7fffffaaa640,
k=13) at ../../../src/libjava/java/lang/mprec.c:432
#2 0x00002aaaab8db0d9 in _Jv_strtod_r (ptr=0x7fffffaa9b30,
s00=<value optimized out>, se=0x7fffffaaacd8)
at ../../../src/libjava/java/lang/strtod.c:473
#3 0x00002aaaab8cc170 in java::lang::Double::parseDouble (str=0x2aaaaab82b40)
at ../../../src/libjava/java/lang/natDouble.cc:208
#4 0x00002aaaaba61563 in java.lang.Double.Double(java.lang.String) (
this=0x2aaaaab43d30, s=0x2aaaaab82b40) at Double.java:140
#5 0x0000000000401089 in DoubleConvTest.main(java.lang.String[]) (
args=0x2aaaaab8afd8) at DoubleConvTest.java:5
#6 0x00002aaaab8d1b40 in _Jv_ThreadRun (thread=0x2aaaaab51d90)
at ../../../src/libjava/java/lang/natThread.cc:296
#7 0x00002aaaab899398 in _Jv_RunMain (vm_args=<value optimized out>,
klass=0x5018a0, name=0x0, argc=2, argv=0x7fffffaaaf38, is_jar=false)
at ../../../src/libjava/prims.cc:1356
#8 0x0000000000400f68 in main (argc=2, argv=0x7fffffaaaf38)
at /tmp/amu/_0/ccKhN7Bl.i:11
(gdb) cont
Continuing.
Exception in thread "main" [New Thread 1090525536 (LWP 10876)]
java.lang.NullPointerException
at java.lang.Double.parseDouble(java.lang.String) (/usr/lib/libgcj.so.6.0.0)
at java.lang.Double.Double(java.lang.String) (/usr/lib/libgcj.so.6.0.0)
at DoubleConvTest.main(java.lang.String[]) (/home/amu/tmp/DoubleConvTest.java:5)
at .main (/tmp/amu/_0/ccKhN7Bl.i:12)
at .__libc_start_main (/lib/libc-2.3.5.so)
at ._start (/home/amu/tmp/../sysdeps/x86_64/elf/start.S:116)
Program exited with code 01.
The same lossage occurs when compiling to bytecode and running it with
gij.
This is causing kaffe to FTBFS on amd64, because it cannot compile the
definition of java.lang.Double.MIN_VALUE. (Likewise for ikvm, but
that's been FTBFSing lately for unrelated reasons, so it's unclear how
much fixing this would help with that.)
-- System Information:
Debian Release: testing/unstable
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 'sarge-unsupported')
Architecture: amd64 (x86_64)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.15
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Versions of packages libgcj6 depends on:
ii gcj-4.0-base 4.0.2-7 The GNU Compiler Collection (gcj b
ii libc6 2.3.5-12 GNU C Library: Shared libraries an
ii libgcj-common 1:4.0.2-7 Java runtime library (common files
ii zlib1g 1:1.2.3-9 compression library - runtime
Versions of packages libgcj6 recommends:
ii libgcj6-jar 4.0.2-7 Java runtime library for use with
-- no debconf information
Reply to: