Not only is the Internet dead, it's starting to smell really bad.:2021年05月16日分

2021/05/16(Sun)

[オレオレN6] わからない俺は雰囲気でregex(3)のコードを弄っている

ここ数日はnviのwide string regexの修正どうすんべと思案しておって、その関係でN HEADのregex(3)のコードも眺めたのだが、Fの通常運転なドイヒーなクオリティのコードをちゃんと修正した上でNにマージしてる滝川先生への尊敬度がダダ上がりしてるところ。

というのもFのHenry Spencer's regexは Boyer-Moore法による高速化が独自に追加されてるのだけど、size_tを使うべきとこをint使ってるせいでオーバーフローによるDoS成立しそうだなぁとか、何か所かメモリリーク起こしとるなぁと思いながらマージ作業してたのだが、ちゃんとNはそいつら全部潰してあったゾ。 単純にパクってくるのでなくコード読み込んだ上でマージしてるのね。

あとF独自のcollation API使ってるとこも標準関数のstrcoll/wcscoll使って再実装してあったりいい仕事してますね。

なおワイはボイヤー・ムーア法といわれても 大洋ホエールズのレジェンド助っ人泣きのスーパーギタリストおじさんしか思い浮かばんので以下略、というか5月上旬で自力優勝消滅って大洋ホエールズファンのワイでも記憶ねえぞ…

そもそも滝川先生って誰だよ!って話なんだが、NのFounderであるChristos Zoulas氏の事ね、ワイはクリストスとクリステルの違いももはやわかりません。

ただメモリ管理のsize_t overflow対策はcalloc(3)使えば安心みたいなコードが一部残ってるのだよな、OpenBSDのreallocarray(3)と違って0サイズのアロケーションは未定義動作なんだぜあれ。 なのでOではmalloc/calloc/reallocは使わずにすべてreallocarray(3)使うように徹底してるのだけど。

他にもFのコードで大幅にリファクタリングされて差分の大きすぎるパースロジック周りのコード監査は諦めたのかそのままつっこんでて、かつて このcommitで入ったイービルなレギュラーエクスプレッションをイートさせてトゥーディープなリカーションでスタックをイグゾーストしてサービスをデナイアルする攻撃の対策が消し飛んでるっぽいんだが大丈夫ですかねこれ。

コード差分ぱっとみた限りでは((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((以下ryみたいにブラケットを大量に流し込むとアカンぽいけど。 まぁ再現コードが無いので実際に攻撃可能かは知らん。

まぁそもそもFだけでなくOもこの対応はしてないのがな、まぁあっちの人だと同時に入ったスタックでなくヒープイグゾースト対策のひっどいマクロ

#define MEMLIMIT        0x8000000
#define MEMSIZE(p) \
        ((p)->ncsalloc / CHAR_BIT * (p)->g->csetsize + \
        (p)->ncsalloc * sizeof(cset) + \
        (p)->ssize * sizeof(sop))

の部分だけみてこいつら逆にsize_t overflowバグ埋め込んでんじゃねえかとブチ切れて無視した可能性はある。

あとはスタックより先にヒープの方が尽きてそっちの対策が先に発動すりゃ問題は起きないからそこらはしっかり対策してるから気づかない可能性とかかねぇ、わからない俺は雰囲気でregex(3)のコードを弄っている。

[SCM/BTS] BitBucket緊急メンテ

なんかタイトル書いたら南スーダン久美子緊急事態のユニセフ広告が脳内にフラッシュバックしたがどうでもいい。。

前も書いたけど、ここ一か月以上Bitbucketがクソ重い状態が続いてたのでさすがにメンテ対応がはいったもよう。

$ git push

###############################################################################################

   We're performing maintenance.  Please try again in a few moments,
   or follow our progress at https://bitbucket.status.atlassian.com/incidents/5q0zhsqk5dxm

###############################################################################################

ブラウザからチェンジセットの差分が何度リトライしても表示されない状態が続いてたので、さすがに他社に逃げようかと思ってたのだが、改善すればいいね。

しかしGitHub以外ってーとクローンのGitLabくらいしかないので選択肢が無いのだよな、なおSourceForgeは論値。

[オレオレN6] nvi-1.81/nvi2のPOSIX character classが壊れてる原因判明

しょーもないバグを発見してゲラゲラ笑っている。

diff --git a/dist/nvi/regex/regcomp.c b/dist/nvi/regex/regcomp.c
index f5a87157d5..e0a736fb58 100644
--- a/dist/nvi/regex/regcomp.c
+++ b/dist/nvi/regex/regcomp.c
@@ -821,7 +821,7 @@ p_b_cclass(struct parse *p, cset *cs)
 		NEXT();
 	len = p->next - sp;
 	for (cp = cclasses; cp->name != NULL; cp++)
-		if (STRLEN(cp->name) == len && MEMCMP(cp->name, sp, len))
+		if (STRLEN(cp->name) == len && MEMCMP(cp->name, sp, len) == 0)
 			break;
 	if (cp->name == NULL) {
 		/* oops, didn't find it */
@@ -946,7 +946,7 @@ p_b_coll_elem(struct parse *p,
 	}
 	len = p->next - sp;
 	for (cp = cnames; cp->name != NULL; cp++)
-		if (STRLEN(cp->name) == len && MEMCMP(cp->name, sp, len))
+		if (STRLEN(cp->name) == len && MEMCMP(cp->name, sp, len) == 0)
			return(cp->code);	/* known name */
	if (len == 1)
		return(*sp);	/* single character */

そりゃPOSIX character class指定したらなんでもかんでもリストの先頭にあるalnumにマッチしますわ。

この現象、cset構造体がそもそもCHAR_MIN~CHAR_MAXしか受け付けない問題や、あちこちでwchar_tがcharにnallowされてる箇所が残ってる問題では説明つかないからメモリ破壊疑ってずっと関係ないとこ読み進めてて、えらい遠回りしてしまったわ。

さすがに俺の仕込んだバグじゃないからね、nvi-1.81のオリジナルの作者が仕込んだやつなので aymeric@がNにimportした時から存在するバグである。

ちなみにN HEADのnviのソースも見たけどもちろん直って無いので誰もnviなんか使っていないのである。 あ、そもそもlogin:出たら満足して電源切るんだっけ…

あとはcset構造体をワイド文字対応する作業進めるかね…まったくやる気起きねぇというかHenry Spencer's regexの古臭いマクロまみれのコード読んでるとSAN値が削られるのだ。