[インデックス 10344] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおけるOpenBSD 386アーキテクチャ向けの定数定義ファイルsrc/pkg/syscall/zerrors_openbsd_386.go
に対する修正です。具体的には、システムコールやioctl
コマンドに関連する定数の値が、誤って負の値として定義されていたものを、正しい符号なしの16進数表現に修正しています。
コミット
commit 791aef1821638824cd135a0d6828bd873c06be6b
Author: Joel Sing <jsing@google.com>
Date: Sat Nov 12 05:19:09 2011 +1100
syscall: fix zerrors for openbsd 386
R=golang-dev, bradfitz, rsc
CC=golang-dev
https://golang.org/cl/5369076
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/791aef1821638824cd135a0d6828bd873c06be6b
元コミット内容
このコミットの元のメッセージは「syscall: fix zerrors for openbsd 386」です。これは、OpenBSDの386アーキテクチャにおけるsyscall
パッケージのzerrors
(ゼロエラー、または生成されたエラー定数)に修正を加えることを示しています。具体的には、定数の値が正しくない、特に符号に関する問題があったことを示唆しています。
変更の背景
Go言語のsyscall
パッケージは、オペレーティングシステム固有のシステムコールや定数への低レベルなアクセスを提供します。これらの定数は、通常、C言語のヘッダーファイルから自動生成されるか、手動で移植されます。zerrors_openbsd_386.go
のようなファイルは、特定のOSとアーキテクチャの組み合わせ(この場合はOpenBSDの386、つまりi386/x86 32-bit)に特化したシステムコール定数を定義しています。
このコミットの背景には、OpenBSD 386環境でGoプログラムがシステムコールを正しく実行できない、または予期せぬエラーが発生するという問題があったと考えられます。特に、ioctl
コマンドやネットワーク関連の定数など、ビットフラグや特定の構造を持つ値が負の数として誤って解釈されていたことが原因です。
C言語では、#define
で定義される定数は通常、符号なし整数として扱われることが多いですが、Go言語の定数定義では、リテラルの表現によっては符号付き整数として解釈される可能性があります。この不一致が、Goのsyscall
パッケージがOpenBSDのネイティブな定数と異なる値を生成してしまう原因となったと考えられます。
前提知識の解説
Go言語のsyscall
パッケージ
Go言語のsyscall
パッケージは、Goプログラムから直接オペレーティングシステムのシステムコールを呼び出すためのインターフェースを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理など、OSレベルの機能にアクセスできます。このパッケージはOSやアーキテクチャに依存する部分が多く、各プラットフォーム向けに異なる実装や定数定義が存在します。
zerrors
ファイル
Goのsyscall
パッケージには、zerrors_*.go
という命名規則のファイルが多数存在します。これらのファイルは、特定のOS(例: linux
、openbsd
)とアーキテクチャ(例: amd64
、386
)の組み合わせに対応するシステムコール番号、エラーコード、ioctl
コマンドなどの定数を定義しています。これらのファイルは、通常、C言語のヘッダーファイルから自動生成ツール(例: go tool cgo -godefs
)によって生成されます。z
は「ゼロ」を意味し、これらのファイルがGoの型システムに合わせた定数定義を提供することを示唆しています。
ioctl
コマンド
ioctl
(Input/Output Control)は、Unix系オペレーティングシステムにおいて、デバイスドライバに対して特殊な操作を行うためのシステムコールです。通常の読み書き操作では表現できない、デバイス固有の制御機能を提供します。ioctl
コマンドは、通常、特定のデバイスや操作を識別するためのユニークな整数値(マジックナンバー)で構成されており、これらの値はOSのヘッダーファイルで定義されています。
符号付き整数と符号なし整数、そして16進数表現
コンピュータにおける数値表現には、符号付き整数(signed integer)と符号なし整数(unsigned integer)があります。
- 符号なし整数: 0以上の値のみを表現し、すべてのビットが数値の大きさを表すために使われます。
- 符号付き整数: 正の値と負の値を表現します。最上位ビット(MSB)が符号ビットとして使われることが多く、2の補数表現が一般的です。
16進数(hexadecimal)は、基数16の数値表現です。0x
プレフィックスで示されます。例えば、0xFF
は10進数で255です。
このコミットで問題となっているのは、C言語のヘッダーファイルで定義されているioctl
コマンドなどの定数が、Goの自動生成プロセスで符号付き整数として解釈され、負の値になってしまったことです。例えば、0xc008427b
のような値は、32ビット符号付き整数として解釈されると、最上位ビットが1であるため負の値になります。しかし、本来はioctl
コマンドとして、そのビットパターン全体が意味を持つ符号なしの値として扱われるべきです。
例えば、32ビットシステムで0xc008427b
という16進数を考えます。
- 符号なし整数としては、
3221799547
という大きな正の数です。 - 符号付き整数(2の補数)としては、
0xc008427b
の2の補数を計算すると、0x3ff7bd85
となり、これに負の符号を付けて-0x3ff7bd85
となります。
このコミットは、Goのsyscall
パッケージがOpenBSDのネイティブな定数を正しく解釈し、符号なしのビットパターンとして扱うように修正したものです。
技術的詳細
このコミットの技術的な核心は、Go言語のsyscall
パッケージがOpenBSD 386アーキテクチャ向けの定数を生成する際に発生していた、符号の解釈ミスを修正することにあります。
OpenBSDのようなUnix系OSでは、ioctl
コマンドやその他のシステムコール関連の定数は、通常、C言語のヘッダーファイル(例: <sys/ioctl.h>
, <sys/socket.h>
など)で#define
プリプロセッサディレクティブを使って定義されています。これらの定数は、多くの場合、ビットフラグや特定の構造を持つ整数値であり、その値自体が意味を持ちます。例えば、ioctl
コマンドは、通常、コマンドの方向(読み取り、書き込み、両方)、データサイズ、コマンド番号などの情報がビットフィールドとしてエンコードされた32ビットまたは64ビットの整数です。
Go言語のsyscall
パッケージのzerrors
ファイルは、これらのC言語の定数をGoのコードに移植するために自動生成されることが多いです。この自動生成プロセスにおいて、C言語のヘッダーファイルから読み取られた16進数リテラルが、Goのコンテキストで符号付き整数として解釈されてしまう問題が発生していました。
具体的には、最上位ビットが1である16進数(例: 0xc008427b
)は、C言語のunsigned int
やunsigned long
では大きな正の数として扱われますが、Goのデフォルトの整数型(int
)や、特定のコンテキストでの解釈によっては、符号付き整数として扱われ、負の値(例: -0x3ff7bd85
)になってしまうことがあります。
このコミットでは、そのような誤って負の値として定義されていた定数を、本来の符号なしの16進数表現に修正しています。これにより、GoプログラムがOpenBSD 386上でシステムコールを呼び出す際に、OSが期待する正しいioctl
コマンド値やその他の定数を使用できるようになります。
例えば、BIOCGDLTLIST
という定数は、変更前は-0x3ff7bd85
でしたが、変更後は0xc008427b
になっています。これは、0xc008427b
が32ビット符号付き整数として解釈された結果が-0x3ff7bd85
になるため、その逆変換を行って正しい符号なしの16進数表現に戻したことを意味します。
この修正は、Goのsyscall
パッケージが提供するOSとのインターフェースの正確性を保証するために非常に重要です。誤った定数を使用すると、システムコールの失敗、予期せぬ動作、セキュリティ上の脆弱性など、様々な問題を引き起こす可能性があります。
コアとなるコードの変更箇所
変更はsrc/pkg/syscall/zerrors_openbsd_386.go
ファイルのみです。このファイル内で、多数のconst
定義における16進数リテラルの値が修正されています。
--- a/src/pkg/syscall/zerrors_openbsd_386.go
+++ b/src/pkg/syscall/zerrors_openbsd_386.go
@@ -49,26 +49,26 @@ const (
BIOCGBLEN = 0x40044266
BIOCGDIRFILT = 0x4004427c
BIOCGDLT = 0x4004426a
- BIOCGDLTLIST = -0x3ff7bd85
+ BIOCGDLTLIST = 0xc008427b
BIOCGETIF = 0x4020426b
BIOCGFILDROP = 0x40044278
BIOCGHDRCMPLT = 0x40044274
BIOCGRSIG = 0x40044273
BIOCGRTIMEOUT = 0x4008426e
BIOCGSTATS = 0x4008426f
- BIOCIMMEDIATE = -0x7ffbbd90
+ BIOCIMMEDIATE = 0x80044270
BIOCLOCK = 0x20004276
BIOCPROMISC = 0x20004269
- BIOCSBLEN = -0x3ffbbd9a
- BIOCSDIRFILT = -0x7ffbbd83
- BIOCSDLT = -0x7ffbbd86
- BIOCSETF = -0x7ff7bd99
- BIOCSETIF = -0x7fdfbd94
- BIOCSETWF = -0x7ff7bd89
- BIOCSFILDROP = -0x7ffbbd87
- BIOCSHDRCMPLT = -0x7ffbbd8b
- BIOCSRSIG = -0x7ffbbd8e
- BIOCSRTIMEOUT = -0x7ff7bd93
+ BIOCSBLEN = 0xc0044266
+ BIOCSDIRFILT = 0x8004427d
+ BIOCSDLT = 0x8004427a
+ BIOCSETF = 0x80084267
+ BIOCSETIF = 0x8020426c
+ BIOCSETWF = 0x80084277
+ BIOCSFILDROP = 0x80044279
+ BIOCSHDRCMPLT = 0x80044275
+ BIOCSRSIG = 0x80044272
+ BIOCSRTIMEOUT = 0x8008426d
BIOCVERSION = 0x40044271
BPF_A = 0x10
BPF_ABS = 0x20
@@ -179,6 +179,10 @@ const (
EEXIST = 0x11
EFAULT = 0xe
EFBIG = 0x1b
+ EFER_LMA = 0x400
+ EFER_LME = 0x100
+ EFER_NXE = 0x800
+ EFER_SCE = 0x1
EFTYPE = 0x4f
EHOSTDOWN = 0x40
EHOSTUNREACH = 0x41
@@ -438,7 +442,7 @@ const (
ETHER_ALIGN = 0x2
ETHER_CRC_LEN = 0x4
ETHER_CRC_POLY_BE = 0x4c11db6
- ETHER_CRC_POLY_LE = -0x12477ce0
+ ETHER_CRC_POLY_LE = 0xedb88320
ETHER_HDR_LEN = 0xe
ETHER_MAX_DIX_LEN = 0x600
ETHER_MAX_LEN = 0x5ee
@@ -732,21 +736,21 @@ const (
IFT_XETHER = 0x1a
IN_CLASSA_HOST = 0xffffff
IN_CLASSA_MAX = 0x80
- IN_CLASSA_NET = -0x1000000
+ IN_CLASSA_NET = 0xff000000
IN_CLASSA_NSHIFT = 0x18
IN_CLASSB_HOST = 0xffff
IN_CLASSB_MAX = 0x10000
- IN_CLASSB_NET = -0x10000
+ IN_CLASSB_NET = 0xffff0000
IN_CLASSB_NSHIFT = 0x10
IN_CLASSC_HOST = 0xff
- IN_CLASSC_NET = -0x100
+ IN_CLASSC_NET = 0xffffff00
IN_CLASSC_NSHIFT = 0x8
IN_CLASSD_HOST = 0xfffffff
- IN_CLASSD_NET = -0x10000000
+ IN_CLASSD_NET = 0xf0000000
IN_CLASSD_NSHIFT = 0x1c
IN_LOOPBACKNET = 0x7f
IN_RFC3021_HOST = 0x1
- IN_RFC3021_NET = -0x2
+ IN_RFC3021_NET = 0xfffffffe
IN_RFC3021_NSHIFT = 0x1f
IPPROTO_AH = 0x33
IPPROTO_CARP = 0x70
@@ -796,8 +800,8 @@ const (
IPV6_ESP_NETWORK_LEVEL = 0x37
IPV6_ESP_TRANS_LEVEL = 0x36
IPV6_FAITH = 0x1d
- IPV6_FLOWINFO_MASK = -0xf1
- IPV6_FLOWLABEL_MASK = -0xf100
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
IPV6_FRAGTTL = 0x78
IPV6_HLIMDEC = 0x1
IPV6_HOPLIMIT = 0x2f
@@ -923,7 +927,6 @@ const (
O_SYNC = 0x80
O_TRUNC = 0x400
O_WRONLY = 0x1
- PT_MASK = 0x3ff000
RTAX_AUTHOR = 0x6
RTAX_BRD = 0x7
RTAX_DST = 0x0
@@ -1038,118 +1041,118 @@ const (
SIGWINCH = 0x1c
SIGXCPU = 0x18
SIGXFSZ = 0x19
- SIOCADDMULTI = -0x7fdf96cf
- SIOCAIFADDR = -0x7fbf96e6
- SIOCAIFGROUP = -0x7fdb9679
- SIOCALIFADDR = -0x7de796e4
+ SIOCADDMULTI = 0x80206931
+ SIOCAIFADDR = 0x8040691a
+ SIOCAIFGROUP = 0x80246987
+ SIOCALIFADDR = 0x8218691c
SIOCATMARK = 0x40047307
- SIOCBRDGADD = -0x7fab96c4
- SIOCBRDGADDS = -0x7fab96bf
- SIOCBRDGARL = -0x7f9196b3
- SIOCBRDGDADDR = -0x7fd796b9
- SIOCBRDGDEL = -0x7fab96c3
- SIOCBRDGDELS = -0x7fab96be
- SIOCBRDGFLUSH = -0x7fab96b8
- SIOCBRDGFRL = -0x7f9196b2
- SIOCBRDGGCACHE = -0x3feb96bf
- SIOCBRDGGGFD = -0x3feb96ae
- SIOCBRDGGHT = -0x3feb96af
- SIOCBRDGGIFFLGS = -0x3fab96c2
- SIOCBRDGGMA = -0x3feb96ad
- SIOCBRDGGPARAM = -0x3fc796a8
- SIOCBRDGGGPRI = -0x3feb96b0
- SIOCBRDGGRL = -0x3fd796b1
- SIOCBRDGGSIFS = -0x3fab96c4
- SIOCBRDGGTO = -0x3feb96ba
- SIOCBRDGIFS = -0x3fab96be
- SIOCBRDGRTS = -0x3fe796bd
- SIOCBRDGSADDR = -0x3fd796bc
- SIOCBRDGSCACHE = -0x7feb96c0
- SIOCBRDGSFD = -0x7feb96ae
- SIOCBRDGSHT = -0x7feb96af
- SIOCBRDGSIFCOST = -0x7fab96ab
- SIOCBRDGSIFFLGS = -0x7fab96c1
- SIOCBRDGSIFPRIO = -0x7fab96ac
- SIOCBRDGSMA = -0x7feb96ad
- SIOCBRDGSPRI = -0x7feb96b0
- SIOCBRDGSPROTO = -0x7feb96a6
- SIOCBRDGSTO = -0x7feb96bb
- SIOCBRDGSTXHC = -0x7feb96a7
- SIOCDELMULTI = -0x7fdf96ce
- SIOCDIFADDR = -0x7fdf96e7
- SIOCDIFGROUP = -0x7fdb9677
- SIOCDIFPHYADDR = -0x7fdf96b7
- SIOCDLIFADDR = -0x7de796e2
- SIOCGETKALIVE = -0x3fe7965c
- SIOCGETLABEL = -0x7fdf9666
- SIOCGETPFLOW = -0x3fdf9602
- SIOCGETPFSYNC = -0x3fdf9608
- SIOCGETSGCNT = -0x3feb8acc
- SIOCGETVIFCNT = -0x3feb8acd
- SIOCGETVLANPRIO = -0x3fdf9670
+ SIOCBRDGADD = 0x8054693c
+ SIOCBRDGADDS = 0x80546941
+ SIOCBRDGARL = 0x806e694d
+ SIOCBRDGDADDR = 0x80286947
+ SIOCBRDGDEL = 0x8054693d
+ SIOCBRDGDELS = 0x80546942
+ SIOCBRDGFLUSH = 0x80546948
+ SIOCBRDGFRL = 0x806e694e
+ SIOCBRDGGCACHE = 0xc0146941
+ SIOCBRDGGFD = 0xc0146952
+ SIOCBRDGGHT = 0xc0146951
+ SIOCBRDGGIFFLGS = 0xc054693e
+ SIOCBRDGGMA = 0xc0146953
+ SIOCBRDGGPARAM = 0xc0386958
+ SIOCBRDGGGPRI = 0xc0146950
+ SIOCBRDGGRL = 0xc028694f
+ SIOCBRDGGSIFS = 0xc054693c
+ SIOCBRDGGTO = 0xc0146946
+ SIOCBRDGIFS = 0xc0546942
+ SIOCBRDGRTS = 0xc0186943
+ SIOCBRDGSADDR = 0xc0286944
+ SIOCBRDGSCACHE = 0x80146940
+ SIOCBRDGSFD = 0x80146952
+ SIOCBRDGSHT = 0x80146951
+ SIOCBRDGSIFCOST = 0x80546955
+ SIOCBRDGSIFFLGS = 0x8054693f
+ SIOCBRDGSIFPRIO = 0x80546954
+ SIOCBRDGSMA = 0x80146953
+ SIOCBRDGSPRI = 0x80146950
+ SIOCBRDGSPROTO = 0x8014695a
+ SIOCBRDGSTO = 0x80146945
+ SIOCBRDGSTXHC = 0x80146959
+ SIOCDELMULTI = 0x80206932
+ SIOCDIFADDR = 0x80206919
+ SIOCDIFGROUP = 0x80246989
+ SIOCDIFPHYADDR = 0x80206949
+ SIOCDLIFADDR = 0x8218691e
+ SIOCGETKALIVE = 0xc01869a4
+ SIOCGETLABEL = 0x8020699a
+ SIOCGETPFLOW = 0xc02069fe
+ SIOCGETPFSYNC = 0xc02069f8
+ SIOCGETSGCNT = 0xc0147534
+ SIOCGETVIFCNT = 0xc0147533
+ SIOCGETVLANPRIO = 0xc0206990
\tSIOCGHIWAT = 0x40047301
- SIOCGIFADDR = -0x3fdf96df
- SIOCGIFASYNCMAP = -0x3fdf9684
- SIOCGIFBRDADDR = -0x3fdf96dd
- SIOCGIFCONF = -0x3ff796dc
- SIOCGIFDATA = -0x3fdf96e5
- SIOCGIFDESCR = -0x3fdf967f
- SIOCGIFDSTADDR = -0x3fdf96de
- SIOCGIFFLAGS = -0x3fdf96ef
- SIOCGIFGATTR = -0x3fdb9675
- SIOCGIFGENERIC = -0x3fdf96c6
- SIOCGIFGMEMB = -0x3fdb9676
- SIOCGIFGROUP = -0x3fdb9678
- SIOCGIFMEDIA = -0x3fd796ca
- SIOCGIFMETRIC = -0x3fdf96e9
- SIOCGIFMTU = -0x3fdf9682
- SIOCGIFNETMASK = -0x3fdf96db
- SIOCGIFPDSTADDR = -0x3fdf96b8
- SIOCGIFPRIORITY = -0x3fdf9664
- SIOCGIFPSRCADDR = -0x3fdf96b9
- SIOCGIFRDOMAIN = -0x3fdf9660
- SIOCGIFRTLABEL = -0x3fdf967d
- SIOCGIFTIMESLOT = -0x3fdf967a
- SIOCGIFXFLAGS = -0x3fdf9662
- SIOCGLIFADDR = -0x3de796e3
- SIOCGLIFPHYADDR = -0x3de796b5
- SIOCGLIFPHYRTABLE = -0x3fdf965e
+ SIOCGIFADDR = 0xc0206921
+ SIOCGIFASYNCMAP = 0xc020697c
+ SIOCGIFBRDADDR = 0xc0206923
+ SIOCGIFCONF = 0xc0086924
+ SIOCGIFDATA = 0xc020691b
+ SIOCGIFDESCR = 0xc0206981
+ SIOCGIFDSTADDR = 0xc0206922
+ SIOCGIFFLAGS = 0xc0206911
+ SIOCGIFGATTR = 0xc024698b
+ SIOCGIFGENERIC = 0xc020693a
+ SIOCGIFGMEMB = 0xc024698a
+ SIOCGIFGROUP = 0xc0246988
+ SIOCGIFMEDIA = 0xc0286936
+ SIOCGIFMETRIC = 0xc0206917
+ SIOCGIFMTU = 0xc020697e
+ SIOCGIFNETMASK = 0xc0206925
+ SIOCGIFPDSTADDR = 0xc0206948
+ SIOCGIFPRIORITY = 0xc020699c
+ SIOCGIFPSRCADDR = 0xc0206947
+ SIOCGIFRDOMAIN = 0xc02069a0
+ SIOCGIFRTLABEL = 0xc0206983
+ SIOCGIFTIMESLOT = 0xc0206986
+ SIOCGIFXFLAGS = 0xc020699e
+ SIOCGLIFADDR = 0xc218691d
+ SIOCGLIFPHYADDR = 0xc218694b
+ SIOCGLIFPHYRTABLE = 0xc02069a2
\tSIOCGLOWAT = 0x40047303
\tSIOCGPGRP = 0x40047309
- SIOCGVH = -0x3fdf960a
- SIOCIFCREATE = -0x7fdf9686
- SIOCIFDESTROY = -0x7fdf9687
- SIOCIFGCLONERS = -0x3ff39688
- SIOCSETKALIVE = -0x7fe7965d
- SIOCSETLABEL = -0x7fdf9667
- SIOCSETPFLOW = -0x7fdf9603
- SIOCSETPFSYNC = -0x7fdf9609
- SIOCSETVLANPRIO = -0x7fdf9671
- SIOCSHIWAT = -0x7ffb8d00
- SIOCSIFADDR = -0x7fdf96f4
- SIOCSIFASYNCMAP = -0x7fdf9683
- SIOCSIFBRDADDR = -0x7fdf96ed
- SIOCSIFDESCR = -0x7fdf9680
- SIOCSIFDSTADDR = -0x7fdf96f2
- SIOCSIFFLAGS = -0x7fdf96f0
- SIOCSIFGATTR = -0x7fdb9674
- SIOCSIFGENERIC = -0x7fdf96c7
- SIOCSIFLLADDR = -0x7fdf96e1
- SIOCSIFMEDIA = -0x3fdf96cb
- SIOCSIFMETRIC = -0x7fdf96e8
- SIOCSIFMTU = -0x7fdf9681
- SIOCSIFNETMASK = -0x7fdf96ea
- SIOCSIFPHYADDR = -0x7fbf96ba
- SIOCSIFPRIORITY = -0x7fdf9665
- SIOCSIFRDOMAIN = -0x7fdf9661
- SIOCSIFRTLABEL = -0x7fdf967e
- SIOCSIFTIMESLOT = -0x7fdf967b
- SIOCSIFXFLAGS = -0x7fdf9663
- SIOCSLIFPHYADDR = -0x7de796b6
- SIOCSLIFPHYRTABLE = -0x7fdf965f
- SIOCSLOWAT = -0x7ffb8cfe
- SIOCSPGRP = -0x7ffb8cf8
- SIOCSVH = -0x3fdf960b
+ SIOCGVH = 0xc02069f6
+ SIOCIFCREATE = 0x8020697a
+ SIOCIFDESTROY = 0x80206979
+ SIOCIFGCLONERS = 0xc00c6978
+ SIOCSETKALIVE = 0x801869a3
+ SIOCSETLABEL = 0x80206999
+ SIOCSETPFLOW = 0x802069fd
+ SIOCSETPFSYNC = 0x802069f7
+ SIOCSETVLANPRIO = 0x8020698f
+ SIOCSHIWAT = 0x80047300
+ SIOCSIFADDR = 0x8020690c
+ SIOCSIFASYNCMAP = 0x8020697d
+ SIOCSIFBRDADDR = 0x80206913
+ SIOCSIFDESCR = 0x80206980
+ SIOCSIFDSTADDR = 0x8020690e
+ SIOCSIFFLAGS = 0x80206910
+ SIOCSIFGATTR = 0x8024698c
+ SIOCSIFGENERIC = 0x80206939
+ SIOCSIFLLADDR = 0x8020691f
+ SIOCSIFMEDIA = 0xc0206935
+ SIOCSIFMETRIC = 0x80206918
+ SIOCSIFMTU = 0x8020697f
+ SIOCSIFNETMASK = 0x80206916
+ SIOCSIFPHYADDR = 0x80406946
+ SIOCSIFPRIORITY = 0x8020699b
+ SIOCSIFRDOMAIN = 0x8020699f
+ SIOCSIFRTLABEL = 0x80206982
+ SIOCSIFTIMESLOT = 0x80206985
+ SIOCSIFXFLAGS = 0x8020699d
+ SIOCSLIFPHYADDR = 0x8218694a
+ SIOCSLIFPHYRTABLE = 0x802069a1
+ SIOCSLOWAT = 0x80047302
+ SIOCSPGRP = 0x80047308
+ SIOCSVH = 0xc02069f5
\tSOCK_DGRAM = 0x2
\tSOCK_RAW = 0x3
\tSOCK_RDM = 0x4
@@ -1194,28 +1197,28 @@ const (
TCP_SACK_ENABLE = 0x8
TIOCCBRK = 0x2000747a
TIOCCDTR = 0x20007478
- TIOCCONS = -0x7ffb8b9e
+ TIOCCONS = 0x80047462
TIOCDRAIN = 0x2000745e
TIOCEXCL = 0x2000740d
- TIOCEXT = -0x7ffb8ba0
+ TIOCEXT = 0x80047460
TIOCFLAG_CLOCAL = 0x2
TIOCFLAG_CRTSCTS = 0x4
TIOCFLAG_MDMBUF = 0x8
TIOCFLAG_PPS = 0x10
TIOCFLAG_SOFTCAR = 0x1
- TIOCFLUSH = -0x7ffb8bf0
+ TIOCFLUSH = 0x80047410
TIOCGETA = 0x402c7413
TIOCGETD = 0x4004741a
TIOCGFLAGS = 0x4004745d
TIOCGPGRP = 0x40047477
TIOCGTSTAMP = 0x4008745b
TIOCGWINSZ = 0x40087468
- TIOCMBIC = -0x7ffb8b95
- TIOCMBIS = -0x7ffb8b94
+ TIOCMBIC = 0x8004746b
+ TIOCMBIS = 0x8004746c
TIOCMGET = 0x4004746a
TIOCMODG = 0x4004746a
- TIOCMODS = -0x7ffb8b93
- TIOCMSET = -0x7ffb8b93
+ TIOCMODS = 0x8004746d
+ TIOCMSET = 0x8004746d
TIOCM_CAR = 0x40
TIOCM_CD = 0x40
TIOCM_CTS = 0x20
@@ -1230,7 +1233,7 @@ const (
TIOCNOTTY = 0x20007471
TIOCNXCL = 0x2000740e
TIOCOUTQ = 0x40047473
- TIOCPKT = -0x7ffb8b90
+ TIOCPKT = 0x80047470
TIOCPKT_DATA = 0x0
TIOCPKT_DOSTOP = 0x20
TIOCPKT_FLUSHREAD = 0x1
@@ -1239,24 +1242,24 @@ const (
TIOCPKT_NOSTOP = 0x10
TIOCPKT_START = 0x8
TIOCPKT_STOP = 0x4
- TIOCREMOTE = -0x7ffb8b97
+ TIOCREMOTE = 0x80047469
TIOCSBRK = 0x2000747b
TIOCSCTTY = 0x20007461
TIOCSDTR = 0x20007479
- TIOCSETA = -0x7fd38bec
- TIOCSETAF = -0x7fd38bea
- TIOCSETAW = -0x7fd38beb
- TIOCSETD = -0x7ffb8be5
- TIOCSFLAGS = -0x7ffb8ba4
- TIOCSIG = -0x7ffb8ba1
- TIOCSPGRP = -0x7ffb8b8a
+ TIOCSETA = 0x802c7414
+ TIOCSETAF = 0x802c7416
+ TIOCSETAW = 0x802c7415
+ TIOCSETD = 0x8004741b
+ TIOCSFLAGS = 0x8004745c
+ TIOCSIG = 0x8004745f
+ TIOCSPGRP = 0x80047476
TIOCSTART = 0x2000746e
- TIOCSTAT = -0x7ffb8b9b
- TIOCSTI = -0x7ffe8b8e
+ TIOCSTAT = 0x80047465
+ TIOCSTI = 0x80017472
TIOCSTOP = 0x2000746f
- TIOCSTSTAMP = -0x7ff78ba6
- TIOCSWINSZ = -0x7ff78b99
- TIOCUCNTL = -0x7ffb8b9a
+ TIOCSTSTAMP = 0x8008745a
+ TIOCSWINSZ = 0x80087467
+ TIOCUCNTL = 0x80047466
\tWALTSIG = 0x4
\tWCONTINUED = 0x8
\tWCOREFLAG = 0x80
コアとなるコードの解説
このコミットのコード変更は、const
キーワードで定義されたGoの定数リテラルの値を修正することに集約されます。具体的には、負の16進数表現(例: -0x3ff7bd85
)を、対応する正の16進数表現(例: 0xc008427b
)に置き換えています。
この修正の背後にある原理は、2の補数表現と、Go言語における整数リテラルの型推論にあります。
-
2の補数表現: 多くのシステムでは、負の整数は2の補数で表現されます。例えば、32ビットシステムで
-1
は0xFFFFFFFF
として表現されます。同様に、ある正の数X
の負の表現-X
は、X
のビットを反転させて1を加えることで得られます。このコミットで修正されている値は、まさにこの2の補数表現の逆変換に相当します。例えば、0xc008427b
は、32ビット符号付き整数として解釈されると、その2の補数表現が0x3ff7bd85
となり、負の符号を付けて-0x3ff7bd85
となります。このコミットは、この逆の操作を行い、本来の符号なしのビットパターンに戻しています。 -
Go言語の整数リテラル: Go言語では、数値リテラルはデフォルトでその値が収まる最小の型に推論されます。しかし、16進数リテラルが
0x
で始まり、その値が符号付き整数の範囲を超えたり、最上位ビットが1である場合に、Goのコンパイラがどのように型を推論し、値を解釈するかが重要になります。このケースでは、自動生成されたコードが、C言語のunsigned int
やunsigned long
として意図された値を、Goのint
型(通常は32ビットまたは64ビットの符号付き整数)として解釈してしまい、結果として負の値になっていたと考えられます。
この修正により、Goのsyscall
パッケージは、OpenBSD 386環境で期待される正確なビットパターンを持つ定数を使用できるようになります。これにより、ioctl
システムコールなどの低レベルな操作が、OSの期待通りに機能し、Goプログラムの安定性と互換性が向上します。
例えば、BIOCGDLTLIST
は、Berkeley Packet Filter (BPF) のioctl
コマンドの一つで、データリンクタイプ(DLT)のリストを取得するために使用されます。このコマンドの正確な値は、OSのカーネルが期待する特定のビットパターンを持つ必要があります。誤った値を使用すると、ioctl
呼び出しが失敗したり、不正なメモリアクセスを引き起こしたりする可能性があります。この修正は、このような潜在的な問題を解消し、GoプログラムがOpenBSD上でネットワークインターフェースやパケットキャプチャなどの機能を正しく利用できるようにします。
関連リンク
- Go言語の
syscall
パッケージのドキュメント: https://pkg.go.dev/syscall - OpenBSDの
ioctl
マニュアルページ (例:man 2 ioctl
on OpenBSD system) - Go言語の
go tool cgo
に関するドキュメント (Goのソースコードリポジトリ内)
参考にした情報源リンク
- Go言語の公式ドキュメント
- OpenBSDのシステムプログラミングに関するドキュメント
- 2の補数表現に関する一般的なコンピュータサイエンスの知識
- Go言語の
syscall
パッケージのソースコード - Go言語の
go tool cgo
の動作に関する情報 - GitHubのコミット履歴と関連する議論 (GoのChange-ID
5369076
を含む)- https://go.dev/cl/5369076 (GoのGerritレビューシステムへのリンク)
- このGerritリンクから、このコミットがGoの公式リポジトリにマージされる前のレビュープロセスや議論を追跡できます。
- 特に、レビューコメントには、なぜこれらの値が負になっていたのか、そしてどのように修正されたのかについての詳細な情報が含まれている可能性があります。
- 例えば、
zerrors
ファイルがどのように生成されるか、そしてその生成プロセスにおける特定のOS/アーキテクチャでの問題点などが議論されているかもしれません。 - この特定の変更リスト(CL)のタイトルは "syscall: fix zerrors for openbsd 386" であり、コミットメッセージと一致しています。
- レビュー担当者(R=)として
bradfitz
とrsc
が挙げられており、彼らはGoプロジェクトの主要な貢献者であるため、この修正の重要性が伺えます。 - このCLの変更内容を見ると、まさに
zerrors_openbsd_386.go
ファイル内の定数値が修正されていることが確認できます。 - このCLのレビューコメントには、
ioctl
コマンドのエンコーディングに関する詳細や、Goのgo tool cgo -godefs
がどのようにこれらの値を生成するかについての議論が含まれている可能性があります。 - 特に、
_IO
,_IOR
,_IOW
,_IOWR
といったioctl
コマンドを構成するマクロが、C言語のヘッダーファイルでどのように定義され、それがGoの定数にどのように変換されるか、という点が議論の焦点となることが多いです。これらのマクロは、コマンドの方向(読み取り/書き込み)やデータサイズをエンコードするためにビットシフトやビット演算を使用します。その結果生成される値が、符号付き整数として解釈されると負になる、という問題が発生したと考えられます。
この詳細な解説は、コミットの技術的な側面を深く理解するために、Go言語の内部構造、OSのシステムコール、そして数値表現に関する知識を統合しています。