summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h4
-rw-r--r--source3/smbd/notify.c57
-rw-r--r--source3/smbd/nttrans.c4
3 files changed, 30 insertions, 35 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index a3ae1ddad7..05ef6fe00d 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6466,7 +6466,9 @@ void reply_negprot(struct smb_request *req);
/* The following definitions come from smbd/notify.c */
void change_notify_reply(connection_struct *conn,
- struct smb_request *req, uint32 max_param,
+ struct smb_request *req,
+ NTSTATUS status,
+ uint32_t max_param,
struct notify_change_buf *notify_buf);
NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter,
bool recursive);
diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c
index 94544271fe..bf5846641c 100644
--- a/source3/smbd/notify.c
+++ b/source3/smbd/notify.c
@@ -64,6 +64,10 @@ static bool notify_marshall_changes(int num_changes,
int i;
UNISTR uni_name;
+ if (num_changes == -1) {
+ return false;
+ }
+
uni_name.buffer = NULL;
for (i=0; i<num_changes; i++) {
@@ -131,37 +135,23 @@ static bool notify_marshall_changes(int num_changes,
Setup the common parts of the return packet and send it.
*****************************************************************************/
-static void change_notify_reply_packet(connection_struct *conn,
- struct smb_request *req,
- NTSTATUS error_code)
-{
- reply_outbuf(req, 18, 0);
-
- if (!NT_STATUS_IS_OK(error_code)) {
- error_packet_set((char *)req->outbuf, 0, 0, error_code,
- __LINE__,__FILE__);
- }
-
- show_msg((char *)req->outbuf);
- if (!srv_send_smb(smbd_server_fd(),
- (char *)req->outbuf,
- true, req->seqnum+1,
- req->encrypted, &req->pcd)) {
- exit_server_cleanly("change_notify_reply_packet: srv_send_smb "
- "failed.");
- }
- TALLOC_FREE(req->outbuf);
-}
-
void change_notify_reply(connection_struct *conn,
- struct smb_request *req, uint32 max_param,
+ struct smb_request *req,
+ NTSTATUS error_code,
+ uint32_t max_param,
struct notify_change_buf *notify_buf)
{
prs_struct ps;
- if (notify_buf->num_changes == -1) {
- change_notify_reply_packet(conn, req, NT_STATUS_OK);
- notify_buf->num_changes = 0;
+ if (!NT_STATUS_IS_OK(error_code)) {
+ send_nt_replies(conn, req, error_code,
+ NULL, 0, NULL, 0);
+ return;
+ }
+
+ if (max_param == 0 || notify_buf == NULL) {
+ send_nt_replies(conn, req, NT_STATUS_OK,
+ NULL, 0, NULL, 0);
return;
}
@@ -173,14 +163,13 @@ void change_notify_reply(connection_struct *conn,
* We exceed what the client is willing to accept. Send
* nothing.
*/
- change_notify_reply_packet(conn, req, NT_STATUS_OK);
- goto done;
+ prs_mem_free(&ps);
+ prs_init_empty(&ps, NULL, MARSHALL);
}
send_nt_replies(conn, req, NT_STATUS_OK, prs_data_p(&ps),
prs_offset(&ps), NULL, 0);
- done:
prs_mem_free(&ps);
TALLOC_FREE(notify_buf->changes);
@@ -315,8 +304,8 @@ void remove_pending_change_notify_requests_by_mid(uint16 mid)
return;
}
- change_notify_reply_packet(map->req->fsp->conn, map->req->req,
- NT_STATUS_CANCELLED);
+ change_notify_reply(map->req->fsp->conn, map->req->req,
+ NT_STATUS_CANCELLED, 0, NULL);
change_notify_remove_request(map->req);
}
@@ -332,8 +321,8 @@ void remove_pending_change_notify_requests_by_fid(files_struct *fsp,
}
while (fsp->notify->requests != NULL) {
- change_notify_reply_packet(
- fsp->conn, fsp->notify->requests->req, status);
+ change_notify_reply(fsp->conn, fsp->notify->requests->req,
+ status, 0, NULL);
change_notify_remove_request(fsp->notify->requests);
}
}
@@ -405,6 +394,7 @@ static void notify_fsp(files_struct *fsp, uint32 action, const char *name)
if (fsp->notify->requests != NULL) {
change_notify_reply(fsp->conn,
fsp->notify->requests->req,
+ NT_STATUS_OK,
fsp->notify->requests->max_param,
fsp->notify);
change_notify_remove_request(fsp->notify->requests);
@@ -464,6 +454,7 @@ static void notify_fsp(files_struct *fsp, uint32 action, const char *name)
change_notify_reply(fsp->conn,
fsp->notify->requests->req,
+ NT_STATUS_OK,
fsp->notify->requests->max_param,
fsp->notify);
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 368a1a8f98..9cd35d5ebb 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -1592,7 +1592,9 @@ static void call_nt_transact_notify_change(connection_struct *conn,
* here.
*/
- change_notify_reply(fsp->conn, req, max_param_count,
+ change_notify_reply(fsp->conn, req,
+ NT_STATUS_OK,
+ max_param_count,
fsp->notify);
/*