Changeset 427 for vendor/current/source4


Ignore:
Timestamp:
Apr 9, 2010, 3:20:58 PM (15 years ago)
Author:
Silvan Scherrer
Message:

Samba 3.5.x: update to 3.5.2

Location:
vendor/current/source4
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source4/ntptr/simple_ldb/ntptr_simple_ldb.c

    r414 r427  
    123123 * PrintServer PrinterData functions
    124124 */
    125 static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC_CTX *mem_ctx,
    126                                       struct spoolss_GetPrinterData *r)
     125
     126static WERROR sptr_PrintServerData(struct ntptr_GenericHandle *server,
     127                                   TALLOC_CTX *mem_ctx,
     128                                   const char *value_name,
     129                                   union spoolss_PrinterData *r,
     130                                   enum winreg_Type *type)
    127131{
    128132        struct dcerpc_server_info *server_info = lp_dcerpc_server_info(mem_ctx, server->ntptr->lp_ctx);
    129         if (strcmp("W3SvcInstalled", r->in.value_name) == 0) {
    130                 *r->out.type            = REG_DWORD;
    131                 r->out.data->value      = 0;
     133        if (strcmp("W3SvcInstalled", value_name) == 0) {
     134                *type           = REG_DWORD;
     135                r->value        = 0;
    132136                return WERR_OK;
    133         } else if (strcmp("BeepEnabled", r->in.value_name) == 0) {
    134                 *r->out.type            = REG_DWORD;
    135                 r->out.data->value      = 0;
     137        } else if (strcmp("BeepEnabled", value_name) == 0) {
     138                *type           = REG_DWORD;
     139                r->value        = 0;
    136140                return WERR_OK;
    137         } else if (strcmp("EventLog", r->in.value_name) == 0) {
    138                 *r->out.type            = REG_DWORD;
    139                 r->out.data->value      = 0;
     141        } else if (strcmp("EventLog", value_name) == 0) {
     142                *type           = REG_DWORD;
     143                r->value        = 0;
    140144                return WERR_OK;
    141         } else if (strcmp("NetPopup", r->in.value_name) == 0) {
    142                 *r->out.type            = REG_DWORD;
    143                 r->out.data->value      = 0;
     145        } else if (strcmp("NetPopup", value_name) == 0) {
     146                *type           = REG_DWORD;
     147                r->value        = 0;
    144148                return WERR_OK;
    145         } else if (strcmp("NetPopupToComputer", r->in.value_name) == 0) {
    146                 *r->out.type            = REG_DWORD;
    147                 r->out.data->value      = 0;
     149        } else if (strcmp("NetPopupToComputer", value_name) == 0) {
     150                *type           = REG_DWORD;
     151                r->value        = 0;
    148152                return  WERR_OK;
    149         } else if (strcmp("MajorVersion", r->in.value_name) == 0) {
    150                 *r->out.type            = REG_DWORD;
    151                 r->out.data->value      = 3;
     153        } else if (strcmp("MajorVersion", value_name) == 0) {
     154                *type           = REG_DWORD;
     155                r->value        = 3;
    152156                return WERR_OK;
    153         } else if (strcmp("MinorVersion", r->in.value_name) == 0) {
    154                 *r->out.type            = REG_DWORD;
    155                 r->out.data->value      = 0;
     157        } else if (strcmp("MinorVersion", value_name) == 0) {
     158                *type           = REG_DWORD;
     159                r->value        = 0;
    156160                return WERR_OK;
    157         } else if (strcmp("DefaultSpoolDirectory", r->in.value_name) == 0) {
    158                 *r->out.type            = REG_SZ;
    159                 r->out.data->string     = "C:\\PRINTERS";
     161        } else if (strcmp("DefaultSpoolDirectory", value_name) == 0) {
     162                *type           = REG_SZ;
     163                r->string       = talloc_strdup(mem_ctx, "C:\\PRINTERS");
     164                W_ERROR_HAVE_NO_MEMORY(r->string);
    160165                return  WERR_OK;
    161         } else if (strcmp("Architecture", r->in.value_name) == 0) {
    162                 *r->out.type            = REG_SZ;
    163                 r->out.data->string     = SPOOLSS_ARCHITECTURE_NT_X86;
     166        } else if (strcmp("Architecture", value_name) == 0) {
     167                *type           = REG_SZ;
     168                r->string       = talloc_strdup(mem_ctx, SPOOLSS_ARCHITECTURE_NT_X86);
     169                W_ERROR_HAVE_NO_MEMORY(r->string);
    164170                return  WERR_OK;
    165         } else if (strcmp("DsPresent", r->in.value_name) == 0) {
    166                 *r->out.type            = REG_DWORD;
    167                 r->out.data->value      = 1;
     171        } else if (strcmp("DsPresent", value_name) == 0) {
     172                *type           = REG_DWORD;
     173                r->value        = 1;
    168174                return WERR_OK;
    169         } else if (strcmp("OSVersion", r->in.value_name) == 0) {
     175        } else if (strcmp("OSVersion", value_name) == 0) {
    170176                DATA_BLOB blob;
    171177                enum ndr_err_code ndr_err;
     
    182188                }
    183189
    184                 *r->out.type            = REG_BINARY;
    185                 r->out.data->binary     = blob;
     190                *type           = REG_BINARY;
     191                r->binary       = blob;
    186192                return WERR_OK;
    187         } else if (strcmp("OSVersionEx", r->in.value_name) == 0) {
     193        } else if (strcmp("OSVersionEx", value_name) == 0) {
    188194                DATA_BLOB blob;
    189195                enum ndr_err_code ndr_err;
     
    205211                }
    206212
    207                 *r->out.type            = REG_BINARY;
    208                 r->out.data->binary     = blob;
     213                *type           = REG_BINARY;
     214                r->binary       = blob;
    209215                return WERR_OK;
    210         } else if (strcmp("DNSMachineName", r->in.value_name) == 0) {
     216        } else if (strcmp("DNSMachineName", value_name) == 0) {
    211217                if (!lp_realm(server->ntptr->lp_ctx)) return WERR_INVALID_PARAM;
    212218
    213                 *r->out.type            = REG_SZ;
    214                 r->out.data->string     = talloc_asprintf(mem_ctx, "%s.%s",
    215                                                                    lp_netbios_name(server->ntptr->lp_ctx),
    216                                                                    lp_realm(server->ntptr->lp_ctx));
    217                 W_ERROR_HAVE_NO_MEMORY(r->out.data->string);
     219                *type           = REG_SZ;
     220                r->string       = talloc_asprintf(mem_ctx, "%s.%s",
     221                                                   lp_netbios_name(server->ntptr->lp_ctx),
     222                                                   lp_realm(server->ntptr->lp_ctx));
     223                W_ERROR_HAVE_NO_MEMORY(r->string);
    218224                return WERR_OK;
    219225        }
    220226
    221227        return WERR_INVALID_PARAM;
     228}
     229
     230static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC_CTX *mem_ctx,
     231                                      struct spoolss_GetPrinterData *r)
     232{
     233        WERROR result;
     234        union spoolss_PrinterData data;
     235        DATA_BLOB blob;
     236        enum ndr_err_code ndr_err;
     237
     238        result = sptr_PrintServerData(server, mem_ctx, r->in.value_name, &data, r->out.type);
     239        if (!W_ERROR_IS_OK(result)) {
     240                return result;
     241        }
     242
     243        ndr_err = ndr_push_union_blob(&blob, mem_ctx, lp_iconv_convenience(server->ntptr->lp_ctx),
     244                                      &data, *r->out.type, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData);
     245        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     246                return WERR_GENERAL_FAILURE;
     247        }
     248
     249        *r->out.needed = blob.length;
     250
     251        if (r->in.offered >= *r->out.needed) {
     252                memcpy(r->out.data, blob.data, blob.length);
     253        }
     254
     255        return WERR_OK;
    222256}
    223257
  • vendor/current/source4/rpc_server/spoolss/dcesrv_spoolss.c

    r414 r427  
    580580        W_ERROR_HAVE_NO_MEMORY(r->out.needed);
    581581
    582         r->out.data = talloc_zero(mem_ctx, union spoolss_PrinterData);
     582        r->out.data = talloc_zero_array(mem_ctx, uint8_t, r->in.offered);
    583583        W_ERROR_HAVE_NO_MEMORY(r->out.data);
    584584
     
    599599        W_ERROR_NOT_OK_RETURN(status);
    600600
    601         *r->out.needed  = ndr_size_spoolss_PrinterData(r->out.data, *r->out.type, ic, 0);
    602601        *r->out.type    = SPOOLSS_BUFFER_OK(*r->out.type, REG_NONE);
    603602        r->out.data     = SPOOLSS_BUFFER_OK(r->out.data, r->out.data);
  • vendor/current/source4/torture/rpc/spoolss.c

    r414 r427  
    2929#include "librpc/gen_ndr/ndr_spoolss_c.h"
    3030#include "param/param.h"
     31#include "lib/registry/registry.h"
    3132
    3233#define TORTURE_WELLKNOWN_PRINTER       "torture_wkn_printer"
     
    119120
    120121#define CHECK_NEEDED_SIZE_ENUM_LEVEL(fn, info, level, count, ic, needed, align) do { \
     122        if (torture_setting_bool(tctx, "spoolss_check_size", false)) {\
    121123        uint32_t size = ndr_size_##fn##_info(tctx, ic, level, count, info);\
    122124        uint32_t round_size = DO_ROUND(size, align);\
     
    125127                CHECK_ALIGN(size, align);\
    126128        }\
     129        }\
    127130} while(0)
    128131
    129132#define CHECK_NEEDED_SIZE_ENUM(fn, info, count, ic, needed, align) do { \
     133        if (torture_setting_bool(tctx, "spoolss_check_size", false)) {\
    130134        uint32_t size = ndr_size_##fn##_info(tctx, ic, count, info);\
    131135        uint32_t round_size = DO_ROUND(size, align);\
     
    134138                CHECK_ALIGN(size, align);\
    135139        }\
     140        }\
    136141} while(0)
    137142
    138143#define CHECK_NEEDED_SIZE_LEVEL(fn, info, level, ic, needed, align) do { \
     144        if (torture_setting_bool(tctx, "spoolss_check_size", false)) {\
    139145        uint32_t size = ndr_size_##fn(info, level, ic, 0);\
    140146        uint32_t round_size = DO_ROUND(size, align);\
     
    142148                torture_warning(tctx, __location__": "#fn" level %d got unexpected needed size: %d, we calculated: %d", level, needed, round_size);\
    143149                CHECK_ALIGN(size, align);\
     150        }\
    144151        }\
    145152} while(0)
     
    21862193                                const char *value_name,
    21872194                                enum winreg_Type *type_p,
    2188                                 union spoolss_PrinterData *data_p)
     2195                                uint8_t **data_p,
     2196                                uint32_t *needed_p)
    21892197{
    21902198        NTSTATUS status;
     
    21992207        r.out.needed = &needed;
    22002208        r.out.type = &type;
    2201         r.out.data = &data;
     2209        r.out.data = talloc_zero_array(tctx, uint8_t, r.in.offered);
    22022210
    22032211        torture_comment(tctx, "Testing GetPrinterData(%s)\n", r.in.value_name);
     
    22082216        if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
    22092217                r.in.offered = needed;
    2210 
     2218                r.out.data = talloc_zero_array(tctx, uint8_t, r.in.offered);
    22112219                status = dcerpc_spoolss_GetPrinterData(p, tctx, &r);
    22122220                torture_assert_ntstatus_ok(tctx, status, "GetPrinterData failed");
     
    22232231
    22242232        if (data_p) {
    2225                 *data_p = data;
     2233                *data_p = r.out.data;
     2234        }
     2235
     2236        if (needed_p) {
     2237                *needed_p = needed;
    22262238        }
    22272239
     
    22352247                                  const char *value_name,
    22362248                                  enum winreg_Type *type_p,
    2237                                   union spoolss_PrinterData *data_p)
     2249                                  uint8_t **data_p,
     2250                                  uint32_t *needed_p)
    22382251{
    22392252        NTSTATUS status;
     
    22492262        r.out.type = &type;
    22502263        r.out.needed = &needed;
    2251         r.out.data = &data;
     2264        r.out.data = talloc_zero_array(tctx, uint8_t, r.in.offered);
    22522265
    22532266        torture_comment(tctx, "Testing GetPrinterDataEx(%s - %s)\n",
     
    22652278        if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
    22662279                r.in.offered = needed;
     2280                r.out.data = talloc_zero_array(tctx, uint8_t, r.in.offered);
    22672281                status = dcerpc_spoolss_GetPrinterDataEx(p, tctx, &r);
    22682282                torture_assert_ntstatus_ok(tctx, status, "GetPrinterDataEx failed");
     
    22792293
    22802294        if (data_p) {
    2281                 *data_p = data;
     2295                *data_p = r.out.data;
     2296        }
     2297
     2298        if (needed_p) {
     2299                *needed_p = needed;
    22822300        }
    22832301
     
    23082326        for (i=0; i < ARRAY_SIZE(list); i++) {
    23092327                enum winreg_Type type, type_ex;
    2310                 union spoolss_PrinterData data, data_ex;
    2311 
    2312                 torture_assert(tctx, test_GetPrinterData(tctx, p, handle, list[i], &type, &data),
     2328                uint8_t *data, *data_ex;
     2329                uint32_t needed, needed_ex;
     2330
     2331                torture_assert(tctx, test_GetPrinterData(tctx, p, handle, list[i], &type, &data, &needed),
    23132332                        talloc_asprintf(tctx, "GetPrinterData failed on %s\n", list[i]));
    2314                 torture_assert(tctx, test_GetPrinterDataEx(tctx, p, handle, "random_string", list[i], &type_ex, &data_ex),
     2333                torture_assert(tctx, test_GetPrinterDataEx(tctx, p, handle, "random_string", list[i], &type_ex, &data_ex, &needed_ex),
    23152334                        talloc_asprintf(tctx, "GetPrinterDataEx failed on %s\n", list[i]));
    23162335                torture_assert_int_equal(tctx, type, type_ex, "type mismatch");
    2317                 switch (type) {
    2318                 case REG_SZ:
    2319                         torture_assert_str_equal(tctx, data.string, data_ex.string, "REG_SZ mismatch");
    2320                         break;
    2321                 case REG_DWORD:
    2322                         torture_assert_int_equal(tctx, data.value, data_ex.value, "REG_DWORD mismatch");
    2323                         break;
    2324                 case REG_BINARY:
    2325                         torture_assert_data_blob_equal(tctx, data.binary, data_ex.binary, "REG_BINARY mismatch");
    2326                         break;
    2327                 default:
    2328                         break;
    2329                 }
     2336                torture_assert_int_equal(tctx, needed, needed_ex, "needed mismatch");
     2337                torture_assert_mem_equal(tctx, data, data_ex, needed, "data mismatch");
    23302338        }
    23312339
     
    23802388                torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterData failed");
    23812389
    2382                 torture_assert(tctx, test_GetPrinterData(tctx, p, handle, r.out.value_name, NULL, NULL),
     2390                torture_assert(tctx, test_GetPrinterData(tctx, p, handle, r.out.value_name, NULL, NULL, NULL),
    23832391                        talloc_asprintf(tctx, "failed to call GetPrinterData for %s\n", r.out.value_name));
    23842392
    2385                 torture_assert(tctx, test_GetPrinterDataEx(tctx, p, handle, "PrinterDriverData", r.out.value_name, NULL, NULL),
     2393                torture_assert(tctx, test_GetPrinterDataEx(tctx, p, handle, "PrinterDriverData", r.out.value_name, NULL, NULL, NULL),
    23862394                        talloc_asprintf(tctx, "failed to call GetPrinterDataEx on PrinterDriverData for %s\n", r.out.value_name));
    23872395
     
    25262534
    25272535                enum winreg_Type type;
    2528                 union spoolss_PrinterData data;
     2536                uint8_t *data;
     2537                DATA_BLOB blob;
     2538                uint32_t needed;
     2539
     2540                torture_assert(tctx,
     2541                        reg_string_to_val(tctx, lp_iconv_convenience(tctx->lp_ctx),
     2542                                          "REG_SZ", "dog", &r.in.type, &blob), "");
    25292543
    25302544                r.in.handle = handle;
    25312545                r.in.value_name = values[i];
    25322546                r.in.type = REG_SZ;
    2533                 r.in.data.string = "dog";
     2547                r.in.data = blob.data;
     2548                r.in.offered = blob.length;
    25342549
    25352550                torture_comment(tctx, "Testing SetPrinterData(%s)\n",
     
    25412556                torture_assert_werr_ok(tctx, r.out.result, "SetPrinterData failed");
    25422557
    2543                 if (!test_GetPrinterData(tctx, p, handle, r.in.value_name, &type, &data)) {
     2558                if (!test_GetPrinterData(tctx, p, handle, r.in.value_name, &type, &data, &needed)) {
    25442559                        return false;
    25452560                }
    25462561
    25472562                torture_assert_int_equal(tctx, r.in.type, type, "type mismatch");
    2548                 torture_assert_str_equal(tctx, r.in.data.string, data.string, "data mismatch");
     2563                torture_assert_int_equal(tctx, r.in.offered, needed, "size mismatch");
     2564                torture_assert_mem_equal(tctx, blob.data, data, needed, "buffer mismatch");
    25492565
    25502566                if (!test_DeletePrinterData(tctx, p, handle, r.in.value_name)) {
     
    26002616                enum winreg_Type type;
    26012617                const char **subkeys;
    2602                 union spoolss_PrinterData data;
     2618                uint8_t *data_out;
     2619                uint32_t needed;
    26032620
    26042621                r.in.handle = handle;
     
    26062623                r.in.value_name = value_name;
    26072624                r.in.type = REG_BINARY;
    2608                 r.in.data.binary = blob;
     2625                r.in.data = blob.data;
     2626                r.in.offered = blob.length;
    26092627
    26102628                torture_comment(tctx, "Testing SetPrinterDataEx(%s - %s)\n", r.in.key_name, value_name);
     
    26152633                torture_assert_werr_ok(tctx, r.out.result, "SetPrinterDataEx failed");
    26162634
    2617                 key = talloc_strdup(tctx, r.in.key_name);
    2618 
    2619                 if (!test_GetPrinterDataEx(tctx, p, handle, r.in.key_name, value_name, &type, &data)) {
     2635                if (!test_GetPrinterDataEx(tctx, p, handle, keys[i], value_name, &type, &data_out, &needed)) {
    26202636                        return false;
    26212637                }
    26222638
    2623                 torture_assert_int_equal(tctx, r.in.type, type, "type mismatch");
    2624                 torture_assert_data_blob_equal(tctx, blob, data.binary, "data mismatch");
     2639                torture_assert_int_equal(tctx, type, REG_BINARY, "type mismatch");
     2640                torture_assert_int_equal(tctx, needed, blob.length, "size mismatch");
     2641                torture_assert_mem_equal(tctx, data_out, blob.data, blob.length, "buffer mismatch");
     2642
     2643                key = talloc_strdup(tctx, keys[i]);
    26252644
    26262645                if (!test_EnumPrinterDataEx(tctx, p, handle, r.in.key_name)) {
     
    26732692{
    26742693        enum winreg_Type type;
    2675         union spoolss_PrinterData data;
     2694        uint8_t *data;
     2695        uint32_t needed;
    26762696
    26772697        torture_assert(tctx,
    2678                 test_GetPrinterData(tctx, p, handle, "ChangeID", &type, &data),
     2698                test_GetPrinterData(tctx, p, handle, "ChangeID", &type, &data, &needed),
    26792699                "failed to call GetPrinterData");
    26802700
    26812701        torture_assert(tctx, type == REG_DWORD, "unexpected type");
    2682 
    2683         *change_id = data.value;
     2702        torture_assert_int_equal(tctx, needed, 4, "unexpected size");
     2703
     2704        *change_id = IVAL(data, 0);
    26842705
    26852706        return true;
     
    26922713{
    26932714        enum winreg_Type type;
    2694         union spoolss_PrinterData data;
     2715        uint8_t *data;
     2716        uint32_t needed;
    26952717
    26962718        torture_assert(tctx,
    2697                 test_GetPrinterDataEx(tctx, p, handle, "PrinterDriverData", "ChangeID", &type, &data),
     2719                test_GetPrinterDataEx(tctx, p, handle, "PrinterDriverData", "ChangeID", &type, &data, &needed),
    26982720                "failed to call GetPrinterData");
    26992721
    27002722        torture_assert(tctx, type == REG_DWORD, "unexpected type");
    2701 
    2702         *change_id = data.value;
     2723        torture_assert_int_equal(tctx, needed, 4, "unexpected size");
     2724
     2725        *change_id = IVAL(data, 0);
    27032726
    27042727        return true;
  • vendor/current/source4/torture/rpc/spoolss_win.c

    r414 r427  
    161161        uint32_t needed;
    162162        enum winreg_Type type;
    163         union spoolss_PrinterData data;
     163        uint8_t *data = talloc_zero_array(tctx, uint8_t, 4);
    164164
    165165        torture_comment(tctx, "Testing GetPrinterData(%s).\n", value_name);
     
    169169        gpd.out.needed = &needed;
    170170        gpd.out.type = &type;
    171         gpd.out.data = &data;
     171        gpd.out.data = data;
    172172
    173173        status = dcerpc_spoolss_GetPrinterData(p, tctx, &gpd);
     
    177177
    178178        if (W_ERROR_IS_OK(expected_werr)) {
    179                 torture_assert_int_equal(tctx, data.value,
     179                uint32_t value = IVAL(data, 0);
     180                torture_assert_int_equal(tctx, value,
    180181                        expected_value,
    181182                        talloc_asprintf(tctx, "GetPrinterData for %s did not return expected value.", value_name));
Note: See TracChangeset for help on using the changeset viewer.