[owner] 英字ページ更新時の挙動不審

  • 元タイトル: 英字ページ更新時の挙動不審
  • ページ: BugTrack
  • 投稿者: ゆう
  • 優先順位: 重要
  • 状態: 着手
  • カテゴリー: 本体バグ
  • 投稿日: 2002-08-05 (月) 18:38:58
  • バージョン:

結論

メッセージ

P太? (2002-08-04 (日) 12:16:40)

お世話になってます。
英字ページをタイムスタンプを変更せずに編集しようとすると、以下のワーニングが出ます。

Warning: utime failed: Operation not permitted
in /usr/home0/******/virtual_html/trpg/file.php on line 44

Warning: Cannot add header information - headers already sent by 
(output started at /usr/home0/tinge3/virtual_html/trpg/file.php:44) 
in /usr/home0/******/virtual_html/trpg/index.php on line 283

Warning: Cannot add header information - headers already sent by 
(output started at /usr/home0/tinge3/virtual_html/trpg/file.php:44) 
in /usr/home0/******/virtual_html/trpg/skin/pukiwiki.skin.ja.php on line 1

↑PukiWiki-officialでは再現されないので、CVSをもらってきたあとの状態です。

どうやらページが英字WikiNameだと再現する模様。 :( -- P太? 2002-08-04 (日) 10:03:21

CVSから落としたファイルに差し替えて、該当ファイルのパーミッションを確認してもおかしくないので、いろいろと調べたんですが。Wikiフォルダ内の.txtのパーミッションが666のモノと644のモノが混在。
666の所有者はサーバのIDなんですが、644の所有者はwwwとなってます。ナニこれ? :(
ちなみに、644から666へのパーミッションの変更は拒否されます。
でも、エラーの出る英字WikiNameファイルは666になってるんだよなぁ……。644にしてみてもよけいダメでした。 :( -- P太? 2002-08-04 (日) 11:49:06

  • file.phpの35行目を
    -	$timestamp = @filemtime($dir.encode($page).".txt");
    +	$timestamp = filemtime($dir.encode($page).".txt");
    にすると、何かwarning出ませんか? -- ぱんだ 2002-08-04 (日) 13:39:31

前と同じwarningが出ますね。メッセージ自体は同じです。 -- P太? 2002-08-04 (日) 14:03:49

  • ありがちですが、wwwユーザがhttpdの実効ユーザですよね。Wikiディレクトリを777+stにして、あとはPHPスクリプトの中でumask設定するべきなのかなぁ。。。 -- seagull 2002-08-04 (日) 13:54:57
  • なんか、妙なコトしたかも。一旦、Wiki内を消して再アップロードして全て666にしたら日本語も英字もwarning出るようになってしまいました。と言うことは、644でwww所有の時にしか通らない? 所有者wwwって意味が判ってませんが。 :( -- P太? 2002-08-04 (日) 14:03:49
名前新規作成時刻保持修正所有者パーミッション
TestFile問題なし問題なしwww644
テストページ問題なし問題なしwww644

新規作成・修正のテストしてみました。新しく生成されるのはやっぱりwwwの644ファイルですね。 -- P太? 2002-08-04 (日) 14:19:59

  • phpはapacheの中で実行されてますから。phpがファイルを作ったときにはapacheの実効ユーザすなわちwwwがファイルを作ったことになるはずです。 -- ぱんだ 2002-08-04 (日) 14:24:38
    touch コマンドでファイルのアクセス時間や修正時間を現在時刻に変更する場
    合、実行するユーザーはファイルの所有者でなくても、そのファイルに対する
    書き込みアクセス権があれば良い。そうでない場合には、そのファイルの所有
    者である必要がある。
  • ん。だから、ディレクトリに+stつけておけばオーナシップのグループ部が引き継がれるので、umaskいじってg+wされるようにするのでは? -- 2002-08-04 (日) 16:00:14
  • む~ん、謎の呪文です。 :D ぐ~ぐるさんに「umask」を訊いてまわってみます。 -- P太? 2002-08-04 (日) 17:08:39
  • 自分のサーバでerror_reporting(E_ALL)を入れて試してみたら、Warning: utime failed: Operation not permittedがしっかり出てました。 -- ぱんだ 2002-08-04 (日) 23:12:45
    *** file.php 41
            fputs($fp,$str);
            flock($fp,LOCK_UN);
            fclose($fp);
    +       chmod($dir.encode($page).".txt", 0666);
            if($timestamp)
    	     touch($dir.encode($page).".txt",$timestamp);
     }
    *** file.php 104
            if($cnt > $maxshow) break;
        }
        flock($fp,LOCK_EX);
        fclose($fp);
    +   chmod(get_filename(encode($whatsnew)), 0666);
    }

う~ん、こんな状況になりました。 -- P太? 2002-08-05 (月) 00:38:36

ページ名新規作成通常修正時間保持修正パーミッション所有者
新規ページwarningwarning問題なし666www
日本語***warningwarning666UserID
Warning: chmod failed: Operation not permitted in /usr/home0/******
/virtual_html/trpg/file.php on line 95

Warning: chmod failed: Operation not permitted in /usr/home0/******
/virtual_html/trpg/file.php on line 95

Warning: Cannot add header information - headers already sent by 
 (output started at /usr/home0/******/virtual_html/trpg/file.php:95)
  in /usr/home0/tinge3/virtual_html/trpg/index.php on line 283

