Ignore:
Timestamp:
May 13, 2014, 11:39:04 AM (11 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update trunk to 3.6.23

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source3/rpc_server/spoolss/srv_spoolss_nt.c

    r751 r862  
    17451745        result = open_printer_hnd(p, r->out.handle, r->in.printername, 0);
    17461746        if (!W_ERROR_IS_OK(result)) {
    1747                 DEBUG(0,("_spoolss_OpenPrinterEx: Cannot open a printer handle "
     1747                DEBUG(3,("_spoolss_OpenPrinterEx: Cannot open a printer handle "
    17481748                        "for printer %s\n", r->in.printername));
    17491749                ZERO_STRUCTP(r->out.handle);
     
    19431943         */
    19441944
    1945          if ((Printer->printer_type != SPLHND_SERVER) &&
    1946              r->in.devmode_ctr.devmode) {
     1945         if ((Printer->printer_type != SPLHND_SERVER)
     1946          && (r->in.devmode_ctr.devmode != NULL)) {
    19471947                copy_devicemode(NULL, r->in.devmode_ctr.devmode,
    19481948                                &Printer->devmode);
    19491949         }
    1950 
    1951 #if 0   /* JERRY -- I'm doubtful this is really effective */
    1952         /* HACK ALERT!!! Sleep for 1/3 of a second to try trigger a LAN/WAN
    1953            optimization in Windows 2000 clients  --jerry */
    1954 
    1955         if ( (r->in.access_mask == PRINTER_ACCESS_ADMINISTER)
    1956                 && (RA_WIN2K == get_remote_arch()) )
    1957         {
    1958                 DEBUG(10,("_spoolss_OpenPrinterEx: Enabling LAN/WAN hack for Win2k clients.\n"));
    1959                 sys_usleep( 500000 );
    1960         }
    1961 #endif
    19621950
    19631951        return WERR_OK;
     
    40384026        r->averageppm           = info2->averageppm;
    40394027
    4040         copy_devicemode(mem_ctx, info2->devmode, &r->devmode);
    4041         if (!r->devmode) {
     4028        if (info2->devmode != NULL) {
     4029                result = copy_devicemode(mem_ctx,
     4030                                         info2->devmode,
     4031                                         &r->devmode);
     4032                if (!W_ERROR_IS_OK(result)) {
     4033                        return result;
     4034                }
     4035        } else if (lp_default_devmode(snum)) {
     4036                result = spoolss_create_default_devmode(mem_ctx,
     4037                                                        info2->printername,
     4038                                                        &r->devmode);
     4039                if (!W_ERROR_IS_OK(result)) {
     4040                        return result;
     4041                }
     4042        } else {
     4043                r->devmode = NULL;
    40424044                DEBUG(8,("Returning NULL Devicemode!\n"));
    40434045        }
     
    41754177{
    41764178        struct auth_serversupplied_info *session_info;
    4177         struct GUID guid;
     4179        char *printer;
    41784180        NTSTATUS status;
    4179 
    4180         status = make_session_info_system(mem_ctx, &session_info);
     4181        WERROR werr;
     4182        TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
     4183        if (tmp_ctx == NULL) {
     4184                return WERR_NOMEM;
     4185        }
     4186
     4187        status = make_session_info_system(tmp_ctx, &session_info);
    41814188        if (!NT_STATUS_IS_OK(status)) {
    41824189                DEBUG(0, ("construct_printer_info7: "
    41834190                          "Could not create system session_info\n"));
    4184                 return WERR_NOMEM;
    4185         }
    4186 
    4187         if (is_printer_published(mem_ctx, session_info, msg_ctx,
    4188                                  servername,
    4189                                  lp_servicename(snum), &guid, NULL)) {
     4191                werr = WERR_NOMEM;
     4192                goto out_tmp_free;
     4193        }
     4194
     4195        printer = lp_servicename(snum);
     4196        if (printer == NULL) {
     4197                DEBUG(0, ("invalid printer snum %d\n", snum));
     4198                werr = WERR_INVALID_PARAM;
     4199                goto out_tmp_free;
     4200        }
     4201
     4202        if (is_printer_published(tmp_ctx, session_info, msg_ctx,
     4203                                 servername, printer, NULL)) {
     4204                struct GUID guid;
     4205                werr = nt_printer_guid_get(tmp_ctx, session_info, msg_ctx,
     4206                                           printer, &guid);
     4207                if (!W_ERROR_IS_OK(werr)) {
     4208                        goto out_tmp_free;
     4209                }
    41904210                r->guid = talloc_strdup_upper(mem_ctx, GUID_string2(mem_ctx, &guid));
    41914211                r->action = DSPRINT_PUBLISH;
     
    41944214                r->action = DSPRINT_UNPUBLISH;
    41954215        }
    4196         W_ERROR_HAVE_NO_MEMORY(r->guid);
    4197 
    4198         TALLOC_FREE(session_info);
    4199         return WERR_OK;
     4216        if (r->guid == NULL) {
     4217                werr = WERR_NOMEM;
     4218                goto out_tmp_free;
     4219        }
     4220
     4221        werr = WERR_OK;
     4222out_tmp_free:
     4223        talloc_free(tmp_ctx);
     4224        return werr;
    42004225}
    42014226
     
    42194244        }
    42204245
    4221         copy_devicemode(mem_ctx, info2->devmode, &r->devmode);
    4222         if (!r->devmode) {
     4246        if (info2->devmode != NULL) {
     4247                result = copy_devicemode(mem_ctx,
     4248                                         info2->devmode,
     4249                                         &r->devmode);
     4250                if (!W_ERROR_IS_OK(result)) {
     4251                        return result;
     4252                }
     4253        } else if (lp_default_devmode(snum)) {
     4254                result = spoolss_create_default_devmode(mem_ctx,
     4255                                                        info2->printername,
     4256                                                        &r->devmode);
     4257                if (!W_ERROR_IS_OK(result)) {
     4258                        return result;
     4259                }
     4260        } else {
     4261                r->devmode = NULL;
    42234262                DEBUG(8,("Returning NULL Devicemode!\n"));
    42244263        }
     
    44274466        DEBUG(4,("enum_all_printers_info_1_name\n"));
    44284467
    4429         if ((servername[0] == '\\') && (servername[1] == '\\')) {
     4468        if (servername != NULL &&
     4469            (servername[0] == '\\') && (servername[1] == '\\')) {
    44304470                s = servername + 2;
    44314471        }
     
    44624502           WERR_CAN_NOT_COMPLETE so we should do the same. */
    44634503
    4464         if (servername[0] == '\\' && servername[1] == '\\') {
     4504        if (servername != NULL &&
     4505            (servername[0] == '\\') && (servername[1] == '\\')) {
    44654506                 s = servername + 2;
    44664507        }
     
    55925633        struct printer_handle *printer;
    55935634        WERROR result;
     5635        uint32_t version = r->in.client_major_version;
    55945636
    55955637        int snum;
     
    56145656        if (!get_printer_snum(p, r->in.handle, &snum, NULL)) {
    56155657                return WERR_BADFID;
     5658        }
     5659
     5660        if (r->in.client_major_version == SPOOLSS_DRIVER_VERSION_2012) {
     5661                DEBUG(3,("_spoolss_GetPrinterDriver2: v4 driver requested, "
     5662                        "downgrading to v3\n"));
     5663                version = SPOOLSS_DRIVER_VERSION_200X;
    56165664        }
    56175665
     
    56225670                                                     snum, printer->servername,
    56235671                                                     r->in.architecture,
    5624                                                      r->in.client_major_version);
     5672                                                     version);
    56255673        if (!W_ERROR_IS_OK(result)) {
    56265674                TALLOC_FREE(r->out.info);
     
    57225770
    57235771        if (info_1->datatype) {
    5724                 if (strcmp(info_1->datatype, "RAW") != 0) {
     5772                /*
     5773                 * The v4 driver model used in Windows 8 declares print jobs
     5774                 * intended to bypass the XPS processing layer by setting
     5775                 * datatype to "XPS_PASS" instead of "RAW".
     5776                 */
     5777                if ((strcmp(info_1->datatype, "RAW") != 0)
     5778                 && (strcmp(info_1->datatype, "XPS_PASS") != 0)) {
    57255779                        *r->out.job_id = 0;
    57265780                        return WERR_INVALID_DATATYPE;
Note: See TracChangeset for help on using the changeset viewer.