Grave bug encontrado em conversão de String->Double em PHP aparece na JVM

Esse bug é realmente estranho. Mas há bugs piores.

Em 2007 eu submeti esse bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6531725

No entanto, se você clicar neste link aí em cima, verá que ele não funciona. Quando a Oracle comprou a Sun, vários bugs cadastrados “misteriosamente” sumiram.

Bem, que eu saiba ele não foi consertado até hoje (na época a sun recusou o bug como sendo algo “não importante”). Trata-se do seguinte:

Throwable a = new Throwable();
Throwable b = new Throwable(a);
a.initCause(b);
a.printStackTrace(); // Loop infinito!

Imagina o que acontece se um hacker serializa a exceção para o servidor e o servidor faz o log dela?

[quote=victorwss]Esse bug é realmente estranho. Mas há bugs piores.

Em 2007 eu submeti esse bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6531725

No entanto, se você clicar neste link aí em cima, verá que ele não funciona. Quando a Oracle comprou a Sun, vários bugs cadastrados “misteriosamente” sumiram.

Bem, que eu saiba ele não foi consertado até hoje (na época a sun recusou o bug como sendo algo “não importante”). Trata-se do seguinte:

Throwable a = new Throwable();
Throwable b = new Throwable(a);
a.initCause(b);
a.printStackTrace(); // Loop infinito!

Imagina o que acontece se um hacker serializa a exceção para o servidor e o servidor faz o log dela?[/quote]
Se o cadastro sumiu quer dizer que foi corrigido :twisted:

[quote=Adelar][quote=victorwss]Esse bug é realmente estranho. Mas há bugs piores.

Em 2007 eu submeti esse bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6531725

No entanto, se você clicar neste link aí em cima, verá que ele não funciona. Quando a Oracle comprou a Sun, vários bugs cadastrados “misteriosamente” sumiram.

Bem, que eu saiba ele não foi consertado até hoje (na época a sun recusou o bug como sendo algo “não importante”). Trata-se do seguinte:

Throwable a = new Throwable();
Throwable b = new Throwable(a);
a.initCause(b);
a.printStackTrace(); // Loop infinito!

Imagina o que acontece se um hacker serializa a exceção para o servidor e o servidor faz o log dela?[/quote]
Se o cadastro sumiu quer dizer que foi corrigido :twisted: [/quote]

Bem, acabei de testar aqui (Java Hotspot Client VM, versão 1.6.0_22) para ver o que acontecia. Deu um StackOverflowError após ele gerar centenas de linhas de stacktrace repetido. Menos pior do que um loop infinito, mas ainda assim uma ferramenta muito útil para alguém atacar um servidor. :twisted:

[quote=victorwss]
Bem, acabei de testar aqui (Java Hotspot Client VM, versão 1.6.0_22) para ver o que acontecia. Deu um StackOverflowError após ele gerar centenas de linhas de stacktrace repetido. Menos pior do que um loop infinito, mas ainda assim uma ferramenta muito útil para alguém atacar um servidor. :twisted:[/quote]
Aí sim heim… bem melhor kkkkkk
Nem me impressiono tanto… quando mexia com C tinha coisa bem pior :smiley:

Deve ficar melhor ainda assim:

while(true){ double d = 2.2250738585072012e-308; System.out.println("Value: " + d); }

hahahahaha

[quote=namor]Deve ficar melhor ainda assim:

while(true){ double d = 2.2250738585072012e-308; System.out.println("Value: " + d); }

hahahahaha[/quote]
Uma versão customizada… daí caso corrijam o problema lançando uma exceção ainda vai entrar em loop infinito :twisted:

public void bug(){ try{ while(true){ double d = Double.parseDouble("2.2250738585072012e-308"); } } catch(Exception e){ bug(); } }

Não acontece com Ruby \o/

mas e o jruby? :cry:

No minimo a Sun não utilizava testes de cobertura :twisted:

BigDecimal é seu amigo.

[]´s

Pessoal, só a título de aprendizado com relação a esse bug, se houvessem testes unitários automatizados utilizando as condições de fronteira (valores mínimos, máximos e imediatamente anteriores e posteriores) isso não poderia ter sido evitado? Esse bug pode ser considerado uma prova de que a Sun não utiliza/utilizou testes unitários automatizados em sua base de código?

Se eu fosse malvado eu diria.

"Mandem este codigo por email para os amigos mais queridos testarem.

Comitem um metodo com esse codigo so para ver se cai o servidor "

Mais como sou bonzinho eu digo.

Use bigdecimal, para evitar problemas.

rs kkk

[quote=dmitsuo]Pessoal, só a título de aprendizado com relação a esse bug, se houvessem testes unitários automatizados utilizando as condições de fronteira (valores mínimos, máximos e imediatamente anteriores e posteriores) isso não poderia ter sido evitado? Esse bug pode ser considerado uma prova de que a Sun não utiliza/utilizou testes unitários automatizados em sua base de código?

[/quote]

Teoricamente esse tipo de erro deveria ter sido capturado no TCK, que é o teste de compatibilidade da plataforma Java, mas aparentemente os caras não testavam o código mesmo.

Imagina só, um erro tão bobo demorou mais de 15 anos para ser descoberto (desconsiderando o bugtraq da sun claro :).

Affff!!!

Passei um calafrio danado agora… só de ver isto passou pela minha cabeça todos os sites q fiz, mas ainda bem que pelo q eu recordo não há nenhum parametro do tipo double, integers/ids há as pancadas como é óbvio, só falta algum ID estar sendo validado com o parseDouble… ai eu corto os pulsos!!!

Bem, se os servidores começarem a dar problemas já sei q poderá ser disto…

