カテゴリー
バグ

And. を5回続けて書くと Google Docs が落ちるバグが見つかる

Google Docs の公式サポートフォーラムで、不思議で面白い(中の人にとってはたいへんかもしれません)バグが報告されています。

“And. “を5回続けて書くことで、Google Docs で編集中のページがクラッシュしてしまうというのです。

Google Docs サポートフォーラムより、再現されたエラーのスクリーンショット

Chrome, Firefox で再現したというコメントがあるので自分も試してみたのですが、どうしても再現しません。今朝4時頃(日本時間で)のレポートに対して6時頃には Google の人が確認し修正中だと回答しているので、もう直っているのか、何か条件が違うのか。Google アカウントの言語は英語にして試しているのですが。

より詳細な再現手順は、”And. And. And. And. And.”と書き、改行してからページのリロード、ということ。”and. ” と A を小文字にしてはダメで、ピリオドの後にはスペースを入れないといけないそう。

また、”But. “5回でも起こるそうですが、だからといって大文字で始まるどんな英単語でも起こるというわけではないということ。

Hacker Newsのコメントでは、Also, Therefore, And, Anyway, But, Who, Why, Besides, However などの英単語を使っても再現したそう。

特定の英単語でしか発生しないことから、英語に関する機能、つまりスペルチェッカ―が原因ではないか、という話が出てきています。実際、And. And. を打った時点でスペルチェックの青波線が出ていますね。メニューから Tools の Grammar suggestion をオフにするとクラッシュしなくなるという話も。(自分で再現できていないのでもどかしいです。)

via Hacker News

カテゴリー
バグ

Apple製品でだけ違う表示にできる PNG ファイル

PNG Parser Differential では、Apple のデバイスでだけ異なって表示される不思議な PNG ファイルが公開されています。

Windows + Chrome で見た同ページ

iPad + Safari で見た全く同じページ (Chrome でも同じ)

PNG の表示結果がまったく違い、”Hello World” が “Hello Apple” になっています。不思議ですね。

デビット・ブキャナン氏(David Buchanan)は、マルチスレッド対応のPNGデコーダを自作しようとしている時に、自分が作りこんだバグに気づいたということ。それは、一つのPNGファイルを分割してそれぞれを個別にzlibでデコードしたものを単純に結合しても、必ずしも元の画像に戻らないことに起因するバグだでした。リンク先には PoC のコードがあります。

もし分割の前半部分が非圧縮ブロックの途中であった場合に、単純結合では本来の画像が復元されないという問題が起こるそうなのですが、そうすると PNG を小分けにしてデコードしようとしない限りこのバグを作りこむことはなさそうです。

そして、この問題をさらに調べたブキャナン氏は Apple のデコーダーにも同じバグがあるらしいと気づいたわけですね。Apple のデコーダはマルチスレッドで PNG データを分割デコードしているようです。おそらくパフォーマンスを稼ぐため。そこには iDOT というApple 独自のチャンクタイプも絡んでくるらしいのですが、とにかく、前記のような条件を満たす PNG を人工的に作ることで、Apple デバイス上のレンダリングでは違う解釈をさせることができるというのが、冒頭の不思議な PNG ファイルというわけです。

そのうち修正されるのだろうとは思いますが、これまでもバグを指摘していた人たちはいるようです。このバグをわざと使って何かする人とかでてきますかね。

via Hacker News

カテゴリー
技術

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