Ignore:
Timestamp:
Apr 10, 2007, 5:27:38 AM (14 years ago)
Author:
Paul Smedley
Message:

Updated source to 3.0.25rc1

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/samba/source/smbd/nttrans.c

    r22 r26  
    375375        int pnum = -1;
    376376        char *p = NULL;
     377        uint32 flags = IVAL(inbuf,smb_ntcreate_Flags);
    377378
    378379        srvstr_pull_buf(inbuf, fname, smb_buf(inbuf), sizeof(fname), STR_TERMINATE);
     
    386387         */ 
    387388
    388         set_message(outbuf,34,0,True);
     389        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     390                /* This is very strange. We
     391                 * return 50 words, but only set
     392                 * the wcnt to 42 ? It's definately
     393                 * what happens on the wire....
     394                 */
     395                set_message(outbuf,50,0,True);
     396                SCVAL(outbuf,smb_wct,42);
     397        } else {
     398                set_message(outbuf,34,0,True);
     399        }
    389400
    390401        p = outbuf + smb_vwv2;
     
    401412        /* Device state. */
    402413        SSVAL(p,2, 0x5FF); /* ? */
     414        p += 4;
     415
     416        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     417                p += 26;
     418                SIVAL(p,0,FILE_GENERIC_ALL);
     419                /*
     420                 * For pipes W2K3 seems to return
     421                 * 0x12019B next.
     422                 * This is ((FILE_GENERIC_READ|FILE_GENERIC_WRITE) & ~FILE_APPEND_DATA)
     423                 */
     424                SIVAL(p,4,(FILE_GENERIC_READ|FILE_GENERIC_WRITE)&~FILE_APPEND_DATA);
     425        }
    403426
    404427        DEBUG(5,("do_ntcreate_pipe_open: open pipe = %s\n", fname));
     
    848871        }
    849872
    850 #if 0
    851         /* W2K sends back 42 words here ! If we do the same it breaks offline sync. Go figure... ? JRA. */
    852         set_message(outbuf,42,0,True);
    853 #else
    854         set_message(outbuf,34,0,True);
    855 #endif
    856        
     873        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     874                /* This is very strange. We
     875                 * return 50 words, but only set
     876                 * the wcnt to 42 ? It's definately
     877                 * what happens on the wire....
     878                 */
     879                set_message(outbuf,50,0,True);
     880                SCVAL(outbuf,smb_wct,42);
     881        } else {
     882                set_message(outbuf,34,0,True);
     883        }
     884
    857885        p = outbuf + smb_vwv2;
    858886       
     
    915943        SCVAL(p,0,fsp->is_directory ? 1 : 0);
    916944
     945        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     946                uint32 perms = 0;
     947                p += 26;
     948                if (fsp->is_directory || can_write_to_file(conn, fname, &sbuf)) {
     949                        perms = FILE_GENERIC_ALL;
     950                } else {
     951                        perms = FILE_GENERIC_READ|FILE_EXECUTE;
     952                }
     953                SIVAL(p,0,perms);
     954        }
     955
    917956        DEBUG(5,("reply_ntcreate_and_X: fnum = %d, open name = %s\n", fsp->fnum, fsp->fsp_name));
    918957
     
    937976        char *p = NULL;
    938977        NTSTATUS status;
     978        size_t param_len;
     979        uint32 flags;
    939980
    940981        /*
     
    947988        }
    948989
     990        flags = IVAL(params,0);
     991
    949992        srvstr_get_path(inbuf, fname, params+53, sizeof(fname), parameter_count-53, STR_TERMINATE, &status);
    950993        if (!NT_STATUS_IS_OK(status)) {
     
    9571000       
    9581001        /* Realloc the size of parameters and data we will return */
    959         params = nttrans_realloc(ppparams, 69);
     1002        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     1003                /* Extended response is 32 more byyes. */
     1004                param_len = 101;
     1005        } else {
     1006                param_len = 69;
     1007        }
     1008        params = nttrans_realloc(ppparams, param_len);
    9601009        if(params == NULL) {
    9611010                return ERROR_DOS(ERRDOS,ERRnomem);
     
    9781027        /* Device state. */
    9791028        SSVAL(p,2, 0x5FF); /* ? */
    980        
     1029        p += 4;
     1030       
     1031        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     1032                p += 26;
     1033                SIVAL(p,0,FILE_GENERIC_ALL);
     1034                /*
     1035                 * For pipes W2K3 seems to return
     1036                 * 0x12019B next.
     1037                 * This is ((FILE_GENERIC_READ|FILE_GENERIC_WRITE) & ~FILE_APPEND_DATA)
     1038                 */
     1039                SIVAL(p,4,(FILE_GENERIC_READ|FILE_GENERIC_WRITE)&~FILE_APPEND_DATA);
     1040        }
     1041
    9811042        DEBUG(5,("do_nt_transact_create_pipe: open name = %s\n", fname));
    9821043       
    9831044        /* Send the required number of replies */
    984         send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, 69, *ppdata, 0);
     1045        send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, param_len, *ppdata, 0);
    9851046       
    9861047        return -1;
     
    11271188        char *pdata = NULL;
    11281189        NTSTATUS status;
     1190        size_t param_len;
    11291191
    11301192        DEBUG(5,("call_nt_transact_create\n"));
     
    14971559
    14981560        /* Realloc the size of parameters and data we will return */
    1499         params = nttrans_realloc(ppparams, 69);
     1561        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     1562                /* Extended response is 32 more byyes. */
     1563                param_len = 101;
     1564        } else {
     1565                param_len = 69;
     1566        }
     1567        params = nttrans_realloc(ppparams, param_len);
    15001568        if(params == NULL) {
    15011569                return ERROR_DOS(ERRDOS,ERRnomem);
     
    15561624        SCVAL(p,0,fsp->is_directory ? 1 : 0);
    15571625
     1626        if (flags & EXTENDED_RESPONSE_REQUIRED) {
     1627                uint32 perms = 0;
     1628                p += 26;
     1629                if (fsp->is_directory || can_write_to_file(conn, fname, &sbuf)) {
     1630                        perms = FILE_GENERIC_ALL;
     1631                } else {
     1632                        perms = FILE_GENERIC_READ|FILE_EXECUTE;
     1633                }
     1634                SIVAL(p,0,perms);
     1635        }
     1636
    15581637        DEBUG(5,("call_nt_transact_create: open name = %s\n", fname));
    15591638
    15601639        /* Send the required number of replies */
    1561         send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, 69, *ppdata, 0);
     1640        send_nt_replies(outbuf, bufsize, NT_STATUS_OK, params, param_len, *ppdata, 0);
    15621641
    15631642        return -1;
Note: See TracChangeset for help on using the changeset viewer.