Annotation of /trunk/samba/patches/samba-3.0.24-directory-delete.patch
Parent Directory | Revision Log
Revision 153 -
(hide 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 | niro | 153 | 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 | +} |