Arondight/sudodev

segfault

abbycin opened this issue · 1 comments

以下是全过程

╭─criss@Chameleon  ~  
╰─$ git clone https://github.com/Arondight/sudodev/
Cloning into 'sudodev'...
remote: Counting objects: 179, done.
remote: Compressing objects: 100% (43/43), done.
remote: Total 179 (delta 21), reused 0 (delta 0), pack-reused 136
Receiving objects: 100% (179/179), 69.62 KiB | 0 bytes/s, done.
Resolving deltas: 100% (106/106), done.
Checking connectivity... done.
╭─criss@Chameleon  ~  
╰─$ cd sudodev 
╭─criss@Chameleon  ~/sudodev  ‹master› 
╰─$ ./build.sh &>/dev/null
╭─criss@Chameleon  ~/sudodev  ‹master› 
╰─$ cd bin 
╭─criss@Chameleon  ~/sudodev/bin  ‹master› 
╰─$ su
Password: 
Chameleon:/home/criss/sudodev/bin # rm /var/run/sudodevd.pid 
Chameleon:/home/criss/sudodev/bin # ./sudodevd 
Chameleon:/home/criss/sudodev/bin # pgrep sudodevd
Chameleon:/home/criss/sudodev/bin # date
Mon Nov  9 13:32:25 CST 2015

查看日志 journalctl -xn

Nov 09 13:32:05 Chameleon sudodevd[10960]: SIGHUP is received, reload config                                                                                                                   
Nov 09 13:32:05 Chameleon kernel: sudodevd[10960]: segfault at 0 ip 00000000004026a8 sp 00007ffecb183a70 error 4 in sudodevd[400000+7000] 

然后我就issue你了。

readfile () 在读取出错的时候返回-1,在文件不存在的时候返回0sighupHandler () 中没有判断文件不存在的情况,导致文件不存在的时候也会尝试进行一次去重,造成segfault。
在历史版本的sighupHandler ()中,即使文件不存在,也不会有去重操作,加之在历史版本的eventloop ()中进行UUID 匹配的时候嵌套循环也避免了空指针造成的segfault,所以这个地方就这么被避免了……后来因为提交 9c400d5 把这个问题又暴露了出来。