カテゴリー
技術

DockerとRazer Synapse 3、全く関係のない2つのアプリケーションの一方しか起動できないバグの秘密

Docker for Windows を動かしていると Razer Synapse 3 が起動しなくなり、Razer Synapse 3 を動かしていると Docker for Windows を起動できない、という現象が発生していたそうです。

Docker for Windows は Docker社公式の Windows Pro 用 Docker環境、Razer Synapse 3 はRazer 社のゲーミングマウスの設定ツールです。接点の無さそうなこの二つのアプリがなぜ?

この不思議な現象の原因を見つけた@Foone さんのツイートがこちら。

Docker for Windows も、Razer Synapse 3 ツールも、それぞれが同時に一つしか「自分の」プロセスが動かないように制御していました。自分の GUID を名前としたグローバルな Mutex を作ることで、2つ目の起動がされないようにするというものです。

しかし、二つのアプリケーションの両方ともが、自アプリのGUIDではなく、.NET (の一部)のアセンブリ情報を参照してしまっていました。そのため、二つのアプリケーションは同じ名前の Mutex を参照することとなり、一方が起動中にはもう一方が起動できなくなっていたのです。

@Foone さんはさらに、StackOverflow の回答が原因なのではないかと推理を続けます。

「.NET 2.0 でGUIDを取得する方法は?」という質問に対して回答され、質問者によって「ベストアンサー」に選ばれた2009年の回答のコード


string.Format("Global\{0}", (object) Assembly.GetExecutingAssembly().GetType().GUID);

これが、「自プロセスのGUIDを取得するつもりで.NET(の一部)のGUIDを取得する」処理だったのです。

質問の12分後に書かれたこの回答、ベストアンサーとされてから1年以上そのまま信じられ、回答が間違っているという指摘をする人も現れているのですが、ベストアンサーとして受け入れられている回答を消すことは仕組み上できず、どこからか気づいた元回答者が戻ってきて間違った回答の内容を編集するまで3年間、さらにそこにベストアンサーとして載り続けていたということ。

この間に、二つのアプリケーションの開発者が、重複起動をさせないための方法を検索し、このベストアンサーを見つけて、実装したのではないか、と。

偶然同じ間違った結果に別のアプローチから達した可能性もゼロではないでしょうけど、まあ上の推測が合ってそうな気がします。

Docker for Windows が修正されたのは2018年5月ということ。Razer の方は、今回の@Foone さんのツイートがバズったためバグについて知ることとなった CEO が、修正を約束したようです。

もしかしたら、第3、第4の同時に起動できないWindows アプリケーションも存在するのかもしれません。

たしかにテストするのが面倒そうな処理ではありますが、質問サイトの回答をコピペして良しとすることの問題が現れた事例ですね。

via Hacker News