2008-07-28

工作札记 (6)

早晨刚坐下便接到xuan哥转过来一封partner的邮件,稍一思量之下发现这是一个不折不扣的bug,然而一直藏了数月都未能发现。单元测试覆盖面不够是主要原因。

故事的开始
我需要在C代码中修改Linux本地用户的密码,于是strace了一下passwd命令,没发现什么猫腻之出。于是用Expect写了个脚本调用passwd,然后C中system之。后来知道某些passwd版本有个`--stdin',但非标准选项。又能体现工作量,又相对通用,于是就Expect之。

潜在的危险:
`system'的参数其实会传递给`/bin/sh -c',因此参数中不能有特殊字符,如$等等。我们的partner设置了一个超级NB的密码,其中出现了三次`$',但不幸的是`xyz$foo$bar$abc'最终只是`xyz',因为`$foo'是foo变量的值,bar, abc同理,于是可怜、无辜的partner只有抓狂了。

改进的方案:
抛弃懒惰,找到passwd的源代码,发现它原来是通过PAM提供的API搞定的。我诚恳的ltrace了一把,果然发现如下输出:
pam_start(...)
pam_chauthtok(...)
misc_conv(...)

肠子都悔青了。闷头改起,单元测试,内存测试,提交补丁。

下午突然一阵犯困,头歪在椅子上很是不爽,便去霸占了老爷椅美美的睡了一下。V2结束一个多月,V2.5的计划也开始渐渐影响到我这种喽喽。一个新的cycle开始了。

标签:

0 Comments:

发表评论

<< Home