ハイパー日記システムを手動で修正してみた

www.h14m.org

jcode.plのdefinedを修正する

修正は簡単で、”unless defined %” → “if !%” に書き換えるだけ。

cgiのdefinedを修正する

  • Apacheのerror logを眺めながら該当箇所を修正する。単純にdefinedを削除するだけでも大丈夫だけど、jcode.plと同じ方法でif !%に変更してみました。実際にやってると該当箇所は意外と少なかった。cgiというより、モジュール側なのですね。
<Command.pm>:438:    unless (defined %DB){
<Command.pm>:531:    unless (defined %DB) {
<Command.pm>:594:    unless (defined %DB){
<Command.pm>:811:    unless (defined %DB) {                             # if first use
<Diary.pm>:413:            unless (defined %GRP_DB){
<Diary.pm>:450:	    unless (defined %GRP_DB){
<HNS.pm>:129:    unless (defined %GRP_DB) {
<Title.pm>:495:	unless (defined %GRP_DB) {
<Title.pm>:559:    unless (defined %RLINK_DB){

diary/japaneseをdiary/lib/japaneseにコピーする

  • これは@INCでカレントディレクトリを読み込まなくなった仕様変更の影響ですね。暫定的な対策としては、全てのCGIスクリプトの先頭にpush(@INC,'./');を追加するか、libフォルダの配下にコピーするのが手っ取り早い。ひとまず後者で動いているようなのでよしとします。

Strawberry Perl 5.32.1で動いた!

  • Strawberry Perl 5.14とか5.20で強引に動かそうとして、一見うまく動いていたように見えたのは一時的にASLRを無効にしていたおかげだったというオチだったのは勘弁して欲しい。
  • ASLRは有効にするのが正しいので、この状態で付き合っていけるようにすべきであります。
  • これで長年の懸念が解決したと思うので、安心して日記を更新していきましょう!

パッチを作ってみる

$ diff -ur ./diary.original/lib/ ./diary/lib/ > hns.diff
  • 初めてやってみたけどこれでいいのかな?スクリプト内部のバージョン表記が古いままだったりしてどのバージョンか分からなかったけど、実際のCGI画面を見ると「hns - 日記自動生成システム - Version 2.19.9」となっているから、公開されている2.19.9と対応させれば大丈夫であろう。
diff -ur ./diary.original/lib/HNS/Diary.pm ./diary/lib/HNS/Diary.pm
--- ./diary.original/lib/HNS/Diary.pm	2005-01-06 07:44:59.000000000 +0900
+++ ./diary/lib/HNS/Diary.pm	2023-06-20 08:44:30.591723400 +0900
@@ -410,7 +410,8 @@
             $section[$HNS::Diary::section] =~ 
 		s/^<!-- xhnf_grp (.*) -->$/<!-- xhnf_grp_p -->/m;
             my @grp = split (" ", $1);
-            unless (defined %GRP_DB){
+#           unless (defined %GRP_DB){
+            if (!%GRP_DB){
                 tie %GRP_DB, 'SimpleDB::Hash',
                 "$HNS::System::DiaryDir/conf/group.txt", 1;
             }
@@ -447,7 +448,8 @@
 	    $tmp =~ s/^<!-- xhnf_grp (.*) -->$/<!-- xhnf_grp_p -->/m;
 	    my @grp = split (" ", $1);
 #print "grp: @grp<br>\n";
-	    unless (defined %GRP_DB){
+#	    unless (defined %GRP_DB){
+	    if (!%GRP_DB){
 		tie %GRP_DB, 'SimpleDB::Hash',
 		    "$HNS::System::DiaryDir/conf/group.txt", 1;
 	    }
diff -ur ./diary.original/lib/HNS/Hnf/Command.pm ./diary/lib/HNS/Hnf/Command.pm
--- ./diary.original/lib/HNS/Hnf/Command.pm	2005-10-04 19:14:38.000000000 +0900
+++ ./diary/lib/HNS/Hnf/Command.pm	2023-06-20 08:31:12.209426100 +0900
@@ -435,7 +435,8 @@
 {
     my ($self, $start, $params) = @_;
 
-    unless (defined %DB){
+#   unless (defined %DB){
+    if (!%DB){
 	tie %DB, 'SimpleDB::Hash',
 	"$HNS::System::DiaryDir/conf/rlink.txt", 1;
     }
@@ -528,7 +529,8 @@
 {
     my ($self, $start, $params) = @_;
 
-    unless (defined %DB) {
+#   unless (defined %DB) {
+    if (!%DB) {
 	tie %DB, 'SimpleDB::Hash',
 	"$HNS::System::DiaryDir/conf/rlink.txt", 1;
     }
@@ -591,7 +593,8 @@
 {
     my ($self, $start, $params) = @_;
 
-    unless (defined %DB){
+#   unless (defined %DB){
+    if (!%DB){
 	tie %DB, 'SimpleDB::Hash',
 	"$HNS::System::DiaryDir/conf/rlink.txt", 1;
     }
@@ -808,7 +811,8 @@
 {
     my ($self, $start, $params) = @_;
     my $term = $self->{arg_content};
-    unless (defined %DB) {                             # if first use
+#   unless (defined %DB) {                             # if first use
+    if (!%DB) {                                    # if first use
 	tie %DB, 'SimpleDB::Hash',                     # then tie hash
 	"$HNS::System::DiaryDir/conf/alias.txt", 1;
     }
diff -ur ./diary.original/lib/HNS/Tools/Title.pm ./diary/lib/HNS/Tools/Title.pm
--- ./diary.original/lib/HNS/Tools/Title.pm	2003-05-28 13:52:58.000000000 +0900
+++ ./diary/lib/HNS/Tools/Title.pm	2023-06-20 08:46:21.177956100 +0900
@@ -163,7 +163,8 @@
 
     $self->mode('recent');
 
-    if (defined(@Selected)) { # ?2001, ?200105, ?2001050, ?200105a
+#   if (defined(@Selected)) { # ?2001, ?200105, ?2001050, ?200105a
+    if ((@Selected)) { # ?2001, ?200105, ?2001050, ?200105a
 	$self->mode(undef);
 
 	foreach my $selected (@Selected) {
@@ -460,7 +461,8 @@
 	}
     }
 
-    if (defined(%selected_cat)) {
+#   if (defined(%selected_cat)) {
+    if ((%selected_cat)) {
 	tie %CAT_DB, 'SimpleDB::Hash', "$HNS::CategoryList::CatDir/cat.txt";
 	foreach my $cat (keys(%selected_cat)) {
 	    # fix Cross Site Scripting bug
@@ -492,7 +494,8 @@
     my ($self, $content) = @_;
 
     if ($content =~ /^<!-- GRP:(.*) -->/) {
-	unless (defined %GRP_DB) {
+#	unless (defined %GRP_DB) {
+	if (!%GRP_DB) {
 	    tie %GRP_DB, 'SimpleDB::Hash',
 	      "$HNS::System::DiaryDir/conf/group.txt", 1;
 	}
@@ -556,7 +559,8 @@
     my $self = shift;
     my ($rlink, $add, $cmd_arg) = split(' ', shift, 3);
 
-    unless (defined %RLINK_DB){
+#   unless (defined %RLINK_DB){
+    if (!%RLINK_DB){
 	tie %RLINK_DB, 'SimpleDB::Hash',
 	  "$HNS::System::DiaryDir/conf/rlink.txt", 1;
     }
diff -ur ./diary.original/lib/HNS.pm ./diary/lib/HNS.pm
--- ./diary.original/lib/HNS.pm	2006-11-05 10:04:32.000000000 +0900
+++ ./diary/lib/HNS.pm	2023-06-20 08:45:07.391325600 +0900
@@ -126,7 +126,8 @@
     }
     ################################################################
     # if group member comes, set no-cache header
-    unless (defined %GRP_DB) {
+#   unless (defined %GRP_DB) {
+    if (!%GRP_DB) {
         tie %GRP_DB, 'SimpleDB::Hash',
         "$HNS::System::DiaryDir/conf/group.txt", 1;
     }
diff -ur ./diary.original/lib/ObjectTemplate.pm ./diary/lib/ObjectTemplate.pm
--- ./diary.original/lib/ObjectTemplate.pm	1999-04-12 15:21:30.000000000 +0900
+++ ./diary/lib/ObjectTemplate.pm	2023-06-19 23:36:03.327564000 +0900
@@ -65,7 +65,8 @@
     my $pkg = shift;
     $pkg = ref($pkg) if ref($pkg);
     my @result = @{"${pkg}::_ATTRIBUTES_"};
-    if (defined (@{"${pkg}::ISA"})) {
+#   if (defined (@{"${pkg}::ISA"})) {
+    if (@{"${pkg}::ISA"}) {
         foreach my $base_pkg (@{"${pkg}::ISA"}) {
            push (@result, get_attribute_names($base_pkg));
         }
Only in ./diary/lib/: japanese
diff -ur ./diary.original/lib/jcode.pl ./diary/lib/jcode.pl
--- ./diary.original/lib/jcode.pl	2000-10-14 21:30:30.000000000 +0900
+++ ./diary/lib/jcode.pl	2023-06-19 23:29:28.473961800 +0900
@@ -681,7 +681,7 @@
 
 sub z2h_euc {
     local(*s, $n) = @_;
-    &init_z2h_euc unless defined %z2h_euc;
+    &init_z2h_euc if !%z2h_euc;
     $s =~ s/($re_euc_c|$re_euc_kana)/
 	$z2h_euc{$1} ? ($n++, $z2h_euc{$1}) : $1
     /geo;
@@ -690,7 +690,7 @@
 
 sub z2h_sjis {
     local(*s, $n) = @_;
-    &init_z2h_sjis unless defined %z2h_sjis;
+    &init_z2h_sjis if !%z2h_sjis;
     $s =~ s/($re_sjis_c)/$z2h_sjis{$1} ? ($n++, $z2h_sjis{$1}) : $1/geo;
     $n;
 }

namazuをインストールしてみる