[M3] 糧淊艇溹超祟皇p酊槓ug(非根治)
這段時間,小站上又出現了不少超級隱身,感覺真的很奇怪。
想來想去,只有可能一個地方出問題,即 utmp_free() 弄錯了。
具體原因尚不清楚,暫提供以下解決辦法,歡迎指正:
1.
:: src/maple/cache.c ::
中的 utmp_free() 函數:
if (!uentp || !uentp->pid)
return;
#ifdef HAVE_SEM
sem_lock(BSEM_ENTER);
#endif
+ /* hightman.030522: 超隱會不會是這里 free 錯了? :-p */
+ if (uentp->pid != currpid) {
+ UTMP *uceil;
+ uentp = ushm->uslot;
+ uceil = (void *) uentp + ushm->offset;
+ do {
+ /* 找到了? 如果沒找到那會到哪去了呢? */
+ if (uentp->pid == currpid)
+ break;
+ } while (++uentp <= uceil);
+ }
+ if (uentp->pid == currpid) {
uentp->pid = uentp->userno = 0;
ushm->count--;
+ }
#ifdef HAVE_SEM
sem_lock(BSEM_LEAVE);
#endif
...
2. 為用戶提供 utmp_restore() ,在utmp_free() 函數后增加以下函數
/* hightman.030522: 簡易解決超級隱身 */
void utmp_restore()
{
if (cutmp->pid == currpid) return;
if (!str_cmp(cuser.userid, cutmp->userid)) { /* 還沒被人占用 :p */
cutmp->pid = currpid;
cutmp->userno = cuser.userno;
} else {
/* 被占用了, 只好 utmp_new 一個 */
UTMP utmp;
utmp.pid = currpid;
utmp.userno = cuser.userno;
utmp.mode = bbsmode;
//utmp.in_addr = tn_addr;
utmp.ufo = cuser.ufo;
strcpy(utmp.userid, cuser.userid);
strcpy(utmp.username, cuser.username);
str_ncpy(utmp.from, fromhost, sizeof(utmp.from) - 1);
cutmp = NULL;
if (!utmp_new(&utmp)) {
move(b_lines, 0);
outs("非常不幸,您必須斷線!");
abort_bbs();
return;
}
}
ushm->count++;
return;
}
3.
不過我想,如果 utmp_free() 按照上文改法作過修改后應當不需要再用
utmp_restore()了,也放上去的話保險一點。:)
在 visio.c 中的 igetch() 函數中增加以下字句:
...
data = vi_pool;
nfds = 0;
+ /* hightman.030522: 臨時解決超隱問題 */
+ if (cutmp != NULL && cutmp->pid != currpid)
+ {
+ utmp_restore();
+ }
...
--
※ Origin: 明月水軒 <bbs.hightman.net>
◆ From: 192.168.3.1
Maple 近期熱門文章
PTT數位生活區 即時熱門文章