荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (pq), 信区: InstallBBS
标  题: [范文4][BBSDev]FB2000中checkpasswd的bug
发信站: 荔园晨风BBS站 (Thu Nov 29 11:21:14 2001), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@bbs.pku.edu.cn 所发表 】
发信人: vida (下一个自杀的id...), 信区: BBSDev
标  题: [范文4][BBSDev]FB2000中checkpasswd的bug
发信站: 北大未名站 (2001年05月23日22:07:06 星期三), 站内信件


发信人: ecnegrevid (车人七月刀), 信区: BBSDev
标  题: [范文4][BBSDev]FB2000中checkpasswd的bug
发信站: 一塌糊涂 BBS (Mon Jul 10 09:56:04 2000)

有人报告说在FB2000里有时不正确的passwd也可以登录. 检查了一下代码,
认为可能是checkpasswd函数造成的. 该函数为:

#ifdef LINUX
int checkpasswd(char *c1, char *c2) {
    int pid, s;
    pid= fork();
    if(pid==0)
        exit (checkpasswd0(c1, c2));
    else if(pid==-1)
        return checkpasswd0(c1, c2);
    else {
        wait (&s);
        return s;
    }
}
#else
int checkpasswd(char *c1, char *c2) {
        return checkpasswd0(c1,c2);
}
#endif

其中wait(&s)可能被其它信号所中断, 这时虽然子进程并未结束, wait就
会返回, 虽然s可能并未被正确赋值, 并可能是非零值. 这个s将作为
checkpasswd的返回值.

在main.c中对checkpasswd的调用为:

  if (!checkpasswd(currentuser.passwd, passbuf)) {
      logattempt(currentuser.userid, fromhost);
      prints(";31m密码输入错误...m\n");
  } else {

显然, s!=0被作为密码输入正确的情形了, 信号于是导致了密码检测错误.

修正方法或许可以是

        if(wait (&s)==-1) return 0;
        if(!WIFEXITED(s)) return 0;
        return WEXITSTATUS(s);

--
欢迎大家来Software版!
        这里提供各种最新软件信息,软件的使用以及评测。
        同时非常希望大家写出自己的心得体会!

欢迎访问北大FTP联盟主页:http://www.pkuftp.dhs.org

※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 162.105.170.50]
--
※ 转载:·北大未名站 bbs.pku.edu.cn·[FROM: 166.111.215.160]
--
※ 转寄:·北大未名站 bbs.pku.edu.cn·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店