Re: [M3] 使用者資料回存的bug.

看板Maple (BBS架站)作者時間22年前 (2002/08/31 16:47), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ 引述《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
文章代碼(AID): #zS8AA00 (Maple)
文章代碼(AID): #zS8AA00 (Maple)