`
tetsu.soh
  • 浏览: 78170 次
  • 性别: Icon_minigender_1
  • 来自: 东京
社区版块
存档分类
最新评论

JAVA的bug?

阅读更多
在把向CDC1.1 prot kerberos的时候,遇到了一个问题。
在CDC1.0.1上运行良好的程序,产生了“server not found in kerberos database(7)” 错误。

找来找去,结果发现是在构造PrincipalName Object的时候,有如下一段代码:(Kerberos V5的SUN实现,源码对外不开放)
if (nameParts.length >= 2) {
    try {
        String hostName = (InetAddress.getByName(nameParts[1])).getCanonicalHostName();
    } catch (UnknownHostException e) {
        // no canonicalization, just convert to lowercase
        nameParts[1] = nameParts[1].toLowerCase();
    }
}
注意其中resolve hostname的方法,是通过调用InetAddress.getCanonicalHostName()来实现的。
在CDC1.0.1的kerberos中,因为没有这个方法,所以用getHostname来代替的。

Canonicalize是指“最简化”,就是数学中将一个表达式化为其最简形式的意思。

好了,回头再来看我们的kerberos。
RFC 1510和1964,对principalName的命名方法作了规定。简单来说,就是principal name由两部分组成:
service@hostname

RFC 1964的描述如下:
"When a reference to a name of this type is resolved, the "hostname" is canonicalized by attempting a DNS lookup and using the fully-qualified domain name which is returned, or by using the "hostname" as provided if the DNS lookup fails.  The canonicalization operation also maps the host's name into lower-case characters."

可是参看InetAddress.getCanonicalHostName()的API doc我们就发现问题了。该方法在解析失败后,返回的是IP地址,而不是“the 'hostname' as provided” -- 也就是InetAddress构造是所用的hostname。

这就导致了开始所说的错误。用户输入的是FQDN,而因某种原因,DNS解析失败后,principal name中的hostname却变成了IP address,这样的principal name当然在kerberos database中找不到了。

那么这是谁的bug?
InetAddress中getCanonocialHostName()的方法实现有问题?
RFC 1964要求canonicalize hostname,并说明了如何做,不过getCanonocialHostName()方法明显是不满足要求的,虽然挂了个canonical的名。当然了,这个方法不是仅在Kerberos的实现中使用,所以也不能说这个实现就不合规矩。

那么是Kerberos实现的错咯?
找了SUN的bugs database,没有找到相关的bugs报告。

我手头有的SUN实现的Kerberos,版本只到JDK1.5.0,不知道以后的版本中是不是修复了这个问题?
分享到:
评论
2 楼 tetsu.soh 2007-04-17  
今天在1G的一个同事的提示下,测试了如下一个程序. 改变Windows的“%system%drivers\etc\host”文件中对测试IP地址(133.139.22.35)的解析,结果也随之改变。
这是当然的。
try {
        InetAddress add = InetAddress.getByName("133.139.22.35");
        System.out.println("Canonical HostName: " + add.getCanonicalHostName());
} catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

但是如果做如下设定:
133.139.22.35   noah.spf.ricoh.co.jp   #domain name
133.139.22.35   noah-server.noah.spf.ricoh.co.jp    #host name

然后测试用hostname来测试,也就是
InetAddress.getByName("noah-server.noah.spf.ricoh.co.jp ");

返回的结果却是noah.spf.ricoh.co.jp (domain name!!!)

可见,getCanonicalHostName其实就是从本地的解析文件中顺序寻找IP地址的解析,如果找到了,就返回值(而不管这个值是什么)
如果找不到,就返回IP address。

这个实现是不是正确呢?
Java doc对这个方法的说明是“Gets the fully qualified domain name for this IP address. ”
对这个方法有两个疑问:
1。 这个FQDN是否应该经过确认?SUN的实现,是用SecurityManage.checkConnect方法,但是如果没有指定SecurityManager的话,就不测试。
其结果是,如果在host文件中,做如下修改:
133.139.22.35   xxxx.xxxx.xxxx   #whatever you like
133.139.22.35   noah.spf.ricoh.co.jp   #domain name
133.139.22.35   noah-server.noah.spf.ricoh.co.jp    #host name

那么上面的测试返回的结果就是“xxxx.xxxx.xxxx”了!

2。 Kerberos 的 principalname = service@hostname
但是在解析hostname的时候,JDK1.4后,使用了getCanonicalHostName()方法,按照API docs,这个方法返回的是FQDN,也就是Domain Name, 而不是Host Name。
这明显是不合理的。

Kerberos的这个实现问题已经通过公司提交给SUN了,目前还没有回复。等待中....
1 楼 tetsu.soh 2007-04-12  
没有朋友在做Kerberos的项目么?谁有1.5.0以后的SUN实现的kerberos源码?帮忙check以下吧

相关推荐

    java Bug模式详解

    java Bug模式详解

    JAVA代码BUG分析

    在编程世界中,Java语言以其跨平台性和稳定性深受开发者喜爱,但即使是经验丰富的程序员,也难免会在编写代码时遇到各种各样的错误,也就是我们常说的“BUG”。本篇将聚焦于"JAVA代码BUG分析"这一主题,深入探讨常见...

    Java Bug模式详解 pdf版

    《Java Bug模式详解》这本书是面向那些已经具备Java编程基础的开发者,旨在帮助他们更好地理解和解决在编程过程中遇到的各种错误和异常,提升代码质量和维护效率。书中深入剖析了Java编程中常见的bug模式,通过实例...

    Java Bug模式详解.rar

    Java Bug模式详解主要涵盖的是Java编程中常见的错误和陷阱,这些错误往往会导致程序运行异常或者性能下降。在软件开发过程中,理解和避免这些Bug模式对于提高代码质量和效率至关重要。本资源包含一本PDF电子书《Java...

    java框架bug处理大全

    java 框架 bug处理 大全

    java java查bug 查bug bug 查错 源码

    "查bug"和"查错"是每个Java开发者必备的技能,而深入理解源码则能帮助我们更好地定位和解决问题。 在Java中,查bug通常涉及以下几个关键步骤: 1. **复现问题**:首先,我们需要在开发环境中重现bug,这包括了理解...

    java bug系统

    【Java Bug系统】是一个专为跟踪和管理软件开发过程中出现的错误或问题的系统,它通常用于记录、分类、优先级排序以及修复这些bug。在Java编程语言中,开发这样的系统意味着利用Java的强大特性和丰富的类库来实现...

    java开源的bug管理系统.rar

    Java开源的Bug管理系统是一款基于Java技术构建的问题跟踪与解决工具,它主要用于协助软件开发团队进行有效的缺陷管理和项目任务控制。这个系统通常包含了多种功能模块,如问题报告、故障分类、优先级设定、状态追踪...

    JAVA.BUG模式详解

    在Java编程中,"BUG模式"通常指的是程序员在编写代码时容易犯的一些常见错误或陷阱,这些错误可能导致程序运行不正常、性能下降甚至系统崩溃。理解并避免这些BUG模式是提高Java程序质量和效率的关键。本篇文章将深入...

    基于java软件bug管理系统设计与实现.docx

    基于java软件bug管理系统设计与实现

    java类型BUG总结

    ### Java类型BUG总结 #### 一、糟糕的命名习惯 **问题描述:** 糟糕的命名习惯会导致代码可读性差,难以维护。例如,使用`i`, `ii`, `j`, `k`作为循环变量,这虽然在某些情况下是常见的做法,但对于变量的功能描述...

    java的BUG集锦以及初学者上级练习素材全套.zip

    Java编程语言以其强大的跨平台能力和丰富的库支持深受程序员喜爱,但对于初学者来说,理解并解决各种BUG是学习过程中的一大挑战。这份"java的BUG集锦以及初学者上级练习素材全套.zip"提供了丰富的资源,旨在帮助新手...

    BTS.rar_BTS_bug_java bug_系统

    标题中的"BTS.rar"可能指的是Bug Tracking System(BUG跟踪系统)的压缩文件,而"BTS_bug_java bug_系统"进一步强调了这个系统是专门针对Java编程语言中的bug进行管理和跟踪的。结合描述,我们可以深入探讨以下几个...

    java问题管理 BUG管理 任务管理 项目管理系统.rar

    在IT行业中,问题管理、BUG管理、任务管理和项目管理是软件开发流程中的核心环节,尤其在Java编程领域,这些管理工具和技术的应用对于提高团队效率、保证产品质量至关重要。本压缩包文件"java问题管理 BUG管理 任务...

    基于JAVA语言开发的bug管理系统

    《基于JAVA语言开发的Bug管理系统详解》 在软件开发过程中,Bug管理是至关重要的环节,它关乎着软件质量与用户体验。本文将深入探讨基于JAVA语言开发的Bug管理系统,旨在为开发者提供一个全面的理解和实践指南。 ...

    Java Bug 模式详解

    Java Bug模式详解是一种深入理解和解决Java编程中常见错误和陷阱的方法。这些模式通常源于语言特性、API使用不当或对编程规范的误解。本篇将详细探讨一些常见的Java Bug模式,并提供预防和修复策略。 1. **空指针...

    解决Java实现飞行棋Bug

    本篇文章将详细讨论如何解决在Java实现飞行棋时遇到的常见Bug,确保游戏能够顺利运行。 首先,我们需要了解飞行棋的基本规则。飞行棋通常有四个颜色的棋子,玩家轮流掷骰子决定棋子的移动步数。棋子可以跳跃,当一...

    使用Java编写不含任何BUG的计算器

    在编程领域,构建一个无bug的程序是一项挑战,...总的来说,创建一个无bug的Java计算器需要对Java语言有深入的理解,包括类、方法、异常处理以及数值计算。同时,良好的编程习惯和严谨的测试策略是确保代码质量的关键。

    JAVA常见异常BUG

    ### JAVA常见异常BUG详解 #### 一、Java.lang.ArrayStoreException **定义**: `java.lang.ArrayStoreException` 是一种运行时异常(RuntimeException),当尝试向一个特定类型的对象数组存储不兼容类型的对象时...

    bug描述报告书

    【描述】:“Javabug描述报告书”是针对Java应用程序中发现的错误而编写的,它通常包括错误的详细描述、复现步骤、影响范围以及期望的行为。编写这样的报告书,目的是确保问题能够被有效地追踪和修复,避免未来类似...

Global site tag (gtag.js) - Google Analytics