[M3] 糧淊艇溹超祟皇p酊槓ug(非根治)

看板Maple (BBS架站)作者時間21年前 (2003/05/24 02:17), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
這段時間,小站上又出現了不少超級隱身,感覺真的很奇怪。 想來想去,只有可能一個地方出問題,即 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
文章代碼(AID): #-pcMV00 (Maple)
文章代碼(AID): #-pcMV00 (Maple)