Aqui no guj esta tudo seguro? :twisted:

O q vai ter de neguinho tentando travar os sites em Java por ai…

Espero q os meus queridos colegas fanáticos em .Net não venham me encher o sako com isto! Se bem que o .Net tb tem bugs arcáicos não resolvidos, mas não imaginava q o Java estivesse assim tb, eu pelo menos acho que nunca encontrei um bug, é q na verdade até posso ter encontrado um ou outro e pensado q o problema era do código… :stuck_out_tongue:

Um bug realmente existe, mas existe também um problema de interpretação matemática. O código abaixo roda normalmente e o parser também funciona, observer o comentário que coloquei no código.

Eu recomendo relamente validar e usar o BigDecimal para tratar formularios web, pois o caso acima realmente não evita um ataque ao server se vc estiver usando o parse double para valores científicos.

Testei no Netbean 6.9.1 e funciona normalmente como a saida abaixo. RECOMENDO NAO TENTAR DEPURAR O CODIGO ABAIXO, POIS VAI TRAVAR O IDE.

X: 2.2250738585072014E-308
Y1: 2.2250738585072014E-308
Y2: 2.2250738585072014E-308
Z: double MIN_NORMAL: 2.2250738585072014E-308
B: 2.2250738585072012E-308
W: 0.0

 /**
             *  Atencao nas casas decimais a direita do ponto,
             *  a declaracao abaixo, 22250738585072014E-324, equivale extamente
             *  ao numero 2.225073858507201E-308, mas observe que
             *  2.2250738585072012 eh diferente de 22250738585072012.
             *  O motivo eh a limitacao do expoente -308, sendo que com
             *  2.2250738585072012 temos 16 casas apos o ponto, logo extrapola
             *  o limite do double.
             *  Exemplo para 2.50e-5 e 250e-7 que sao o mesmo numero
             *  0.0000250
             */
            double x = 22250738585072014E-324;
            System.out.println("X: " + x);
            String v = String.valueOf(x);
            // o parser ocorre sem problemas, pois a representacao esta no limite
            // do couble.
            double y = Double.parseDouble(v);
            System.out.println("Y1: " + y);

            // aqui tambem ocorre normalmente pois ainda esta no limite do double
            y = Double.parseDouble("22250738585072014E-324");
            System.out.println("Y2: " + y);

            double z = Double.MIN_NORMAL;
            System.out.println("Z: double MIN_NORMAL: " + z);
            // operacao ocorre normalmente
            double w = x - y;

            /**
             * convesrao sem problema feita pelo BigDecimal
             */
            BigDecimal b = new BigDecimal("2.2250738585072012e-308");
            System.out.println("B: " + b);
            /**
             * A T E N C A O
             * a chamada abaixo vai dar problema pois nao ha como
             * representar o numero acima em double.
             */
            //System.out.println("B: " + b.doubleValue());

            System.out.println("W: " + w);

Abraços, Maximilian.

pesquisei este numero e travei o google.

galera, foi mal :confused:

Foi corrigido no OpenJDK: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/82c8c54ac1d5

A Oracle também já lançou updates pro JDK deles e um patch manual pra quem quiser aplicar. Fizeram um post dando umas desculpinhas pra não terem corrigido antes, já que o bug existe desde 2001:

http://blogs.oracle.com/henrik/2011/02/double_trouble_-_fixing_a_java_security_issue.html

[quote=peczenyj]Não acontece com Ruby \o/

mas e o jruby? :cry: [/quote]

Segundo o Sr. Nutter

o JRuby é a primeira linguagem da JVM livre do BUG :stuck_out_tongue:

[quote=victorwss]Esse bug é realmente estranho. Mas há bugs piores.

Em 2007 eu submeti esse bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6531725

No entanto, se você clicar neste link aí em cima, verá que ele não funciona. Quando a Oracle comprou a Sun, vários bugs cadastrados “misteriosamente” sumiram.

Bem, que eu saiba ele não foi consertado até hoje (na época a sun recusou o bug como sendo algo “não importante”). Trata-se do seguinte:

Throwable a = new Throwable();
Throwable b = new Throwable(a);
a.initCause(b);
a.printStackTrace(); // Loop infinito!

Imagina o que acontece se um hacker serializa a exceção para o servidor e o servidor faz o log dela?[/quote]

O que vc estava tentando fazer para descobrir isto? :shock: :shock: :shock:

[quote=luistiagos][quote=victorwss]Esse bug é realmente estranho. Mas há bugs piores.

Em 2007 eu submeti esse bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6531725

No entanto, se você clicar neste link aí em cima, verá que ele não funciona. Quando a Oracle comprou a Sun, vários bugs cadastrados “misteriosamente” sumiram.

Bem, que eu saiba ele não foi consertado até hoje (na época a sun recusou o bug como sendo algo “não importante”). Trata-se do seguinte:

Throwable a = new Throwable();
Throwable b = new Throwable(a);
a.initCause(b);
a.printStackTrace(); // Loop infinito!

Imagina o que acontece se um hacker serializa a exceção para o servidor e o servidor faz o log dela?[/quote]

O que vc estava tentando fazer para descobrir isto? :shock: :shock: :shock:
[/quote]

Ele estava tentando descobrir o que a JVM faz quando uma exceção culpa a outra!

[quote=peerless]

Ele estava tentando descobrir o que a JVM faz quando uma exceção culpa a outra! [/quote]

então estava só brincando… agora ta explicado o porque a sun recusou… pela própria natureza do negocio isto iria estourar a pilha,
é a mesma coisa que vc colocar 2 espelhos um refletindo o outro e querer que só um deles reflita e o outro não…