r22502: Fix bug #4536 - delete symlinks to a directory correctly.
authorJeremy Allison <jra@samba.org>
Tue, 24 Apr 2007 12:56:23 +0000 (12:56 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:19:40 +0000 (12:19 -0500)
Jeremy.
(This used to be commit dcc6517d9d349c65b045160e8a1358af088ae97a)

source3/smbd/reply.c

index bf739aa64324e215649c25d31eac53b8dce1db37..1acd78a106925d89587021c39e146fda5ea079b4 100644 (file)
@@ -3867,7 +3867,23 @@ NTSTATUS rmdir_internals(connection_struct *conn, const char *directory)
        int ret;
        SMB_STRUCT_STAT st;
 
-       ret = SMB_VFS_RMDIR(conn,directory);
+       /* Might be a symlink. */
+       if(SMB_VFS_LSTAT(conn, directory, &st) != 0) {
+               return map_nt_error_from_unix(errno);
+       }
+
+       if (S_ISLNK(st.st_mode)) {
+               /* Is what it points to a directory ? */
+               if(SMB_VFS_STAT(conn, directory, &st) != 0) {
+                       return map_nt_error_from_unix(errno);
+               }
+               if (!(S_ISDIR(st.st_mode))) {
+                       return NT_STATUS_NOT_A_DIRECTORY;
+               }
+               ret = SMB_VFS_UNLINK(conn,directory);
+       } else {
+               ret = SMB_VFS_RMDIR(conn,directory);
+       }
        if (ret == 0) {
                notify_fname(conn, NOTIFY_ACTION_REMOVED,
                             FILE_NOTIFY_CHANGE_DIR_NAME,