[PATCH 1/1] hwclock: Verify RTC file descriptor; use reentrant functions

Denys Vlasenko vda.linux at googlemail.com
Tue Apr 29 14:19:05 UTC 2014


On Fri, Apr 25, 2014 at 7:48 PM, Bryan Evenson <bevenson at melinkcorp.com> wrote:
> If the RTC is in use by another process or if the dev interface
> is not properly established, calling rtc_xopen will fail.

I don't see how is that possible:

int FAST_FUNC rtc_xopen(const char **default_rtc, int flags)
{
        int rtc;

        if (!*default_rtc) {
                *default_rtc = "/dev/rtc";
                rtc = open(*default_rtc, flags);
                if (rtc >= 0)
                        return rtc;
                *default_rtc = "/dev/rtc0";
                rtc = open(*default_rtc, flags);
                if (rtc >= 0)
                        return rtc;
                *default_rtc = "/dev/misc/rtc";
        }

        return xopen(*default_rtc, flags);
}

If all open()'s fail, we end up executing "return xopen(...)".
And xopen() never returns failure - it exits
with error message instead.


> Similarly, the returned pointer of ctime and localtime was
> being used without checking if the pointer was valid. One of
> these calls was causing a call to hwclock to enter an
> uninterruptable sleep when the invalid hwclock access occurred.

Did you investigate which value of time_t caused that?

> The problem can be reproduced by running two instances of the
> following shell script:
>
>  #!/bin/sh
>  while [ 1 ]; do
>    /sbin/hwclock -w -u
>    sleep 1;
>  done

Works for me with no problems with current bbox git tree.
Modifying it to run hwclock much more often:

#!/bin/sh
i=0
while true; do
        ./busybox hwclock -w -u
        echo $i $?
        : $((i++))
done

and running two instances, I get this:

...
...
11461 0
hwclock: can't open '/dev/misc/rtc': No such file or directory
11462 1
11463 0
hwclock: can't open '/dev/misc/rtc': No such file or directory
11464 1
hwclock: can't open '/dev/misc/rtc': No such file or directory
11465 1
11466 0
...
...

Looks like it doesn't hang.
It's a question whether it should be failing or retrying,
but I don't see it hanging.


> This patch verifies the RTC file descriptor is valid before it
> is used, and it switches all ctime and localtime calls to
> ctime_r localtime_r respectively.  Before applying the patch,
> running the previously described test resulted in one instance
> of the script to hang with hwclock in an uninterruptable sleep
> within seconds of starting both scripts.  After the patch, ran
> two instances of the scripts for ten minutes without permanently
> blocking access to the RTC.

Let's focus first on reproducing the problem.
Which version of busybox do you use, what .config file,
on what kernel?


More information about the busybox mailing list