mirror of
https://github.com/samba-team/samba.git
synced 2025-12-09 00:23:50 +03:00
r15186: Introduce ISDOT and ISDOTDOT macros for testing whether a filename is
"." for "..". These express the intention better that strcmp or strequal and improve searchability via cscope/ctags.
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
95eb558063
commit
7e4ad7e8e5
@@ -286,9 +286,9 @@ BOOL mask_match(struct smbcli_state *c, const char *string, const char *pattern,
|
|||||||
char *p2, *s2;
|
char *p2, *s2;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
|
|
||||||
if (strcmp(string,"..") == 0)
|
if (ISDOTDOT(string))
|
||||||
string = ".";
|
string = ".";
|
||||||
if (strcmp(pattern,".") == 0)
|
if (ISDOT(pattern))
|
||||||
return False;
|
return False;
|
||||||
|
|
||||||
if (is_case_sensitive)
|
if (is_case_sensitive)
|
||||||
@@ -497,8 +497,8 @@ static void do_list_helper(struct clilist_file_info *f, const char *mask, void *
|
|||||||
do_list_fn(ctx, f);
|
do_list_fn(ctx, f);
|
||||||
}
|
}
|
||||||
if (do_list_recurse &&
|
if (do_list_recurse &&
|
||||||
!strequal(f->name,".") &&
|
!ISDOT(f->name) &&
|
||||||
!strequal(f->name,"..")) {
|
!ISDOTDOT(f->name)) {
|
||||||
char *mask2;
|
char *mask2;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
@@ -838,7 +838,7 @@ static void do_mget(struct smbclient_context *ctx, struct clilist_file_info *fin
|
|||||||
char *mget_mask;
|
char *mget_mask;
|
||||||
char *saved_curdir;
|
char *saved_curdir;
|
||||||
|
|
||||||
if (strequal(finfo->name,".") || strequal(finfo->name,".."))
|
if (ISDOT(finfo->name) || ISDOTDOT(finfo->name))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (finfo->attrib & FILE_ATTRIBUTE_DIRECTORY)
|
if (finfo->attrib & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
@@ -1327,8 +1327,9 @@ static int file_find(struct smbclient_context *ctx, struct file_list **list, con
|
|||||||
if (!dir) return -1;
|
if (!dir) return -1;
|
||||||
|
|
||||||
while ((dname = readdirname(dir))) {
|
while ((dname = readdirname(dir))) {
|
||||||
if (!strcmp("..", dname)) continue;
|
if (ISDOT(dname) || ISDOTDOT(dname)) {
|
||||||
if (!strcmp(".", dname)) continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (asprintf(&path, "%s/%s", directory, dname) <= 0) {
|
if (asprintf(&path, "%s/%s", directory, dname) <= 0) {
|
||||||
continue;
|
continue;
|
||||||
@@ -2725,7 +2726,7 @@ static void completion_remote_filter(struct clilist_file_info *f, const char *ma
|
|||||||
{
|
{
|
||||||
completion_remote_t *info = (completion_remote_t *)state;
|
completion_remote_t *info = (completion_remote_t *)state;
|
||||||
|
|
||||||
if ((info->count < MAX_COMPLETIONS - 1) && (strncmp(info->text, f->name, info->len) == 0) && (strcmp(f->name, ".") != 0) && (strcmp(f->name, "..") != 0)) {
|
if ((info->count < MAX_COMPLETIONS - 1) && (strncmp(info->text, f->name, info->len) == 0) && (!ISDOT(f->name)) && (!ISDOTDOT(f->name))) {
|
||||||
if ((info->dirmask[0] == 0) && !(f->attrib & FILE_ATTRIBUTE_DIRECTORY))
|
if ((info->dirmask[0] == 0) && !(f->attrib & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
info->matches[info->count] = strdup(f->name);
|
info->matches[info->count] = strdup(f->name);
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -239,8 +239,7 @@ static void cb_select_child (GtkWidget *root_tree, GtkWidget *child,
|
|||||||
|
|
||||||
/* Get stats on the file/dir and see what we have */
|
/* Get stats on the file/dir and see what we have */
|
||||||
|
|
||||||
if ((strcmp(dirp->name, ".") != 0) &&
|
if (!ISDOT(dirp->name) && !ISDOTDOT(dirp->name)) {
|
||||||
(strcmp(dirp->name, "..") != 0)) {
|
|
||||||
|
|
||||||
strncpy(path1, path, sizeof(path1));
|
strncpy(path1, path, sizeof(path1));
|
||||||
strncat(path1, "/", sizeof(path) - strlen(path));
|
strncat(path1, "/", sizeof(path) - strlen(path));
|
||||||
@@ -414,8 +413,8 @@ static void cb_itemsignal( GtkWidget *item,
|
|||||||
|
|
||||||
if (dirp->smbc_type != SMBC_FILE &&
|
if (dirp->smbc_type != SMBC_FILE &&
|
||||||
dirp->smbc_type != SMBC_IPC_SHARE &&
|
dirp->smbc_type != SMBC_IPC_SHARE &&
|
||||||
(strcmp(dirp->name, ".") != 0) &&
|
(!ISDOT(dirp->name)) &&
|
||||||
(strcmp(dirp->name, "..") !=0)){
|
(!ISDOTDOT(dirp->name))){
|
||||||
|
|
||||||
subtree = gtk_tree_new();
|
subtree = gtk_tree_new();
|
||||||
gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree);
|
gtk_tree_item_set_subtree(GTK_TREE_ITEM(aitem), subtree);
|
||||||
|
|||||||
@@ -40,3 +40,22 @@
|
|||||||
#ifndef HAVE_MKDIR_MODE
|
#ifndef HAVE_MKDIR_MODE
|
||||||
#define mkdir(dir, mode) mkdir(dir)
|
#define mkdir(dir, mode) mkdir(dir)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Test whether a file name is the "." or ".." directory entries.
|
||||||
|
* These really should be inline functions.
|
||||||
|
*/
|
||||||
|
#ifndef ISDOT
|
||||||
|
#define ISDOT(path) ( \
|
||||||
|
*((const char *)path) == '.' && \
|
||||||
|
*(((const char *)path) + 1) == '\0' \
|
||||||
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ISDOTDOT
|
||||||
|
#define ISDOTDOT(path) ( \
|
||||||
|
*((const char *)path) == '.' && \
|
||||||
|
*(((const char *)path) + 1) == '.' && \
|
||||||
|
*(((const char *)path) + 2) == '\0' \
|
||||||
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -88,8 +88,7 @@ static WERROR reg_dir_key_by_index(TALLOC_CTX *mem_ctx, const struct registry_ke
|
|||||||
if(!d) return WERR_INVALID_PARAM;
|
if(!d) return WERR_INVALID_PARAM;
|
||||||
|
|
||||||
while((e = readdir(d))) {
|
while((e = readdir(d))) {
|
||||||
if( strcmp(e->d_name, ".") &&
|
if(!ISDOT(e->d_name) && !ISDOTDOT(e->d_name)) {
|
||||||
strcmp(e->d_name, "..")) {
|
|
||||||
struct stat stbuf;
|
struct stat stbuf;
|
||||||
char *thispath;
|
char *thispath;
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ _PUBLIC_ init_module_fn *load_modules(TALLOC_CTX *mem_ctx, const char *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while((entry = readdir(dir))) {
|
while((entry = readdir(dir))) {
|
||||||
if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
|
if (ISDOT(entry->d_name) || ISDOTDOT(entry->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
filename = talloc_asprintf(mem_ctx, "%s/%s", path, entry->d_name);
|
filename = talloc_asprintf(mem_ctx, "%s/%s", path, entry->d_name);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "libcli/raw/libcliraw.h"
|
#include "libcli/raw/libcliraw.h"
|
||||||
#include "libcli/libcli.h"
|
#include "libcli/libcli.h"
|
||||||
|
#include "system/dir.h"
|
||||||
|
|
||||||
struct delete_state {
|
struct delete_state {
|
||||||
struct smbcli_tree *tree;
|
struct smbcli_tree *tree;
|
||||||
@@ -35,8 +36,9 @@ static void delete_fn(struct clilist_file_info *finfo, const char *name, void *s
|
|||||||
{
|
{
|
||||||
struct delete_state *dstate = state;
|
struct delete_state *dstate = state;
|
||||||
char *s, *n;
|
char *s, *n;
|
||||||
if (strcmp(finfo->name, ".") == 0 ||
|
if (ISDOT(finfo->name) || ISDOTDOT(finfo->name)) {
|
||||||
strcmp(finfo->name, "..") == 0) return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
n = strdup(name);
|
n = strdup(name);
|
||||||
n[strlen(n)-1] = 0;
|
n[strlen(n)-1] = 0;
|
||||||
|
|||||||
@@ -939,7 +939,6 @@ NTSTATUS ntvfs_cifs_init(void)
|
|||||||
{
|
{
|
||||||
NTSTATUS ret;
|
NTSTATUS ret;
|
||||||
struct ntvfs_ops ops;
|
struct ntvfs_ops ops;
|
||||||
NTVFS_CURRENT_CRITICAL_SIZES(vers);
|
|
||||||
|
|
||||||
ZERO_STRUCT(ops);
|
ZERO_STRUCT(ops);
|
||||||
|
|
||||||
@@ -986,7 +985,7 @@ NTSTATUS ntvfs_cifs_init(void)
|
|||||||
|
|
||||||
/* register ourselves with the NTVFS subsystem. We register
|
/* register ourselves with the NTVFS subsystem. We register
|
||||||
under the name 'cifs'. */
|
under the name 'cifs'. */
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(ret)) {
|
if (!NT_STATUS_IS_OK(ret)) {
|
||||||
DEBUG(0,("Failed to register CIFS backend!\n"));
|
DEBUG(0,("Failed to register CIFS backend!\n"));
|
||||||
|
|||||||
@@ -777,7 +777,6 @@ NTSTATUS ntvfs_ipc_init(void)
|
|||||||
{
|
{
|
||||||
NTSTATUS ret;
|
NTSTATUS ret;
|
||||||
struct ntvfs_ops ops;
|
struct ntvfs_ops ops;
|
||||||
NTVFS_CURRENT_CRITICAL_SIZES(vers);
|
|
||||||
|
|
||||||
ZERO_STRUCT(ops);
|
ZERO_STRUCT(ops);
|
||||||
|
|
||||||
@@ -818,7 +817,7 @@ NTSTATUS ntvfs_ipc_init(void)
|
|||||||
ops.cancel = ipc_cancel;
|
ops.cancel = ipc_cancel;
|
||||||
|
|
||||||
/* register ourselves with the NTVFS subsystem. */
|
/* register ourselves with the NTVFS subsystem. */
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(ret)) {
|
if (!NT_STATUS_IS_OK(ret)) {
|
||||||
DEBUG(0,("Failed to register IPC backend!\n"));
|
DEBUG(0,("Failed to register IPC backend!\n"));
|
||||||
|
|||||||
@@ -884,7 +884,6 @@ NTSTATUS ntvfs_nbench_init(void)
|
|||||||
{
|
{
|
||||||
NTSTATUS ret;
|
NTSTATUS ret;
|
||||||
struct ntvfs_ops ops;
|
struct ntvfs_ops ops;
|
||||||
NTVFS_CURRENT_CRITICAL_SIZES(vers);
|
|
||||||
|
|
||||||
ZERO_STRUCT(ops);
|
ZERO_STRUCT(ops);
|
||||||
|
|
||||||
@@ -929,7 +928,7 @@ NTSTATUS ntvfs_nbench_init(void)
|
|||||||
ops.trans2 = NULL;
|
ops.trans2 = NULL;
|
||||||
|
|
||||||
/* register ourselves with the NTVFS subsystem. */
|
/* register ourselves with the NTVFS subsystem. */
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(ret)) {
|
if (!NT_STATUS_IS_OK(ret)) {
|
||||||
DEBUG(0,("Failed to register nbench backend!\n"));
|
DEBUG(0,("Failed to register nbench backend!\n"));
|
||||||
|
|||||||
@@ -266,17 +266,6 @@ struct ntvfs_critical_sizes {
|
|||||||
int sizeof_ntvfs_request;
|
int sizeof_ntvfs_request;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NTVFS_CURRENT_CRITICAL_SIZES(c) \
|
|
||||||
struct ntvfs_critical_sizes c = { \
|
|
||||||
.interface_version = NTVFS_INTERFACE_VERSION, \
|
|
||||||
.sizeof_ntvfs_critical_sizes = sizeof(struct ntvfs_critical_sizes), \
|
|
||||||
.sizeof_ntvfs_context = sizeof(struct ntvfs_context), \
|
|
||||||
.sizeof_ntvfs_module_context = sizeof(struct ntvfs_module_context), \
|
|
||||||
.sizeof_ntvfs_ops = sizeof(struct ntvfs_ops), \
|
|
||||||
.sizeof_ntvfs_async_state = sizeof(struct ntvfs_async_state), \
|
|
||||||
.sizeof_ntvfs_request = sizeof(struct ntvfs_request), \
|
|
||||||
}
|
|
||||||
|
|
||||||
struct messaging_context;
|
struct messaging_context;
|
||||||
#include "librpc/gen_ndr/security.h"
|
#include "librpc/gen_ndr/security.h"
|
||||||
#include "librpc/gen_ndr/notify.h"
|
#include "librpc/gen_ndr/notify.h"
|
||||||
|
|||||||
@@ -44,18 +44,11 @@ static int num_backends;
|
|||||||
|
|
||||||
The 'type' is used to specify whether this is for a disk, printer or IPC$ share
|
The 'type' is used to specify whether this is for a disk, printer or IPC$ share
|
||||||
*/
|
*/
|
||||||
_PUBLIC_ NTSTATUS ntvfs_register(const struct ntvfs_ops *ops,
|
_PUBLIC_ NTSTATUS ntvfs_register(const void *_ops)
|
||||||
const struct ntvfs_critical_sizes *const sizes)
|
|
||||||
{
|
{
|
||||||
|
const struct ntvfs_ops *ops = _ops;
|
||||||
struct ntvfs_ops *new_ops;
|
struct ntvfs_ops *new_ops;
|
||||||
|
|
||||||
if (ntvfs_interface_differs(sizes)) {
|
|
||||||
DEBUG(0, ("NTVFS backend '%s' for type %d "
|
|
||||||
"failed version check\n",
|
|
||||||
ops->name, (int)ops->type));
|
|
||||||
return NT_STATUS_BAD_FUNCTION_TABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ntvfs_backend_byname(ops->name, ops->type) != NULL) {
|
if (ntvfs_backend_byname(ops->name, ops->type) != NULL) {
|
||||||
/* its already registered! */
|
/* its already registered! */
|
||||||
DEBUG(0,("NTVFS backend '%s' for type %d already registered\n",
|
DEBUG(0,("NTVFS backend '%s' for type %d already registered\n",
|
||||||
@@ -105,49 +98,21 @@ _PUBLIC_ const struct ntvfs_ops *ntvfs_backend_byname(const char *name, enum ntv
|
|||||||
This can be used by backends to either detect compilation errors, or provide
|
This can be used by backends to either detect compilation errors, or provide
|
||||||
multiple implementations for different smbd compilation options in one module
|
multiple implementations for different smbd compilation options in one module
|
||||||
*/
|
*/
|
||||||
|
static const struct ntvfs_critical_sizes critical_sizes = {
|
||||||
static const NTVFS_CURRENT_CRITICAL_SIZES(critical_sizes);
|
.interface_version = NTVFS_INTERFACE_VERSION,
|
||||||
|
.sizeof_ntvfs_critical_sizes = sizeof(struct ntvfs_critical_sizes),
|
||||||
|
.sizeof_ntvfs_context = sizeof(struct ntvfs_context),
|
||||||
|
.sizeof_ntvfs_module_context = sizeof(struct ntvfs_module_context),
|
||||||
|
.sizeof_ntvfs_ops = sizeof(struct ntvfs_ops),
|
||||||
|
.sizeof_ntvfs_async_state = sizeof(struct ntvfs_async_state),
|
||||||
|
.sizeof_ntvfs_request = sizeof(struct ntvfs_request),
|
||||||
|
};
|
||||||
|
|
||||||
_PUBLIC_ const struct ntvfs_critical_sizes *ntvfs_interface_version(void)
|
_PUBLIC_ const struct ntvfs_critical_sizes *ntvfs_interface_version(void)
|
||||||
{
|
{
|
||||||
return &critical_sizes;
|
return &critical_sizes;
|
||||||
}
|
}
|
||||||
|
|
||||||
_PUBLIC_ BOOL ntvfs_interface_differs(const struct ntvfs_critical_sizes *const iface)
|
|
||||||
{
|
|
||||||
/* The comparison would be easier with memcmp, but compiler-interset
|
|
||||||
* alignment padding is not guaranteed to be zeroed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define FIELD_DIFFERS(field) (iface->field != critical_sizes.field)
|
|
||||||
|
|
||||||
if (FIELD_DIFFERS(interface_version))
|
|
||||||
return True;
|
|
||||||
|
|
||||||
if (FIELD_DIFFERS(sizeof_ntvfs_critical_sizes))
|
|
||||||
return True;
|
|
||||||
|
|
||||||
if (FIELD_DIFFERS(sizeof_ntvfs_context))
|
|
||||||
return True;
|
|
||||||
|
|
||||||
if (FIELD_DIFFERS(sizeof_ntvfs_module_context))
|
|
||||||
return True;
|
|
||||||
|
|
||||||
if (FIELD_DIFFERS(sizeof_ntvfs_ops))
|
|
||||||
return True;
|
|
||||||
|
|
||||||
if (FIELD_DIFFERS(sizeof_ntvfs_async_state))
|
|
||||||
return True;
|
|
||||||
|
|
||||||
if (FIELD_DIFFERS(sizeof_ntvfs_request))
|
|
||||||
return True;
|
|
||||||
|
|
||||||
/* Versions match. */
|
|
||||||
return False;
|
|
||||||
|
|
||||||
#undef FIELD_DIFFERS
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
initialise a connection structure to point at a NTVFS backend
|
initialise a connection structure to point at a NTVFS backend
|
||||||
|
|||||||
@@ -218,8 +218,7 @@ const char *pvfs_list_next(struct pvfs_dir *dir, uint_t *ofs)
|
|||||||
while ((de = readdir(dir->dir))) {
|
while ((de = readdir(dir->dir))) {
|
||||||
const char *dname = de->d_name;
|
const char *dname = de->d_name;
|
||||||
|
|
||||||
if (strcmp(dname, ".") == 0 ||
|
if (ISDOT(dname) || ISDOT(dname)) {
|
||||||
strcmp(dname, "..") == 0) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,13 +268,13 @@ NTSTATUS pvfs_list_seek(struct pvfs_dir *dir, const char *name, uint_t *ofs)
|
|||||||
struct dirent *de;
|
struct dirent *de;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (strcmp(name, ".") == 0) {
|
if (ISDOT(name)) {
|
||||||
dir->offset = DIR_OFFSET_DOTDOT;
|
dir->offset = DIR_OFFSET_DOTDOT;
|
||||||
*ofs = dir->offset;
|
*ofs = dir->offset;
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(name, "..") == 0) {
|
if (ISDOTDOT(name)) {
|
||||||
dir->offset = DIR_OFFSET_BASE;
|
dir->offset = DIR_OFFSET_BASE;
|
||||||
*ofs = dir->offset;
|
*ofs = dir->offset;
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
@@ -324,8 +323,7 @@ BOOL pvfs_directory_empty(struct pvfs_state *pvfs, struct pvfs_filename *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while ((de = readdir(dir))) {
|
while ((de = readdir(dir))) {
|
||||||
if (strcmp(de->d_name, ".") != 0 &&
|
if (!ISDOT(de->d_name) && !ISDOTDOT(de->d_name)) {
|
||||||
strcmp(de->d_name, "..") != 0) {
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -372,7 +372,7 @@ static NTSTATUS pvfs_reduce_name(TALLOC_CTX *mem_ctx, const char **fname, uint_t
|
|||||||
if (strcmp(components[i], "") == 0) {
|
if (strcmp(components[i], "") == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strcmp(components[i], ".") == 0 || err_count) {
|
if (ISDOT(components[i]) || err_count) {
|
||||||
err_count++;
|
err_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -394,7 +394,7 @@ static NTSTATUS pvfs_reduce_name(TALLOC_CTX *mem_ctx, const char **fname, uint_t
|
|||||||
i--;
|
i--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strcmp(components[i], "..") == 0) {
|
if (ISDOTDOT(components[i])) {
|
||||||
if (i < 1) return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
|
if (i < 1) return NT_STATUS_OBJECT_PATH_SYNTAX_BAD;
|
||||||
memmove(&components[i-1], &components[i+1],
|
memmove(&components[i-1], &components[i+1],
|
||||||
sizeof(char *)*(num_components-(i+1)));
|
sizeof(char *)*(num_components-(i+1)));
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "vfs_posix.h"
|
#include "vfs_posix.h"
|
||||||
|
#include "system/dir.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -164,8 +165,7 @@ NTSTATUS pvfs_unlink(struct ntvfs_module_context *ntvfs,
|
|||||||
while ((fname = pvfs_list_next(dir, &ofs))) {
|
while ((fname = pvfs_list_next(dir, &ofs))) {
|
||||||
/* this seems to be a special case */
|
/* this seems to be a special case */
|
||||||
if ((unl->unlink.in.attrib & FILE_ATTRIBUTE_DIRECTORY) &&
|
if ((unl->unlink.in.attrib & FILE_ATTRIBUTE_DIRECTORY) &&
|
||||||
(strcmp(fname, ".") == 0 ||
|
(ISDOT(fname) || ISDOTDOT(fname))) {
|
||||||
strcmp(fname, "..") == 0)) {
|
|
||||||
return NT_STATUS_OBJECT_NAME_INVALID;
|
return NT_STATUS_OBJECT_NAME_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -286,7 +286,6 @@ NTSTATUS ntvfs_posix_init(void)
|
|||||||
{
|
{
|
||||||
NTSTATUS ret;
|
NTSTATUS ret;
|
||||||
struct ntvfs_ops ops;
|
struct ntvfs_ops ops;
|
||||||
NTVFS_CURRENT_CRITICAL_SIZES(vers);
|
|
||||||
|
|
||||||
ZERO_STRUCT(ops);
|
ZERO_STRUCT(ops);
|
||||||
|
|
||||||
@@ -329,14 +328,14 @@ NTSTATUS ntvfs_posix_init(void)
|
|||||||
under the name 'default' as we wish to be the default
|
under the name 'default' as we wish to be the default
|
||||||
backend, and also register as 'posix' */
|
backend, and also register as 'posix' */
|
||||||
ops.name = "default";
|
ops.name = "default";
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(ret)) {
|
if (!NT_STATUS_IS_OK(ret)) {
|
||||||
DEBUG(0,("Failed to register POSIX backend as '%s'!\n", ops.name));
|
DEBUG(0,("Failed to register POSIX backend as '%s'!\n", ops.name));
|
||||||
}
|
}
|
||||||
|
|
||||||
ops.name = "posix";
|
ops.name = "posix";
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(ret)) {
|
if (!NT_STATUS_IS_OK(ret)) {
|
||||||
DEBUG(0,("Failed to register POSIX backend as '%s'!\n", ops.name));
|
DEBUG(0,("Failed to register POSIX backend as '%s'!\n", ops.name));
|
||||||
|
|||||||
@@ -100,7 +100,6 @@ NTSTATUS ntvfs_print_init(void)
|
|||||||
{
|
{
|
||||||
NTSTATUS ret;
|
NTSTATUS ret;
|
||||||
struct ntvfs_ops ops;
|
struct ntvfs_ops ops;
|
||||||
NTVFS_CURRENT_CRITICAL_SIZES(vers);
|
|
||||||
|
|
||||||
ZERO_STRUCT(ops);
|
ZERO_STRUCT(ops);
|
||||||
|
|
||||||
@@ -116,7 +115,7 @@ NTSTATUS ntvfs_print_init(void)
|
|||||||
|
|
||||||
/* register ourselves with the NTVFS subsystem. We register under the name 'default'
|
/* register ourselves with the NTVFS subsystem. We register under the name 'default'
|
||||||
as we wish to be the default backend */
|
as we wish to be the default backend */
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(ret)) {
|
if (!NT_STATUS_IS_OK(ret)) {
|
||||||
DEBUG(0,("Failed to register PRINT backend!\n"));
|
DEBUG(0,("Failed to register PRINT backend!\n"));
|
||||||
|
|||||||
@@ -969,7 +969,6 @@ NTSTATUS ntvfs_simple_init(void)
|
|||||||
{
|
{
|
||||||
NTSTATUS ret;
|
NTSTATUS ret;
|
||||||
struct ntvfs_ops ops;
|
struct ntvfs_ops ops;
|
||||||
NTVFS_CURRENT_CRITICAL_SIZES(vers);
|
|
||||||
|
|
||||||
ZERO_STRUCT(ops);
|
ZERO_STRUCT(ops);
|
||||||
|
|
||||||
@@ -1011,7 +1010,7 @@ NTSTATUS ntvfs_simple_init(void)
|
|||||||
|
|
||||||
ops.type = NTVFS_DISK;
|
ops.type = NTVFS_DISK;
|
||||||
ops.name = "simple";
|
ops.name = "simple";
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(ret)) {
|
if (!NT_STATUS_IS_OK(ret)) {
|
||||||
DEBUG(0,("Failed to register simple backend with name: %s!\n",
|
DEBUG(0,("Failed to register simple backend with name: %s!\n",
|
||||||
|
|||||||
@@ -639,7 +639,6 @@ NTSTATUS ntvfs_unixuid_init(void)
|
|||||||
{
|
{
|
||||||
NTSTATUS ret;
|
NTSTATUS ret;
|
||||||
struct ntvfs_ops ops;
|
struct ntvfs_ops ops;
|
||||||
NTVFS_CURRENT_CRITICAL_SIZES(vers);
|
|
||||||
|
|
||||||
ZERO_STRUCT(ops);
|
ZERO_STRUCT(ops);
|
||||||
|
|
||||||
@@ -680,15 +679,15 @@ NTSTATUS ntvfs_unixuid_init(void)
|
|||||||
|
|
||||||
/* we register under all 3 backend types, as we are not type specific */
|
/* we register under all 3 backend types, as we are not type specific */
|
||||||
ops.type = NTVFS_DISK;
|
ops.type = NTVFS_DISK;
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
if (!NT_STATUS_IS_OK(ret)) goto failed;
|
if (!NT_STATUS_IS_OK(ret)) goto failed;
|
||||||
|
|
||||||
ops.type = NTVFS_PRINT;
|
ops.type = NTVFS_PRINT;
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
if (!NT_STATUS_IS_OK(ret)) goto failed;
|
if (!NT_STATUS_IS_OK(ret)) goto failed;
|
||||||
|
|
||||||
ops.type = NTVFS_IPC;
|
ops.type = NTVFS_IPC;
|
||||||
ret = ntvfs_register(&ops, &vers);
|
ret = ntvfs_register(&ops);
|
||||||
if (!NT_STATUS_IS_OK(ret)) goto failed;
|
if (!NT_STATUS_IS_OK(ret)) goto failed;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
|
|||||||
@@ -57,8 +57,7 @@ static void recursive_delete(const char *path)
|
|||||||
char *fname;
|
char *fname;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
if (strcmp(de->d_name, ".") == 0 ||
|
if (ISDOT(de->d_name) || ISDOTDOT(de->d_name)) {
|
||||||
strcmp(de->d_name, "..") == 0) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "torture/torture.h"
|
#include "torture/torture.h"
|
||||||
#include "system/filesys.h"
|
#include "system/filesys.h"
|
||||||
|
#include "system/dir.h"
|
||||||
#include "lib/tdb/include/tdbutil.h"
|
#include "lib/tdb/include/tdbutil.h"
|
||||||
#include "libcli/libcli.h"
|
#include "libcli/libcli.h"
|
||||||
#include "torture/util.h"
|
#include "torture/util.h"
|
||||||
@@ -130,7 +131,7 @@ static void gen_name(char *name)
|
|||||||
|
|
||||||
p[i] = 0;
|
p[i] = 0;
|
||||||
|
|
||||||
if (strcmp(p, ".") == 0 || strcmp(p, "..") == 0) {
|
if (ISDOT(p) || ISDOTDOT(p)) {
|
||||||
p[0] = '_';
|
p[0] = '_';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
#include "system/filesys.h"
|
#include "system/filesys.h"
|
||||||
|
#include "system/dir.h"
|
||||||
#include "libcli/libcli.h"
|
#include "libcli/libcli.h"
|
||||||
#include "libcli/raw/libcliraw.h"
|
#include "libcli/raw/libcliraw.h"
|
||||||
#include "system/time.h"
|
#include "system/time.h"
|
||||||
@@ -41,9 +42,9 @@ static BOOL reg_match_one(struct smbcli_state *cli, const char *pattern, const c
|
|||||||
/* oh what a weird world this is */
|
/* oh what a weird world this is */
|
||||||
if (old_list && strcmp(pattern, "*.*") == 0) return True;
|
if (old_list && strcmp(pattern, "*.*") == 0) return True;
|
||||||
|
|
||||||
if (strcmp(pattern,".") == 0) return False;
|
if (ISDOT(pattern)) return False;
|
||||||
|
|
||||||
if (strcmp(file,"..") == 0) file = ".";
|
if (ISDOTDOT(file)) file = ".";
|
||||||
|
|
||||||
return ms_fnmatch(pattern, file, cli->transport->negotiate.protocol)==0;
|
return ms_fnmatch(pattern, file, cli->transport->negotiate.protocol)==0;
|
||||||
}
|
}
|
||||||
@@ -101,9 +102,9 @@ static BOOL f_info_hit;
|
|||||||
|
|
||||||
static void listfn(struct clilist_file_info *f, const char *s, void *state)
|
static void listfn(struct clilist_file_info *f, const char *s, void *state)
|
||||||
{
|
{
|
||||||
if (strcmp(f->name,".") == 0) {
|
if (ISDOT(f->name)) {
|
||||||
resultp[0] = '+';
|
resultp[0] = '+';
|
||||||
} else if (strcmp(f->name,"..") == 0) {
|
} else if (ISDOTDOT(f->name)) {
|
||||||
resultp[1] = '+';
|
resultp[1] = '+';
|
||||||
} else {
|
} else {
|
||||||
resultp[2] = '+';
|
resultp[2] = '+';
|
||||||
@@ -227,9 +228,9 @@ static void test_mask(int argc, char *argv[],
|
|||||||
}
|
}
|
||||||
file[l+l2] = 0;
|
file[l+l2] = 0;
|
||||||
|
|
||||||
if (strcmp(file+l,".") == 0 ||
|
if (ISDOT(file+l) || ISDOTDOT(file+l) || ISDOTDOT(mask+l)) {
|
||||||
strcmp(file+l,"..") == 0 ||
|
continue;
|
||||||
strcmp(mask+l,"..") == 0) continue;
|
}
|
||||||
|
|
||||||
if (strspn(file+l, ".") == strlen(file+l)) continue;
|
if (strspn(file+l, ".") == strlen(file+l)) continue;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user