Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 14516] ファイルの概要

このコミットは、Go言語のnetパッケージにおけるResolveIPAddr関数の修正に関するものです。具体的には、以前のコミット(CL 6842053)で発生した編集ミス(misedit)を修正し、ResolveIPAddr関数がエラーを適切に処理するように改善しています。

コミット

commit da803e5cd38ff74dfec212c1a04c114ee305b7b4
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Wed Nov 28 08:45:23 2012 +0900

    net: fix ResolveIPAddr
    
    Fixes misedit in CL 6844053.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/6849115

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/da803e5cd38ff74dfec212c1a04c114ee305b7b4

元コミット内容

net: fix ResolveIPAddr

Fixes misedit in CL 6842053.

変更の背景

このコミットは、以前のコミットであるCL 6842053で導入された編集ミス(misedit)を修正するために作成されました。CL 6842053は、go:linknameおよびgo:uintptrescapesディレクティブの取り扱いに関するバグを修正するものでしたが、その過程でnetパッケージのResolveIPAddr関数において、エラー処理が欠落する編集ミスが発生したと考えられます。この欠落により、ResolveIPAddr関数が内部でエラーを検出しても、それを呼び出し元に適切に伝播できない状態になっていました。このコミットは、そのエラー伝播の欠落を修正し、関数の堅牢性を回復することを目的としています。

前提知識の解説

  • netパッケージ: Go言語の標準ライブラリの一部で、ネットワークI/O機能を提供します。TCP/IP、UDP、Unixドメインソケットなどのネットワークプロトコルを扱うためのインターフェースが含まれています。
  • ResolveIPAddr関数: netパッケージに存在する関数で、指定されたネットワークタイプ(例: "ip", "ip4", "ip6")とIPアドレスまたはホスト名文字列を解析し、対応する*IPAddr構造体を返します。この関数は、ネットワークアドレスの解決(名前解決やIPアドレスの正規化)を行う際に使用されます。
  • IPAddr構造体: netパッケージで定義されている構造体で、IPアドレスを表します。通常、net.IP型とネットワークゾーン(IPv6の場合)を含みます。
  • resolveInternetAddr関数: netパッケージ内部で使用される関数で、インターネットアドレスの解決を実際に行います。この関数は、アドレス解決の過程でエラーが発生する可能性があります。
  • CL (Change List): Goプロジェクトにおける変更の単位。通常、GoのコードレビューシステムであるGerritで管理されます。CL 6842053CL 6849115は、それぞれ特定の変更セットを指します。

技術的詳細

このコミットが修正している問題は、src/pkg/net/iprawsock.goファイル内のResolveIPAddr関数におけるエラー処理の欠落です。

元のコードでは、resolveInternetAddr関数が呼び出され、その結果がa, err := resolveInternetAddr(afnet, addr, noDeadline)という形で受け取られていました。しかし、このerr変数がnilでない(つまりエラーが発生した)場合のチェックが欠落していました。そのため、resolveInternetAddrがエラーを返した場合でも、そのエラーは無視され、後続のreturn a.(*IPAddr), nilが実行されていました。

もしresolveInternetAddrがエラーを返した場合、anilであるか、予期しない値を持つ可能性があります。その状態でa.(*IPAddr)という型アサーションを行うと、パニック(ランタイムエラー)が発生するか、不正な*IPAddrが返される可能性がありました。これは、ネットワークアドレス解決の失敗が適切にアプリケーションに通知されないという、堅牢性上の問題を引き起こします。

このコミットは、resolveInternetAddrの呼び出し直後にif err != nilというエラーチェックを追加することで、この問題を解決しています。これにより、resolveInternetAddrがエラーを返した場合、そのエラーが即座にResolveIPAddrの呼び出し元に返されるようになり、関数の動作がより予測可能で堅牢になります。

コアとなるコードの変更箇所

--- a/src/pkg/net/iprawsock.go
+++ b/src/pkg/net/iprawsock.go
@@ -37,5 +37,8 @@ func ResolveIPAddr(net, addr string) (*IPAddr, error) {
 	\t\treturn nil, UnknownNetworkError(net)\n \t}\n \ta, err := resolveInternetAddr(afnet, addr, noDeadline)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n \treturn a.(*IPAddr), nil\n }\n```

## コアとなるコードの解説

変更は`src/pkg/net/iprawsock.go`ファイルの`ResolveIPAddr`関数内で行われています。

追加された3行は以下の通りです。

```go
	if err != nil {
		return nil, err
	}

このコードブロックは、resolveInternetAddr関数が返したerr変数をチェックしています。

  • a, err := resolveInternetAddr(afnet, addr, noDeadline): ここでresolveInternetAddr関数が呼び出され、結果として解決されたアドレス(a)とエラー(err)が返されます。
  • if err != nil: もしerrnilでなければ、それはresolveInternetAddrの実行中に何らかのエラーが発生したことを意味します。
  • return nil, err: エラーが発生した場合、ResolveIPAddr関数は*IPAddrの代わりにnilを返し、発生したエラーをそのまま呼び出し元に返します。これにより、ResolveIPAddrの呼び出し元は、アドレス解決が失敗したことを正確に把握し、適切なエラーハンドリングを行うことができるようになります。

この修正により、ResolveIPAddr関数は、内部で発生したエラーを適切に伝播するようになり、関数の信頼性と堅牢性が向上しました。

関連リンク

参考にした情報源リンク