Fix bug #7155 - valgrind Conditional jump or move depends on uninitialised value...
[ira/wip.git] / source3 / smbd / reply.c
index 64774ccf0dc254fe6aff041adea08c2b90e02ee0..b1a4e31951f3a0bf2f159fe6430e6828cb74ed47 100644 (file)
@@ -704,7 +704,7 @@ void reply_tcon_and_X(struct smb_request *req)
        }
 
        if ((passlen > MAX_PASS_LEN) || (passlen >= req->buflen)) {
-               reply_nterror(req, NT_STATUS_DOS(ERRDOS, ERRbuftoosmall));
+               reply_force_doserror(req, ERRDOS, ERRbuftoosmall);
                END_PROFILE(SMBtconX);
                return;
        }
@@ -864,7 +864,7 @@ void reply_unknown_new(struct smb_request *req, uint8 type)
 {
        DEBUG(0, ("unknown command type (%s): type=%d (0x%X)\n",
                  smb_fn_name(type), type, type));
-       reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRunknownsmb));
+       reply_force_doserror(req, ERRSRV, ERRunknownsmb);
        return;
 }
 
@@ -901,7 +901,7 @@ void reply_ioctl(struct smb_request *req)
                    replysize = 32;
                    break;
            default:
-                   reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRnosupport));
+                   reply_force_doserror(req, ERRSRV, ERRnosupport);
                    END_PROFILE(SMBioctl);
                    return;
        }
@@ -1652,7 +1652,7 @@ void reply_fclose(struct smb_request *req)
        p += 2;
 
        if (status_len == 0) {
-               reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRsrverror));
+               reply_force_doserror(req, ERRSRV, ERRsrverror);
                END_PROFILE(SMBfclose);
                return;
        }
@@ -1738,7 +1738,7 @@ void reply_open(struct smb_request *req)
                                         OPENX_FILE_EXISTS_OPEN, &access_mask,
                                         &share_mode, &create_disposition,
                                         &create_options)) {
-               reply_nterror(req, NT_STATUS_DOS(ERRDOS, ERRbadaccess));
+               reply_force_doserror(req, ERRDOS, ERRbadaccess);
                goto out;
        }
 
@@ -1911,7 +1911,7 @@ void reply_open_and_X(struct smb_request *req)
                                         &access_mask, &share_mode,
                                         &create_disposition,
                                         &create_options)) {
-               reply_nterror(req, NT_STATUS_DOS(ERRDOS, ERRbadaccess));
+               reply_force_doserror(req, ERRDOS, ERRbadaccess);
                goto out;
        }
 
@@ -5041,7 +5041,7 @@ void reply_printclose(struct smb_request *req)
         }
 
        if (!CAN_PRINT(conn)) {
-               reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRerror));
+               reply_force_doserror(req, ERRSRV, ERRerror);
                END_PROFILE(SMBsplclose);
                return;
        }
@@ -5368,8 +5368,12 @@ void reply_rmdir(struct smb_request *req)
                goto out;
        }
 
-       close_file(req, fsp, NORMAL_CLOSE);
-       reply_outbuf(req, 0, 0);
+       status = close_file(req, fsp, NORMAL_CLOSE);
+       if (!NT_STATUS_IS_OK(status)) {
+               reply_nterror(req, status);
+       } else {
+               reply_outbuf(req, 0, 0);
+       }
 
        dptr_closepath(sconn, smb_dname->base_name, req->smbpid);
 
@@ -7116,13 +7120,22 @@ NTSTATUS smbd_do_locking(struct smb_request *req,
                                defer_lock = true;
                        }
 
-                       /* This heuristic seems to match W2K3 very well. If a
-                          lock sent with timeout of zero would fail with NT_STATUS_FILE_LOCK_CONFLICT
-                          it pretends we asked for a timeout of between 150 - 300 milliseconds as
-                          far as I can tell. Replacement for do_lock_spin(). JRA. */
+                       /* If a lock sent with timeout of zero would fail, and
+                        * this lock has been requested multiple times,
+                        * according to brl_lock_failed() we convert this
+                        * request to a blocking lock with a timeout of between
+                        * 150 - 300 milliseconds.
+                        *
+                        * If lp_lock_spin_time() has been set to 0, we skip
+                        * this blocking retry and fail immediately.
+                        *
+                        * Replacement for do_lock_spin(). JRA. */
 
-                       if (br_lck && lp_blocking_locks(SNUM(conn)) && !blocking_lock &&
-                                       NT_STATUS_EQUAL((status), NT_STATUS_FILE_LOCK_CONFLICT)) {
+                       if (br_lck && lp_blocking_locks(SNUM(conn)) &&
+                           lp_lock_spin_time() && !blocking_lock &&
+                           NT_STATUS_EQUAL((status),
+                               NT_STATUS_FILE_LOCK_CONFLICT))
+                       {
                                defer_lock = true;
                                timeout = lp_lock_spin_time();
                        }
@@ -7240,7 +7253,7 @@ void reply_lockingX(struct smb_request *req)
                /* we don't support these - and CANCEL_LOCK makes w2k
                   and XP reboot so I don't really want to be
                   compatible! (tridge) */
-               reply_nterror(req, NT_STATUS_DOS(ERRDOS, ERRnoatomiclocks));
+               reply_force_doserror(req, ERRDOS, ERRnoatomiclocks);
                END_PROFILE(SMBlockingX);
                return;
        }
@@ -7428,7 +7441,7 @@ void reply_lockingX(struct smb_request *req)
 void reply_readbmpx(struct smb_request *req)
 {
        START_PROFILE(SMBreadBmpx);
-       reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRuseSTD));
+       reply_force_doserror(req, ERRSRV, ERRuseSTD);
        END_PROFILE(SMBreadBmpx);
        return;
 }
@@ -7442,7 +7455,7 @@ void reply_readbmpx(struct smb_request *req)
 void reply_readbs(struct smb_request *req)
 {
        START_PROFILE(SMBreadBs);
-       reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRuseSTD));
+       reply_force_doserror(req, ERRSRV, ERRuseSTD);
        END_PROFILE(SMBreadBs);
        return;
 }
@@ -7528,7 +7541,7 @@ void reply_setattrE(struct smb_request *req)
 void reply_writebmpx(struct smb_request *req)
 {
        START_PROFILE(SMBwriteBmpx);
-       reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRuseSTD));
+       reply_force_doserror(req, ERRSRV, ERRuseSTD);
        END_PROFILE(SMBwriteBmpx);
        return;
 }
@@ -7542,7 +7555,7 @@ void reply_writebmpx(struct smb_request *req)
 void reply_writebs(struct smb_request *req)
 {
        START_PROFILE(SMBwriteBs);
-       reply_nterror(req, NT_STATUS_DOS(ERRSRV, ERRuseSTD));
+       reply_force_doserror(req, ERRSRV, ERRuseSTD);
        END_PROFILE(SMBwriteBs);
        return;
 }