やつは突然やってきた
sshで適当なサーバーにつなげようとコマンドたたいたら出てきた恐怖アラート、当然ssh接続できるわけなく戦慄しました。
これはなんのメッセージ?
実はこんな感じのエラーはgcc関連で一度お目にかかってるのでDLLファイルの依存関係なんだろうなっていう予想は立ちました。 BN_set_flags っていう名前のオブジェクトが見つからないよっていう話なんだろうなって、ただそいつはどのファイルにあるのって話
思い当たる節が
事件の朝、起きてPCの画面を見たらロック画面。当時の私は「またWindowsUpdateか」って思いましたが、まさかこのような事態になるとは
とりあえずぐぐる
ここにありました、で戻るとcryptoなるプロジェクト名?ファイル名?で作成されてるところまでわかるのでおそらく慣例で"libcrypto.dll"とか"crypto.dll"って感じのファイル名なんだろうなって予想はつきます。
あとは探してなかったらダウンロードするだけの簡単な話、だったのですが
あるやんけ
同じディレクトリ上にあって草
いやこいつ偽物なのか?って思ってデコンパイルとかして中身調べようとしたのですが、あまりにもめんどくさいので却下。別の方法をとってみることにしました
OpenSSH再インストール
とりあえず最初にやるべきことだった。Windows標準の設定から行いましたが効果なし
whereコマンドでdllファイルを探す
もしかしたら同じディレクトリにあるdllではなく別のdllを参照してるのではないかと疑ってwhereコマンドで調べてみました。
やはりか、って当時の私は某探偵アニメの毛利小●郎みたいに推理を決めたのでした。そしてこの問題を解決するために環境パスの優先順位をいじりましたが
変わらず...
更新日時
実は答えにつながる決定的なヒントは隠した私なのですが、ここで当時の私はとあることに気づきます。
C:\Windows\System32
うん?
C:\Windows\System32\OpenSSH
System32配下にあるファイルの方が新しい...?
そして新しい方の日付がWindowsUpdateを行ったとおぼしき日時と合致してるような
DLLの優先順位
DLLファイルの読み込みには当然優先順位があります。
そして開発で自作したDLLファイルをどうするかを考えれば当たり前のことなのですが最初に読み込まれるのは実行アプリケーションと同じディレクトリにあるDLLファイルです。つまり環境変数いじるパートは全くの無意味な上に見当違いだったわけですね。
解決策
System32配下のdllファイルも読み込み対象なので問題ないと判断したからです。
やった、治った
残る疑問
やはりWindowsUpdateでシステムファイルが書き換わったのが原因であるのは間違いないようですが、問題は再インストールしたOpenSSHの更新日時が2021となんかめちゃくちゃ古い点
こういうのが最近あったばかりなのでWindowsUpdate経由で更新されるはずなのですがされてないのは非常に謎
と記事を書く前は思ってたのですが、記事を書きながらOpenSSHフォルダを見返したらexeは全部10/9だったんですよね。
これ、私のせいか?