Contents of /trunk/samba/patches/samba-3.0.24-directory-delete.patch
Parent Directory | Revision Log
Revision 153 -
(show annotations)
(download)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 2218 byte(s)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 2218 byte(s)
-import
1 | Index: samba-3.0.24/source/lib/dummysmbd.c |
2 | =================================================================== |
3 | --- samba-3.0.24.orig/source/lib/dummysmbd.c 2006-04-19 21:29:23.000000000 -0500 |
4 | +++ samba-3.0.24/source/lib/dummysmbd.c 2007-02-08 20:15:04.000000000 -0600 |
5 | @@ -38,3 +38,9 @@ |
6 | { |
7 | return False; |
8 | } |
9 | + |
10 | +NTSTATUS can_delete_directory(struct connection_struct *conn, |
11 | + const char *dirname) |
12 | +{ |
13 | + return NT_STATUS_OK; |
14 | +} |
15 | Index: samba-3.0.24/source/locking/locking.c |
16 | =================================================================== |
17 | --- samba-3.0.24.orig/source/locking/locking.c 2007-02-04 12:59:23.000000000 -0600 |
18 | +++ samba-3.0.24/source/locking/locking.c 2007-02-08 20:15:04.000000000 -0600 |
19 | @@ -1166,6 +1166,11 @@ |
20 | return NT_STATUS_ACCESS_DENIED; |
21 | } |
22 | |
23 | + /* Don't allow delete on close for non-empty directories. */ |
24 | + if (fsp->is_directory) { |
25 | + return can_delete_directory(fsp->conn, fsp->fsp_name); |
26 | + } |
27 | + |
28 | return NT_STATUS_OK; |
29 | } |
30 | |
31 | Index: samba-3.0.24/source/smbd/dir.c |
32 | =================================================================== |
33 | --- samba-3.0.24.orig/source/smbd/dir.c 2007-02-04 12:59:13.000000000 -0600 |
34 | +++ samba-3.0.24/source/smbd/dir.c 2007-02-08 20:15:04.000000000 -0600 |
35 | @@ -1255,3 +1255,42 @@ |
36 | } |
37 | return False; |
38 | } |
39 | + |
40 | +/***************************************************************** |
41 | + Is this directory empty ? |
42 | +*****************************************************************/ |
43 | + |
44 | +NTSTATUS can_delete_directory(struct connection_struct *conn, |
45 | + const char *dirname) |
46 | +{ |
47 | + NTSTATUS status = NT_STATUS_OK; |
48 | + long dirpos = 0; |
49 | + const char *dname; |
50 | + struct smb_Dir *dir_hnd = OpenDir(conn, dirname, NULL, 0); |
51 | + |
52 | + if (!dir_hnd) { |
53 | + return map_nt_error_from_unix(errno); |
54 | + } |
55 | + |
56 | + while ((dname = ReadDirName(dir_hnd,&dirpos))) { |
57 | + SMB_STRUCT_STAT st; |
58 | + |
59 | + /* Quick check for "." and ".." */ |
60 | + if (dname[0] == '.') { |
61 | + if (!dname[1] || (dname[1] == '.' && !dname[2])) { |
62 | + continue; |
63 | + } |
64 | + } |
65 | + |
66 | + if (!is_visible_file(conn, dirname, dname, &st, True)) { |
67 | + continue; |
68 | + } |
69 | + |
70 | + DEBUG(10,("can_delete_directory: got name %s - can't delete\n", dname )); |
71 | + status = NT_STATUS_DIRECTORY_NOT_EMPTY; |
72 | + break; |
73 | + } |
74 | + CloseDir(dir_hnd); |
75 | + |
76 | + return status; |
77 | +} |