Warning: Cannot add header information - headers already sent by 
 (output started at /usr/home0/******/virtual_html/trpg/file.php:95)
  in /usr/home0/tinge3/virtual_html/trpg/skin/pukiwiki.skin.ja.php on line 1
Warning: chmod failed: Operation not permitted in /usr/home0/******
/virtual_html/trpg/file.php on line 42

Warning: utime failed: Operation not permitted in /usr/home0/******
/virtual_html/trpg/file.php on line 44

Warning: Cannot add header information - headers already sent by 
 (output started at /usr/home0/******/virtual_html/trpg/file.php:42)
  in /usr/home0/tinge3/virtual_html/trpg/index.php on line 283

Warning: Cannot add header information - headers already sent by 
 (output started at /usr/home0/******/virtual_html/trpg/file.php:42)
  in /usr/home0/tinge3/virtual_html/trpg/skin/pukiwiki.skin.ja.php on line 1
***backup.php 49
    backup_fputs($fp,$strout);
    backup_fputs($fp,$body);
    backup_fclose($fp);
+   chmod($realfilename, 0666);
}

  • chown www wiki/*するか、Warningの表示を抑止してタイムスタンプが変わってしまうのを受け入れるか、のどちらかしかないような。 -- 2002-08-05 (月) 19:30:00
  • chmod +st wiki/; して、 pukiwiki.ini.php あたりで、umask(0001) してもだめだったのかな。。。OSにもよるだろうけど。 -- seagull 2002-08-05 (月) 19:55:46
  • まちがい。umask(0002)か。。 -- seagull 2002-08-05 (月) 19:56:57
  • いずれにしても、新規にファイルを作るようなアプリで、umaskを意識しないのはまずいですな。。実行形式uploadされたら、サーバ側で実行可能になるのかな? http://.../attach/crack.pl とかできたらいや~んだな。。 -- seagull 2002-08-05 (月) 19:59:15
  • 今、手もとで試したところ、しっかり +x されてますな。私の所では suffix が.cgiでないと実行しないようにしてあるので問題ないですが、実行権限付いてれば実行しちゃう(初心者向けISPとかでありそう)ような場合は致命的。。。 -- seagull 2002-08-05 (月) 20:05:25
    あ~、いや、まてよ。実行権限付きのファイルをサーバにおけるとこまで行ったのなら、別にhttp経由でなくても他の手段でキックできればそれでいいんだよなぁ。。。う~ん。。
  • この問題は、BugTrack2/55 で追加した pkwk_touch_file() を使っている部分では発生しないはずです。pkwk_touch_file() は 同時に追加した pkwk_chown() を使って、ファイルのownerを強引に切り替えます。ただし、backupデータなどもケアしていたかどうかはチェックする価値があるかもしれません。もしケア漏れがあれば教えて下さい。(backupとか怪しいな) -- henoheno 2007-08-31 (金) 23:47:37
    • 問題があるかはひとまずおいといて、touch()を呼んでいるところを検索*1してみました。 -- 2007-09-01 (土) 17:26:03
      // $Id: init.php,v 1.53 2007/05/14 14:47:51 henoheno Exp $
      205行目~:
      foreach(array($defaultpage, $whatsnew, $interwiki) as $page){
      	if (! is_page($page)) touch(get_filename($page));
      }
      
      // $Id: attach.inc.php,v 1.87 2007/07/30 14:30:14 henoheno Exp $
      197行目~:
      	if (is_page($page))
      		touch(get_filename($page));
      644行目~:
      		if (is_page($this->page))
      			touch(get_filename($this->page));
      
      // $Id: dump.inc.php,v 1.40 2007/05/13 22:11:23 teanan Exp $
      665行目~:
      				// 既に同じファイルがある場合は上書きされる
      				$fpw = @fopen($name, 'wb');
      				if ($fpw !== FALSE) {
      					flock($fpw, LOCK_EX);
      					fwrite($fpw, $buff, $size);
      					@chmod($name, 0666);
      					@touch($name, $mtime);
      					flock($fpw, LOCK_UN);
  • ありがとうございます。確かに何箇所かありますね。dumpのところは、すでにfopenした後であるのでそのままにしておきました。 -- henoheno 2007-09-02 (日) 21:38:32

*1 pkwk_touch_file() やpkwk_chown() の中の物は除く

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-10-20 (土) 11:59:39
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.233 sec.

OSDN