post by tommy @ 12 九月, 2006 12:44
早上 trace 了一下, 發現在有新的連線登入時, 會把舊的連線的暫存檔都刪除, 所以算來算去, 都被認為是第一個連線, 當然不會有限制.
這個問題發生在 pure-ftpd 使用
kill(pid, 0) == 0
來判斷該行程是否仍然存在, 如果不存在, 則表示那個暫存檔的行程已經結束, 就把那個檔案刪除. 當然, 如果那個判斷是正常的話, 這樣子處理並不會有問題, 但是... 在我的系統上頭, 不論該行程是否存在, 上頭那個 kill 函式, 都會傳回 -1, 所以... 都會被認為是不存在.
查了一下 kill() 的說明, 在傳回 -1 時, 可以由 errno 的值來判斷原因. 而在我的系統上頭, 如果該行程不存在, errno 會是 ESRCH (3), 如果該行程存在, errno 會是 EPERM (1). 所以, 只要把上頭的指令, 修改一下, 當 kill() 傳回 -1 時, 如果 errno 值為 3 的時候, 才表示該行程不存在.
diff -Nur src.orig/ftpwho-read.c src/ftpwho-read.c
--- src.orig/ftpwho-read.c 2006-02-16 05:35:02.000000000 +0800
+++ src/ftpwho-read.c 2006-09-13 11:21:15.670109231 +0800
@@ -12,7 +12,7 @@
static inline int checkproc(const pid_t proc)
{
- return kill(proc, 0) == 0;
+ return (kill(proc, 0) == -1 && errno == ESRCH) ? 0 : 1;
}
static int scoreboard_cleanup(const char * const file)
這個 patch 可以由這兒抓取: http://www.teatime.com.tw/~tommy/mypatch/pureftpd_peruserlimits.patch
經過這樣子的修正之後, 就可以正常的限制使用者的連線數了.