Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Jan 2002 07:02:25 -0800 (PST)
From:      User JHB <jhb@magnesium.net>
To:        hackers@FreeBSD.org
Cc:        jhb@FreeBSD.org
Subject:   uiomove busted for the past 3 years
Message-ID:  <Pine.BSF.4.21.0201300655270.85159-100000@toxic.magnesium.net>

next in thread | raw e-mail | index | archive | help
When the DEADLKTREAT flag was added, uiomove() was broken.  :)  The
problem is that a return() inside of a switch nested inside of a while
loop was converted to a break leading to the following rather silly code:

                        if (error)
                                break;
                        break;

What is supposed to happen is that if there is an error, we break out of
the while loop, but all we do is break out of the switch ignoring the
error and continuing to loop.  Thus, in the best case, if copyin or
copyout failed on the last iteration of the loop, we would return an
error, but would bogusly update the counts in the iovec and uio
structures.  In the worst case, if we kept looping and later copyin's or
copyout's succeeded, then we wouldn't return an error at all.  A quick fix
would be to add a goto to jump to the error return code at the end of the
loop rather than the bogus break if (error).  However, I can't test this
at the moment.  Someone please verify and fix this.  I think it's broken
in RELENG_3 as well if someone is adventurous enough to merge it that
far.  I guess copyin/copyout don't fail often.

-- 

John Baldwin <jhb@FreeBSD.org> <><



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0201300655270.85159-100000>