[Bug 14328] New: usleep() is obsolete, use nanosleep()

samba-bugs at samba.org samba-bugs at samba.org
Fri Mar 27 15:47:07 UTC 2020


https://bugzilla.samba.org/show_bug.cgi?id=14328

            Bug ID: 14328
           Summary: usleep() is obsolete, use nanosleep()
           Product: rsync
           Version: 3.1.3
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P5
         Component: core
          Assignee: wayne at opencoder.net
          Reporter: devzero at web.de
        QA Contact: rsync-qa at samba.org

by chance i came across 

https://polyverse.com/weakness-report/centos/7/obsolete/cwe-676/379/

and indeed

http://man7.org/linux/man-pages/man3/usleep.3.html

is telling:

4.3BSD, POSIX.1-2001.  POSIX.1-2001 declares this function obsolete;
       use nanosleep(2) instead.  POSIX.1-2008 removes the specification of
       usleep().


recent rsync 3.1.3 is still using usleep:

# grep -r usleep *
config.h.in:/* Define to 1 if you have the `usleep' function. */
configure.ac:    initgroups utimensat posix_fallocate attropen setvbuf usleep)
configure.sh:    initgroups utimensat posix_fallocate attropen setvbuf usleep
OLDNEWS:    - Use usleep() for our msleep() function if it is available.
util2.c:    usleep(t*1000);



for my curiosity, that went into rsync @2014, which is not too long ago:

https://git.samba.org/rsync.git/?p=rsync.git;a=commit;h=5546dab32970955e77ef7a5886bcd8fb765a25bf


http://man7.org/linux/man-pages/man2/nanosleep.2.html is telling:

    Compared to sleep(3) and usleep(3), nanosleep() has the following
       advantages: it provides a higher resolution for specifying the sleep
       interval; POSIX.1 explicitly specifies that it does not interact with
       signals; and it makes the task of resuming a sleep that has been
       interrupted by a signal handler easier.


also mind this one, as usleep return value is NOT being checked at the moment :

http://www.programmersought.com/article/5824721961/

2, pay attention

Be sure to pay attention to the return value when using these functions.
Sometimes the sleep function is interrupted by the system, and the result is
not as expected.
while (nanosleep(&ts, &ts) == -1 && errno == EINTR) {}



so - usleep is being used to define msleep() and that being used several times
in rsync source

i'm not sure if this could be a source of bugs, but i remember there are some
"rsync sits around doing nothing after larger transfers" and perhaps there is a
relation to this....

# grep -r msleep *
cleanup.c:            msleep(100);
clientserver.c:        msleep(400);
io.c:            msleep(20);
main.c:        msleep(20);
main.c:            msleep(20);
OLDNEWS:    - Use usleep() for our msleep() function if it is available.
OLDNEWS:    - Fix an issue in the msleep() function if time jumps backwards.
options.c:    msleep(20);
proto.h:int msleep(int t);
rsync.c:    msleep(400);
util2.c:int msleep(int t)

-- 
You are receiving this mail because:
You are the QA Contact for the bug.



More information about the rsync mailing list