Some failure paths can return from SDISK_SendFile with the
database lock still held. Other failure paths will cause
setlabel to be called without holding the lock.
Rework the failure paths so we always release the DB lock before
returning, and always hold it when calling setlabel.
Reviewed-on: http://gerrit.openafs.org/4151
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit
ad63745f357e377c613881fa3470b85d4d36fe36)
Change-Id: I99cb359f108f604be75f19250fb697eb95b81947
Reviewed-on: http://gerrit.openafs.org/9418
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
/* send the file back to the requester */
+ dbase = ubik_dbase;
+
if ((code = ubik_CheckAuth(rxcall))) {
+ DBHOLD(dbase);
goto failed;
}
if (offset && offset != otherHost) {
/* we *know* this is the wrong guy */
code = USYNC;
+ DBHOLD(dbase);
goto failed;
}
- dbase = ubik_dbase;
DBHOLD(dbase);
/* abort any active trans that may scribble over the database */
#endif
code = rx_Read(rxcall, tbuffer, tlen);
if (code != tlen) {
- DBRELE(dbase);
ubik_dprint("Rx-read length error=%d\n", code);
code = BULK_ERROR;
close(fd);
pass++;
#endif
if (code != tlen) {
- DBRELE(dbase);
ubik_dprint("write failed error=%d\n", code);
code = UIOERROR;
close(fd);
#else
LWP_NoYieldSignal(&dbase->version);
#endif
- DBRELE(dbase);
- failed:
+
+failed:
if (code) {
#ifndef OLD_URECOVERY
unlink(pbuffer);
} else {
ubik_print("Ubik: Synchronize database completed\n");
}
+ DBRELE(dbase);
return code;
}