diff options
author | Jeremy Allison <jra@samba.org> | 2001-08-30 22:06:42 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2001-08-30 22:06:42 +0000 |
commit | 715d9964e00d0428bf584d52da6f708cf4faa7f1 (patch) | |
tree | 002f66a3194ad42d21fe9c897563cb976e569dd5 /source/smbd/reply.c | |
parent | b316280a21c2ce56aac6a34e736b5e65d231d4dd (diff) | |
download | samba-715d9964e00d0428bf584d52da6f708cf4faa7f1.tar.gz samba-715d9964e00d0428bf584d52da6f708cf4faa7f1.tar.xz samba-715d9964e00d0428bf584d52da6f708cf4faa7f1.zip |
Fixed NULL pointer redirect in unlink internals.
Jeremy.
Diffstat (limited to 'source/smbd/reply.c')
-rw-r--r-- | source/smbd/reply.c | 256 |
1 files changed, 120 insertions, 136 deletions
diff --git a/source/smbd/reply.c b/source/smbd/reply.c index 7f674c8da2b..f03ce99fc14 100644 --- a/source/smbd/reply.c +++ b/source/smbd/reply.c @@ -3411,86 +3411,81 @@ int mkdir_internal(connection_struct *conn, char *inbuf, char *outbuf, pstring d } /**************************************************************************** - reply to a mkdir + Reply to a mkdir ****************************************************************************/ + int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize) { - pstring directory; - int outsize; - START_PROFILE(SMBmkdir); + pstring directory; + int outsize; + START_PROFILE(SMBmkdir); - pstrcpy(directory,smb_buf(inbuf) + 1); + pstrcpy(directory,smb_buf(inbuf) + 1); - outsize=mkdir_internal(conn, inbuf, outbuf, directory); - if(outsize == 0) - outsize = set_message(outbuf,0,0,True); + outsize=mkdir_internal(conn, inbuf, outbuf, directory); + if(outsize == 0) + outsize = set_message(outbuf,0,0,True); - DEBUG( 3, ( "mkdir %s ret=%d\n", directory, outsize ) ); + DEBUG( 3, ( "mkdir %s ret=%d\n", directory, outsize ) ); - END_PROFILE(SMBmkdir); - return(outsize); + END_PROFILE(SMBmkdir); + return(outsize); } /**************************************************************************** -Static function used by reply_rmdir to delete an entire directory -tree recursively. + Static function used by reply_rmdir to delete an entire directory + tree recursively. Return False on ok, True on fail. ****************************************************************************/ static BOOL recursive_rmdir(connection_struct *conn, char *directory) { - char *dname = NULL; - BOOL ret = False; - void *dirptr = OpenDir(NULL, directory, False); + char *dname = NULL; + BOOL ret = False; + void *dirptr = OpenDir(conn, directory, False); - if(dirptr == NULL) - return True; + if(dirptr == NULL) + return True; - while((dname = ReadDirName(dirptr))) - { - pstring fullname; - SMB_STRUCT_STAT st; + while((dname = ReadDirName(dirptr))) { + pstring fullname; + SMB_STRUCT_STAT st; - if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0)) - continue; + if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0)) + continue; - /* Construct the full name. */ - if(strlen(directory) + strlen(dname) + 1 >= sizeof(fullname)) - { - errno = ENOMEM; - ret = True; - break; - } - pstrcpy(fullname, directory); - pstrcat(fullname, "/"); - pstrcat(fullname, dname); + /* Construct the full name. */ + if(strlen(directory) + strlen(dname) + 1 >= sizeof(fullname)) { + errno = ENOMEM; + ret = True; + break; + } - if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname,False), &st) != 0) - { - ret = True; - break; - } + pstrcpy(fullname, directory); + pstrcat(fullname, "/"); + pstrcat(fullname, dname); - if(st.st_mode & S_IFDIR) - { - if(recursive_rmdir(conn, fullname)!=0) - { - ret = True; - break; - } - if(vfs_rmdir(conn,fullname) != 0) - { - ret = True; - break; - } - } - else if(vfs_unlink(conn,fullname) != 0) - { - ret = True; - break; - } - } - CloseDir(dirptr); - return ret; + if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname,False), &st) != 0) { + ret = True; + break; + } + + if(st.st_mode & S_IFDIR) { + if(recursive_rmdir(conn, fullname)!=0) { + ret = True; + break; + } + if(vfs_rmdir(conn,fullname) != 0) { + ret = True; + break; + } + } else if(vfs_unlink(conn,fullname) != 0) { + ret = True; + break; + } + } + + CloseDir(dirptr); + return ret; } /**************************************************************************** @@ -3499,86 +3494,75 @@ static BOOL recursive_rmdir(connection_struct *conn, char *directory) BOOL rmdir_internals(connection_struct *conn, char *directory) { - BOOL ok; - - ok = (vfs_rmdir(conn,directory) == 0); - if(!ok && ((errno == ENOTEMPTY)||(errno == EEXIST)) && lp_veto_files(SNUM(conn))) - { - /* - * Check to see if the only thing in this directory are - * vetoed files/directories. If so then delete them and - * retry. If we fail to delete any of them (and we *don't* - * do a recursive delete) then fail the rmdir. - */ - BOOL all_veto_files = True; - char *dname; - void *dirptr = OpenDir(conn, directory, False); - - if(dirptr != NULL) - { - int dirpos = TellDir(dirptr); - while ((dname = ReadDirName(dirptr))) - { - if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0)) - continue; - if(!IS_VETO_PATH(conn, dname)) - { - all_veto_files = False; - break; - } - } - if(all_veto_files) - { - SeekDir(dirptr,dirpos); - while ((dname = ReadDirName(dirptr))) - { - pstring fullname; - SMB_STRUCT_STAT st; - - if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0)) - continue; + BOOL ok; + + ok = (vfs_rmdir(conn,directory) == 0); + if(!ok && ((errno == ENOTEMPTY)||(errno == EEXIST)) && lp_veto_files(SNUM(conn))) { + /* + * Check to see if the only thing in this directory are + * vetoed files/directories. If so then delete them and + * retry. If we fail to delete any of them (and we *don't* + * do a recursive delete) then fail the rmdir. + */ + BOOL all_veto_files = True; + char *dname; + void *dirptr = OpenDir(conn, directory, False); - /* Construct the full name. */ - if(strlen(directory) + strlen(dname) + 1 >= sizeof(fullname)) - { - errno = ENOMEM; - break; - } - pstrcpy(fullname, directory); - pstrcat(fullname, "/"); - pstrcat(fullname, dname); + if(dirptr != NULL) { + int dirpos = TellDir(dirptr); + while ((dname = ReadDirName(dirptr))) { + if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0)) + continue; + if(!IS_VETO_PATH(conn, dname)) { + all_veto_files = False; + break; + } + } + if(all_veto_files) { + SeekDir(dirptr,dirpos); + while ((dname = ReadDirName(dirptr))) { + pstring fullname; + SMB_STRUCT_STAT st; + + if((strcmp(dname, ".") == 0) || (strcmp(dname, "..")==0)) + continue; + + /* Construct the full name. */ + if(strlen(directory) + strlen(dname) + 1 >= sizeof(fullname)) { + errno = ENOMEM; + break; + } + pstrcpy(fullname, directory); + pstrcat(fullname, "/"); + pstrcat(fullname, dname); - if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname, False), &st) != 0) - break; - if(st.st_mode & S_IFDIR) - { - if(lp_recursive_veto_delete(SNUM(conn))) - { - if(recursive_rmdir(conn, fullname) != 0) - break; - } - if(vfs_rmdir(conn,fullname) != 0) - break; - } - else if(vfs_unlink(conn,fullname) != 0) - break; - } - CloseDir(dirptr); - /* Retry the rmdir */ - ok = (vfs_rmdir(conn,directory) == 0); - } - else - CloseDir(dirptr); - } - else - errno = ENOTEMPTY; - } + if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname, False), &st) != 0) + break; + if(st.st_mode & S_IFDIR) { + if(lp_recursive_veto_delete(SNUM(conn))) { + if(recursive_rmdir(conn, fullname) != 0) + break; + } + if(vfs_rmdir(conn,fullname) != 0) + break; + } else if(vfs_unlink(conn,fullname) != 0) + break; + } + CloseDir(dirptr); + /* Retry the rmdir */ + ok = (vfs_rmdir(conn,directory) == 0); + } else { + CloseDir(dirptr); + } + } else { + errno = ENOTEMPTY; + } + } - if (!ok) - DEBUG(3,("rmdir_internals: couldn't remove directory %s : %s\n", - directory,strerror(errno))); + if (!ok) + DEBUG(3,("rmdir_internals: couldn't remove directory %s : %s\n", directory,strerror(errno))); - return ok; + return ok; } /**************************************************************************** |