Re: [M3] 使用者資料回存的bug.
※ 引述《hightman.bbs@bbs.hightman.net (軒水月明)》之銘言:
> 這個"bug"在各個M3版本中應該都是存在的,不過影響不大!
> 一般的, 用戶登錄進站時輸入用戶名、密碼...然后是歡迎畫面 ... 熱門話題
> .. 主選單.
> 在錄完密碼后有 acct_load(&cuser, ...); 接下來檢查一系列的權限,并把
> 上站次數加1,設定lasthost, ... 最后把資料回存到 .ACCT 檔中,
> 然后進入主選單。
> 所以在資料回存到 .ACCT 檔前的這小段時間若有用戶登錄多個窗口或被站長
> 強行改其資料則資料得不到保存。。:p
: bbsd.c:tn_login()
/* ------------------------------------------------- */
/* 將 .ACCT 寫回 */
/* ------------------------------------------------- */
#if 1
/* Thor.990318: 為防止有大機率 有人在welcome畫面回認證信, 故移至此 */
move(b_lines - 2, 0);
prints("歡迎您第 %d 度拜訪本站,上次您來自 %s,\n我記得那天是 %s。",
cuser.numlogins, cuser.lasthost, Ctime(&cuser.lastlogin));
/* Thor.990321: 將vmsg移至後方, 防止有人在此時回認證信 */
#endif
cuser.lastlogin = start;
str_ncpy(cuser.lasthost, fromhost, sizeof(cuser.lasthost));
usr_fpath(fpath, cuser.userid, fn_acct);
- fd = open(fpath, O_WRONLY);
- write(fd, &cuser, sizeof(ACCT));
- close(fd);
+ if ((fd = open(fpath, O_RDWR)) >= 0)
+ {
+ ACCT tuser;
+ if (read(fd, &tuser, sizeof(ACCT)) == sizeof(ACCT))
+ {
/* itoc.010805.註解: 這次的寫回 .ACCT 是為了讓別人 Query 線上使用者時
出現的上站時間/來源正確,以及回存正確的 userlvel */
+ tuser.userlevel = cuser.userlevel;
+ tuser.lastlogin = start;
+ strcpy(tuser.lasthost, cuser.lasthost);
+ lseek(fd, (off_t) 0, SEEK_SET);
+ write(fd, &tuser, sizeof(ACCT));
+ }
+ close(fd);
+ }
#if 1
vmsg(NULL); /* Thor.990321: 將vmsg移至後方, 防止有人在此時回認證信 */
#endif
--
Maple 3.02 的話,會有停留在歡迎畫面時改 userlevel 的問題
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: itoc.Dorm-GD2.NCTU.edu.tw
Maple 近期熱門文章
PTT數位生活區 即時熱門文章