Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/smbd/dir.c

    r478 r740  
    2020
    2121#include "includes.h"
     22#include "system/filesys.h"
     23#include "smbd/smbd.h"
    2224#include "smbd/globals.h"
     25#include "libcli/security/security.h"
    2326
    2427/*
     
    6366};
    6467
     68static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
     69                        files_struct *fsp,
     70                        const char *mask,
     71                        uint32 attr);
    6572
    6673#define INVALID_DPTR_KEY (-3)
     
    8693        }
    8794
    88         if ((mode & aDIR) != 0) {
     95        if ((mode & FILE_ATTRIBUTE_DIRECTORY) != 0) {
    8996                size = 0;
    9097        }
     
    118125bool init_dptrs(struct smbd_server_connection *sconn)
    119126{
    120         if (sconn->smb1.searches.dptr_bmap) {
     127        if (sconn->searches.dptr_bmap) {
    121128                return true;
    122129        }
    123130
    124         sconn->smb1.searches.dptr_bmap = bitmap_allocate(MAX_DIRECTORY_HANDLES);
    125 
    126         if (sconn->smb1.searches.dptr_bmap == NULL) {
     131        sconn->searches.dptr_bmap = bitmap_talloc(
     132                sconn, MAX_DIRECTORY_HANDLES);
     133
     134        if (sconn->searches.dptr_bmap == NULL) {
    127135                return false;
    128136        }
     
    154162         * Go to the end of the list.
    155163         */
    156         for(dptr = sconn->smb1.searches.dirptrs; dptr && dptr->next; dptr = dptr->next)
    157                 ;
     164        dptr = DLIST_TAIL(sconn->searches.dirptrs);
    158165
    159166        if(!dptr) {
     
    166173         */
    167174
    168         for(; dptr; dptr = dptr->prev) {
     175        for(; dptr; dptr = DLIST_PREV(dptr)) {
    169176                if (dptr->dir_hnd) {
    170177                        dptr_idle(dptr);
     
    183190        struct dptr_struct *dptr;
    184191
    185         for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = dptr->next) {
     192        for(dptr = sconn->searches.dirptrs; dptr; dptr = dptr->next) {
    186193                if(dptr->dnum == key) {
    187194                        if (!forclose && !dptr->dir_hnd) {
    188                                 if (sconn->smb1.searches.dirhandles_open >= MAX_OPEN_DIRECTORIES)
     195                                if (sconn->searches.dirhandles_open >= MAX_OPEN_DIRECTORIES)
    189196                                        dptr_idleoldest(sconn);
    190197                                DEBUG(4,("dptr_get: Reopening dptr key %d\n",key));
     
    197204                                }
    198205                        }
    199                         DLIST_PROMOTE(sconn->smb1.searches.dirptrs,dptr);
     206                        DLIST_PROMOTE(sconn->searches.dirptrs,dptr);
    200207                        return dptr;
    201208                }
     
    254261        }
    255262
    256         DLIST_REMOVE(sconn->smb1.searches.dirptrs, dptr);
     263        DLIST_REMOVE(sconn->searches.dirptrs, dptr);
    257264
    258265        /*
     
    261268         */
    262269
    263         if(bitmap_query(sconn->smb1.searches.dptr_bmap, dptr->dnum - 1) != true) {
     270        if (!bitmap_query(sconn->searches.dptr_bmap, dptr->dnum - 1)) {
    264271                DEBUG(0,("dptr_close_internal : Error - closing dnum = %d and bitmap not set !\n",
    265272                        dptr->dnum ));
    266273        }
    267274
    268         bitmap_clear(sconn->smb1.searches.dptr_bmap, dptr->dnum - 1);
     275        bitmap_clear(sconn->searches.dptr_bmap, dptr->dnum - 1);
    269276
    270277done:
     
    291298        if (*key == -1) {
    292299                struct dptr_struct *next;
    293                 for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = next) {
     300                for(dptr = sconn->searches.dirptrs; dptr; dptr = next) {
    294301                        next = dptr->next;
    295302                        dptr_close_internal(dptr);
     
    324331        }
    325332
    326         for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = next) {
     333        for(dptr = sconn->searches.dirptrs; dptr; dptr = next) {
    327334                next = dptr->next;
    328335                if (dptr->conn == conn) {
     
    345352        }
    346353
    347         for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = dptr->next) {
     354        for(dptr = sconn->searches.dirptrs; dptr; dptr = dptr->next) {
    348355                if (dptr->conn == conn && dptr->dir_hnd) {
    349356                        dptr_idle(dptr);
     
    360367{
    361368        struct dptr_struct *dptr, *next;
    362         for(dptr = sconn->smb1.searches.dirptrs; dptr; dptr = next) {
     369        for(dptr = sconn->searches.dirptrs; dptr; dptr = next) {
    363370                next = dptr->next;
    364371                if (spid == dptr->spid && strequal(dptr->path,path))
     
    381388         * Go to the end of the list.
    382389         */
    383         for(dptr = sconn->smb1.searches.dirptrs; dptr && dptr->next; dptr = dptr->next)
     390        for(dptr = sconn->searches.dirptrs; dptr && dptr->next; dptr = dptr->next)
    384391                ;
    385392
     
    395402         */
    396403
    397         for(; dptr; dptr = dptr->prev) {
     404        for(; dptr; dptr = DLIST_PREV(dptr)) {
    398405                if ((old && (dptr->dnum < 256) && !dptr->expect_close) ||
    399406                        (!old && (dptr->dnum > 255))) {
     
    413420****************************************************************************/
    414421
    415 NTSTATUS dptr_create(connection_struct *conn, const char *path, bool old_handle, bool expect_close,uint16 spid,
     422NTSTATUS dptr_create(connection_struct *conn, files_struct *fsp,
     423                const char *path, bool old_handle, bool expect_close,uint16 spid,
    416424                const char *wcard, bool wcard_has_wild, uint32 attr, struct dptr_struct **dptr_ret)
    417425{
     
    421429        NTSTATUS status;
    422430
     431        if (fsp && fsp->is_directory && fsp->fh->fd != -1) {
     432                path = fsp->fsp_name->base_name;
     433        }
     434
    423435        DEBUG(5,("dptr_create dir=%s\n", path));
    424436
     
    432444        }
    433445
    434         status = check_name(conn,path);
    435         if (!NT_STATUS_IS_OK(status)) {
    436                 return status;
    437         }
    438 
    439         dir_hnd = OpenDir(NULL, conn, path, wcard, attr);
     446        if (fsp) {
     447                dir_hnd = OpenDir_fsp(NULL, conn, fsp, wcard, attr);
     448        } else {
     449                status = check_name(conn,path);
     450                if (!NT_STATUS_IS_OK(status)) {
     451                        return status;
     452                }
     453                dir_hnd = OpenDir(NULL, conn, path, wcard, attr);
     454        }
     455
    440456        if (!dir_hnd) {
    441457                return map_nt_error_from_unix(errno);
    442458        }
    443459
    444         if (sconn->smb1.searches.dirhandles_open >= MAX_OPEN_DIRECTORIES) {
     460        if (sconn->searches.dirhandles_open >= MAX_OPEN_DIRECTORIES) {
    445461                dptr_idleoldest(sconn);
    446462        }
     
    462478                 */
    463479
    464                 dptr->dnum = bitmap_find(sconn->smb1.searches.dptr_bmap, 0);
     480                dptr->dnum = bitmap_find(sconn->searches.dptr_bmap, 0);
    465481
    466482                if(dptr->dnum == -1 || dptr->dnum > 254) {
     
    475491
    476492                        /* Now try again... */
    477                         dptr->dnum = bitmap_find(sconn->smb1.searches.dptr_bmap, 0);
     493                        dptr->dnum = bitmap_find(sconn->searches.dptr_bmap, 0);
    478494                        if(dptr->dnum == -1 || dptr->dnum > 254) {
    479495                                DEBUG(0,("dptr_create: returned %d: Error - all old dirptrs in use ?\n", dptr->dnum));
     
    490506                 */
    491507
    492                 dptr->dnum = bitmap_find(sconn->smb1.searches.dptr_bmap, 255);
     508                dptr->dnum = bitmap_find(sconn->searches.dptr_bmap, 255);
    493509
    494510                if(dptr->dnum == -1 || dptr->dnum < 255) {
     
    504520
    505521                        /* Now try again... */
    506                         dptr->dnum = bitmap_find(sconn->smb1.searches.dptr_bmap, 255);
     522                        dptr->dnum = bitmap_find(sconn->searches.dptr_bmap, 255);
    507523
    508524                        if(dptr->dnum == -1 || dptr->dnum < 255) {
     
    515531        }
    516532
    517         bitmap_set(sconn->smb1.searches.dptr_bmap, dptr->dnum);
     533        bitmap_set(sconn->searches.dptr_bmap, dptr->dnum);
    518534
    519535        dptr->dnum += 1; /* Always bias the dnum by one - no zero dnums allowed. */
     
    526542        dptr->wcard = SMB_STRDUP(wcard);
    527543        if (!dptr->wcard) {
    528                 bitmap_clear(sconn->smb1.searches.dptr_bmap, dptr->dnum - 1);
     544                bitmap_clear(sconn->searches.dptr_bmap, dptr->dnum - 1);
    529545                SAFE_FREE(dptr);
    530546                TALLOC_FREE(dir_hnd);
     
    539555        dptr->attr = attr;
    540556
    541         DLIST_ADD(sconn->smb1.searches.dirptrs, dptr);
     557        DLIST_ADD(sconn->searches.dirptrs, dptr);
    542558
    543559        DEBUG(3,("creating new dirptr %d for path %s, expect_close = %d\n",
     
    554570****************************************************************************/
    555571
    556 int dptr_CloseDir(struct dptr_struct *dptr)
    557 {
    558         dptr_close_internal(dptr);
    559         return 0;
     572void dptr_CloseDir(files_struct *fsp)
     573{
     574        if (fsp->dptr) {
     575/*
     576 * Ugly hack. We have defined fdopendir to return ENOSYS if dirfd also isn't
     577 * present. I hate Solaris. JRA.
     578 */
     579#ifdef HAVE_DIRFD
     580                if (fsp->fh->fd != -1 &&
     581                                fsp->dptr->dir_hnd &&
     582                                dirfd(fsp->dptr->dir_hnd->dir)) {
     583                        /* The call below closes the underlying fd. */
     584                        fsp->fh->fd = -1;
     585                }
     586#endif
     587                dptr_close_internal(fsp->dptr);
     588                fsp->dptr = NULL;
     589        }
    560590}
    561591
     
    843873
    844874        /* Check the "may have" search bits. */
    845         if (((mode & ~dirtype) & (aHIDDEN | aSYSTEM | aDIR)) != 0)
     875        if (((mode & ~dirtype) & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY)) != 0)
    846876                return False;
    847877
     
    849879        /* If must have bit is set, the file/dir can not be returned in search unless the matching
    850880                file attribute is set */
    851         mask = ((dirtype >> 8) & (aDIR|aARCH|aRONLY|aHIDDEN|aSYSTEM)); /* & 0x37 */
     881        mask = ((dirtype >> 8) & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM)); /* & 0x37 */
    852882        if(mask) {
    853                 if((mask & (mode & (aDIR|aARCH|aRONLY|aHIDDEN|aSYSTEM))) == mask)   /* check if matching attribute present */
     883                if((mask & (mode & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))) == mask)   /* check if matching attribute present */
    854884                        return True;
    855885                else
     
    9811011                        fileid = vfs_file_id_from_sbuf(conn,
    9821012                                                       &smb_fname.st);
    983                         get_file_infos(fileid, NULL, &write_time_ts);
     1013                        get_file_infos(fileid, 0, NULL, &write_time_ts);
    9841014                        if (!null_timespec(write_time_ts)) {
    9851015                                update_stat_ex_mtime(&smb_fname.st,
     
    11271157{
    11281158        /*
    1129          * If user is a member of the Admin group
    1130          * we never hide files from them.
     1159         * Never hide files from the root user.
     1160         * We use (uid_t)0 here not sec_initial_uid()
     1161         * as make test uses a single user context.
    11311162         */
    11321163
    1133         if (conn->admin_user) {
     1164        if (get_current_uid(conn) == (uid_t)0) {
    11341165                return True;
    11351166        }
     
    11491180{
    11501181        /*
    1151          * If user is a member of the Admin group
    1152          * we never hide files from them.
     1182         * Never hide files from the root user.
     1183         * We use (uid_t)0 here not sec_initial_uid()
     1184         * as make test uses a single user context.
    11531185         */
    11541186
    1155         if (conn->admin_user) {
     1187        if (get_current_uid(conn) == (uid_t)0) {
    11561188                return True;
    11571189        }
     
    11761208{
    11771209        /*
    1178          * If user is a member of the Admin group
    1179          * we never hide files from them.
     1210         * Never hide files from the root user.
     1211         * We use (uid_t)0 here not sec_initial_uid()
     1212         * as make test uses a single user context.
    11801213         */
    11811214
    1182         if (conn->admin_user)
     1215        if (get_current_uid(conn) == (uid_t)0) {
    11831216                return False;
     1217        }
    11841218
    11851219        SMB_ASSERT(VALID_STAT(smb_fname->st));
     
    12231257                if (!entry) {
    12241258                        ret = false;
    1225                         goto out;
    1226                 }
    1227 
    1228                 /* If it's a dfs symlink, ignore _hide xxxx_ options */
    1229                 if (lp_host_msdfs() &&
    1230                                 lp_msdfs_root(SNUM(conn)) &&
    1231                                 is_msdfs_link(conn, entry, NULL)) {
    1232                         ret = true;
    12331259                        goto out;
    12341260                }
     
    12901316{
    12911317        if (dirp->dir) {
     1318#ifdef HAVE_DIRFD
     1319                if (dirp->conn->sconn) {
     1320                        files_struct *fsp = file_find_fd(dirp->conn->sconn,
     1321                                                dirfd(dirp->dir));
     1322                        if (fsp) {
     1323                                /* The call below closes the underlying fd. */
     1324                                fsp->fh->fd = -1;
     1325                        }
     1326                }
     1327#endif
    12921328                SMB_VFS_CLOSEDIR(dirp->conn,dirp->dir);
    12931329        }
    12941330        if (dirp->conn->sconn) {
    1295                 dirp->conn->sconn->smb1.searches.dirhandles_open--;
     1331                dirp->conn->sconn->searches.dirhandles_open--;
    12961332        }
    12971333        return 0;
     
    13031339
    13041340struct smb_Dir *OpenDir(TALLOC_CTX *mem_ctx, connection_struct *conn,
    1305                         const char *name, const char *mask, uint32 attr)
     1341                        const char *name,
     1342                        const char *mask,
     1343                        uint32 attr)
    13061344{
    13071345        struct smb_Dir *dirp = TALLOC_ZERO_P(mem_ctx, struct smb_Dir);
     
    13221360
    13231361        if (sconn) {
    1324                 sconn->smb1.searches.dirhandles_open++;
     1362                sconn->searches.dirhandles_open++;
    13251363        }
    13261364        talloc_set_destructor(dirp, smb_Dir_destructor);
     
    13391377        return NULL;
    13401378}
     1379
     1380/*******************************************************************
     1381 Open a directory from an fsp.
     1382********************************************************************/
     1383
     1384static struct smb_Dir *OpenDir_fsp(TALLOC_CTX *mem_ctx, connection_struct *conn,
     1385                        files_struct *fsp,
     1386                        const char *mask,
     1387                        uint32 attr)
     1388{
     1389        struct smb_Dir *dirp = TALLOC_ZERO_P(mem_ctx, struct smb_Dir);
     1390        struct smbd_server_connection *sconn = conn->sconn;
     1391
     1392        if (!dirp) {
     1393                return NULL;
     1394        }
     1395
     1396        dirp->conn = conn;
     1397        dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn));
     1398
     1399        dirp->dir_path = talloc_strdup(dirp, fsp->fsp_name->base_name);
     1400        if (!dirp->dir_path) {
     1401                errno = ENOMEM;
     1402                goto fail;
     1403        }
     1404
     1405        if (sconn) {
     1406                sconn->searches.dirhandles_open++;
     1407        }
     1408        talloc_set_destructor(dirp, smb_Dir_destructor);
     1409
     1410        if (fsp->is_directory && fsp->fh->fd != -1) {
     1411                dirp->dir = SMB_VFS_FDOPENDIR(fsp, mask, attr);
     1412                if (dirp->dir == NULL) {
     1413                        DEBUG(10,("OpenDir_fsp: SMB_VFS_FDOPENDIR on %s returned "
     1414                                "NULL (%s)\n",
     1415                                dirp->dir_path,
     1416                                strerror(errno)));
     1417                        if (errno != ENOSYS) {
     1418                                return NULL;
     1419                        }
     1420                }
     1421        }
     1422
     1423        if (dirp->dir == NULL) {
     1424                /* FDOPENDIR didn't work. Use OPENDIR instead. */
     1425                dirp->dir = SMB_VFS_OPENDIR(conn, dirp->dir_path, mask, attr);
     1426        }
     1427
     1428        if (!dirp->dir) {
     1429                DEBUG(5,("OpenDir_fsp: Can't open %s. %s\n", dirp->dir_path,
     1430                         strerror(errno) ));
     1431                goto fail;
     1432        }
     1433
     1434        return dirp;
     1435
     1436  fail:
     1437        TALLOC_FREE(dirp);
     1438        return NULL;
     1439}
     1440
    13411441
    13421442/*******************************************************************
     
    15341634        char *talloced = NULL;
    15351635        SMB_STRUCT_STAT st;
    1536         struct smb_Dir *dir_hnd = OpenDir(talloc_tos(), conn, dirname,
    1537                                           NULL, 0);
     1636        struct smb_Dir *dir_hnd = OpenDir(talloc_tos(), conn,
     1637                                        dirname, NULL, 0);
    15381638
    15391639        if (!dir_hnd) {
Note: See TracChangeset for help on using the changeset viewer.