flockが不徹底

メッセージ

影響範囲を調べきれていませんが、get_source等でflock処理がされていません。flockでLOCK_EXを行なってもflockを使っていない処理のファイルアクセスはブロックできないので、file_write側だけでロックしても十分な効果は得られません。



fopen(w) と flock(LOCK_EX)


その他: flock() を行うラッパーを使う案

--- backup.php	Sat Apr 30 14:21:00 2005
+++ backup.lock.php	Sun Aug 21 18:56:52 2005
@@ -65,12 +65,32 @@
 		$body = PKWK_SPLITTER . ' ' . get_filetime($page) . "\n" . join('', $body);
 		$body = preg_replace("/\n*$/", "\n", $body);
 
-		$fp = _backup_fopen($page, 'wb')
-			or die_message('cannot write file ' . htmlspecialchars($realfilename) .
-			'<br />maybe permission is not writable or filename is too long');
-		_backup_fputs($fp, $strout);
-		_backup_fputs($fp, $body);
-		_backup_fclose($fp);
+		$filename = _backup_get_filename($page);
+		do{
+			if(($lock = @fopen($filename, 'r')) !== FALSE){
+				flock($lock, LOCK_EX);
+				clearstatcache();
+				if(_backup_get_filetime($page) != $lastmod)
+					break;
+			}else{
+				$lock = @fopen($filename, 'a+')
+					or die_message('cannot write file ' . htmlspecialchars($filename) .
+					'<br />maybe permission is not writable or filename is too long');
+				flock($lock, LOCK_EX);
+				//	$strout = '';	//	処理中に管理者がファイルを消したとしたら?
+				clearstatcache();
+				if(filesize($filename) != 0)
+					break;
+			}
+			$fp = _backup_fopen($page, 'wb')
+				or die_message('cannot write file ' . htmlspecialchars($filename) .
+				'<br />maybe permission is not writable or filename is too long');
+			_backup_fputs($fp, $strout);
+			_backup_fputs($fp, $body);
+			_backup_fclose($fp);
+		}while(FALSE);
+		flock($lock, LOCK_UN);
+		fclose($lock);
 	}
 }
 
@@ -230,9 +250,15 @@
  */
 	function _backup_file($page)
 	{
-		return _backup_file_exists($page) ?
-			gzfile(_backup_get_filename($page)) :
-			array();
+		$filename = _backup_get_filename($page);
+		$data = array();
+		if(($fp = @fopen($filename, 'r')) !== FALSE){
+			flock($fp, LOCK_SH);
+			$data = gzfile($filename);
+			flock($fp, LOCK_UN);
+			fclose($fp);
+		}
+		return $data !== FALSE ? $data : array();
 	}
 }
 /////////////////////////////////////////////////
@@ -296,9 +322,15 @@
  */
 	function _backup_file($page)
 	{
-		return _backup_file_exists($page) ?
-			file(_backup_get_filename($page)) :
-			array();
+		$filename = _backup_get_filename($page);
+		$data = array();
+		if(($fp = @fopen($filename, 'r')) !== FALSE){
+			flock($fp, LOCK_SH);
+			$data = file($filename);
+			flock($fp, LOCK_UN);
+			fclose($fp);
+		}
+		return $data !== FALSE ? $data : array();
 	}
 }
 ?>


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-10-24 (日) 23:57:30
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.255 sec.

SourceForge