Make a [un]become_root wrap a bit tighter
authorVolker Lendecke <vl@samba.org>
Sun, 2 Nov 2008 20:52:16 +0000 (21:52 +0100)
committerVolker Lendecke <vl@samba.org>
Sun, 2 Nov 2008 20:53:44 +0000 (21:53 +0100)
Sooner or later this would bite us.

source3/smbd/aio.c

index aca7a192c3f9697091772857780f4d986c6c2834..4ed574cec7bab1c7e0f46c07517fda45c72ed510 100644 (file)
@@ -221,6 +221,7 @@ bool schedule_aio_read_and_X(connection_struct *conn,
        SMB_STRUCT_AIOCB *a;
        size_t bufsize;
        size_t min_aio_read_size = lp_aio_read_size(SNUM(conn));
+       int ret;
 
        if (fsp->base_fsp != NULL) {
                /* No AIO on streams yet */
@@ -279,14 +280,15 @@ bool schedule_aio_read_and_X(connection_struct *conn,
        a->aio_sigevent.sigev_value.sival_int = aio_ex->mid;
 
        become_root();
-       if (SMB_VFS_AIO_READ(fsp,a) == -1) {
+       ret = SMB_VFS_AIO_READ(fsp, a);
+       unbecome_root();
+
+       if (ret == -1) {
                DEBUG(0,("schedule_aio_read_and_X: aio_read failed. "
                         "Error %s\n", strerror(errno) ));
                delete_aio_ex(aio_ex);
-               unbecome_root();
                return False;
        }
-       unbecome_root();
 
        DEBUG(10,("schedule_aio_read_and_X: scheduled aio_read for file %s, "
                  "offset %.0f, len = %u (mid = %u)\n",
@@ -313,6 +315,7 @@ bool schedule_aio_write_and_X(connection_struct *conn,
        size_t inbufsize, outbufsize;
        bool write_through = BITSETW(req->vwv+7,0);
        size_t min_aio_write_size = lp_aio_write_size(SNUM(conn));
+       int ret;
 
        if (fsp->base_fsp != NULL) {
                /* No AIO on streams yet */
@@ -380,15 +383,16 @@ bool schedule_aio_write_and_X(connection_struct *conn,
        a->aio_sigevent.sigev_value.sival_int = aio_ex->mid;
 
        become_root();
-       if (SMB_VFS_AIO_WRITE(fsp,a) == -1) {
+       ret = SMB_VFS_AIO_WRITE(fsp, a);
+       unbecome_root();
+
+       if (ret == -1) {
                DEBUG(3,("schedule_aio_wrote_and_X: aio_write failed. "
                         "Error %s\n", strerror(errno) ));
                delete_aio_ex(aio_ex);
-               unbecome_root();
                return False;
        }
-       unbecome_root();
-       
+
        release_level_2_oplocks_on_change(fsp);
 
        if (!write_through && !lp_syncalways(SNUM(fsp->conn))