Arondight/sudodev

这是feature还是bug

Closed this issue · 2 comments

我尝试用C++按照我的理解写一遍,发现我的是这样:
按照uuid输出

./a.out add
Scaning avaliable devices...
The following choices are avaliable
[q]. quit
[0]. 4E36250D3624F79B
[1]. 9C941A5B941A37EA
[2]. fd223770-d482-3d1e-9963-8e7e6c659a68
[3]. 0229-150D
[4]. 807ca61d-328c-3625-a54f-bb18bf62f086
Please enter a choice: q

按照分区输出

./a.out add
Scaning avaliable devices...
The following choices are avaliable
[q]. quit
[0]. sda5
[1]. sda4
[2]. sda2
[3]. sda1
[4]. sda3
Please enter a choice: q

这两个输出是同一个设备。
由于我的机器有两块硬盘,系统所在硬盘是/dev/sdb 所以通过fstab过滤后剩下的就是/dev/sda了。

但是学姐的是这样:

./sudodev add
uuid[0] = (null)
uuid[1] = (null)
uuid[2] = (null)
uuid[3] = (null)
uuid[4] = 4E36250D3624F79B
uuid[5] = 9C941A5B941A37EA
uuid[6] = fd223770-d482-3d1e-9963-8e7e6c659a68
uuid[7] = 0229-150D
uuid[8] = (null)
uuid[9] = 807ca61d-328c-3625-a54f-bb18bf62f086
uuid[10] = (null)
No available device found
attempt failed

修改的代码, devs.c
modified1

上面输出的(null)就是已经过滤掉的/dev/sdbx, 但是在sudodev.c里面,有这样的代码

for (index = 0; list[index]; ++index);
  devicesLen = index;

  if (!(devices = (device_t **)malloc ((devicesLen + 1) * sizeof (device_t *))))
    {
      say (mode, MSG_E, "malloc failed: %s\n", strerror (errno));
      abort ();
    }
  memset (devices, 0, (devicesLen + 1) * sizeof (device_t *));

  for (index = 0, count = 0; list[index]; ++index)
    {
      snprintf (path, MAXPATHLEN, "%s/%s", interface, list[index]);

    ...

这个文件中的count 没有初始化, 在以上for()中自加,但是由于list[index]为null不会进入循环
modified2

所以,学姐, 这是feature还是bug啊? 另外的那块硬盘算是外部设备吗?

艾玛,我还抱着手机钻被窝里聊QQ 呢(ฅ>ω<*ฅ)
这是一个bug,因为代码是下班以后追完新番写的,所以写的时候已经忘掉之前的想法了,顺着那个dev 点c 的代码往上看,会看到设备不存在于fstab 时会直接continue,但是再对比上面第一个continue 的情况,会发现这里新加的代码少了计数器的自减操作。从设计上来说是绝对不会出现null 在有效设备之前的情况,不过实现的时候因为计数器一直自增,所以出现了事与愿违的空指针。
bug 的原因感觉应该就是这样,如果楼主方便的话帮我发个pull request 吧,commit 里面链接一下这个issue,暖气的力量太强大实在起不来了(ฅ>ω<*ฅ)

终于起床了……测了下的确是这个问题,另外sudodev.c 里面的count 是已经初始化了的,否则这里会直接crash 掉的。