diff options
author | darrenr <darrenr@FreeBSD.org> | 2005-06-14 09:18:26 +0000 |
---|---|---|
committer | darrenr <darrenr@FreeBSD.org> | 2005-06-14 09:18:26 +0000 |
commit | d742076594e13b208f83b2bb4f4e21caa62d9d14 (patch) | |
tree | 005662491fe7f6b4d472ec5cfc1cc74d0f90fd96 /sys/contrib/ipfilter | |
parent | 0bdf9fcd67a68c164b26f52e9ddba093a1f7ba40 (diff) | |
download | FreeBSD-src-d742076594e13b208f83b2bb4f4e21caa62d9d14.zip FreeBSD-src-d742076594e13b208f83b2bb4f4e21caa62d9d14.tar.gz |
locking on exit of reading from ip_sync is not correct for all instances
Approved by: re (dwhite)
Diffstat (limited to 'sys/contrib/ipfilter')
-rw-r--r-- | sys/contrib/ipfilter/netinet/ip_sync.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/contrib/ipfilter/netinet/ip_sync.c b/sys/contrib/ipfilter/netinet/ip_sync.c index 40a027e..a091b53 100644 --- a/sys/contrib/ipfilter/netinet/ip_sync.c +++ b/sys/contrib/ipfilter/netinet/ip_sync.c @@ -442,21 +442,26 @@ struct uio *uio; l = get_sleep_lock(&sl_tail); err = sleep(&sl_tail, PZERO+1); + if (err) { + MUTEX_EXIT(&ipsl_mutex); + return EINTR; + } spinunlock(l); } # else /* __hpux */ # ifdef __osf__ err = mpsleep(&sl_tail, PSUSP|PCATCH, "ipl sleep", 0, &ipsl_mutex, MS_LOCK_SIMPLE); + if (err) + return EINTR; # else MUTEX_EXIT(&ipsl_mutex); err = SLEEP(&sl_tail, "ipl sleep"); + if (err) + return EINTR; + MUTEX_ENTER(&ipsl_mutex); # endif /* __osf__ */ # endif /* __hpux */ - if (err) { - MUTEX_EXIT(&ipsl_mutex); - return err; - } # endif /* SOLARIS */ } MUTEX_EXIT(&ipsl_mutex); |