The branch, master has been updated via db0ea16 s3-spoolss: Check return type of update_dsspooler(). via c3c3d3a s3-spoolss: Check return codes in update_dsspooler. via fd85cd2 s3-printing: Check for browseable too. via 1a65f90 s3-printing: Make printer a const char *. via 0344897 s3-rpc_client: Add debug message for printer dataex errors. via 4bccc91 s3-rpc_server: Increase debug level for policy handle. from 26d68c3 samba3util: Add ccan to dependency list now that str_checksum() uses a ccan function.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit db0ea166043416c4a5635c0f20b60f3e030c9441 Author: Andreas Schneider <a...@samba.org> Date: Tue Feb 14 11:56:37 2012 +0100 s3-spoolss: Check return type of update_dsspooler(). Autobuild-User: Andreas Schneider <a...@cryptomilk.org> Autobuild-Date: Wed Mar 14 19:38:45 CET 2012 on sn-devel-104 commit c3c3d3ac3fc0eddf8ce4d4d71ac5bf8f6bcefd4f Author: Andreas Schneider <a...@samba.org> Date: Mon Feb 13 19:00:41 2012 +0100 s3-spoolss: Check return codes in update_dsspooler. commit fd85cd25e088bfd0bd304e980fa8776cf8ca376d Author: Andreas Schneider <a...@samba.org> Date: Fri Feb 10 14:00:05 2012 +0100 s3-printing: Check for browseable too. commit 1a65f90a341752e5b6c9b3f7e8f301bb4a093d65 Author: Andreas Schneider <a...@samba.org> Date: Fri Feb 10 13:45:24 2012 +0100 s3-printing: Make printer a const char *. commit 034489718ca45a7b7e5a400f99d45387b1449746 Author: Andreas Schneider <a...@samba.org> Date: Mon Feb 13 18:57:26 2012 +0100 s3-rpc_client: Add debug message for printer dataex errors. commit 4bccc911b82d82091bbb4c22a99518172f768c93 Author: Andreas Schneider <a...@samba.org> Date: Mon Feb 13 18:58:32 2012 +0100 s3-rpc_server: Increase debug level for policy handle. ----------------------------------------------------------------------- Summary of changes: source3/include/nt_printing.h | 4 +- source3/printing/nt_printing_ads.c | 8 +- source3/rpc_client/cli_winreg_spoolss.c | 4 + source3/rpc_server/rpc_handles.c | 10 +- source3/rpc_server/spoolss/srv_spoolss_nt.c | 240 +++++++++++++++++++++------ source3/smbd/server_reload.c | 7 +- 6 files changed, 212 insertions(+), 61 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h index 08a2161..2243a3d 100644 --- a/source3/include/nt_printing.h +++ b/source3/include/nt_printing.h @@ -141,7 +141,9 @@ WERROR nt_printer_publish(TALLOC_CTX *mem_ctx, bool is_printer_published(TALLOC_CTX *mem_ctx, const struct auth_session_info *server_info, struct messaging_context *msg_ctx, - const char *servername, char *printer, struct GUID *guid, + const char *servername, + const char *printer, + struct GUID *guid, struct spoolss_PrinterInfo2 **info2); WERROR check_published_printers(struct messaging_context *msg_ctx); diff --git a/source3/printing/nt_printing_ads.c b/source3/printing/nt_printing_ads.c index 728fefb..3551148 100644 --- a/source3/printing/nt_printing_ads.c +++ b/source3/printing/nt_printing_ads.c @@ -390,7 +390,9 @@ done: bool is_printer_published(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, - const char *servername, char *printer, struct GUID *guid, + const char *servername, + const char *printer, + struct GUID *guid, struct spoolss_PrinterInfo2 **info2) { struct spoolss_PrinterInfo2 *pinfo2 = NULL; @@ -485,7 +487,9 @@ WERROR check_published_printers(struct messaging_context *msg_ctx) bool is_printer_published(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct messaging_context *msg_ctx, - const char *servername, char *printer, struct GUID *guid, + const char *servername, + const char *printer, + struct GUID *guid, struct spoolss_PrinterInfo2 **info2) { return False; diff --git a/source3/rpc_client/cli_winreg_spoolss.c b/source3/rpc_client/cli_winreg_spoolss.c index a50fcc7..49b67aa 100644 --- a/source3/rpc_client/cli_winreg_spoolss.c +++ b/source3/rpc_client/cli_winreg_spoolss.c @@ -2049,6 +2049,8 @@ WERROR winreg_get_printer_dataex(TALLOC_CTX *mem_ctx, goto done; } if (!W_ERROR_IS_OK(result)) { + DEBUG(2, ("winreg_get_printer_dataex: Could not query value %s: %s\n", + value, win_errstr(result))); goto done; } @@ -2075,6 +2077,8 @@ WERROR winreg_get_printer_dataex(TALLOC_CTX *mem_ctx, goto done; } if (!W_ERROR_IS_OK(result)) { + DEBUG(2, ("winreg_get_printer_dataex: Could not query value %s: %s\n", + value, win_errstr(result))); goto done; } diff --git a/source3/rpc_server/rpc_handles.c b/source3/rpc_server/rpc_handles.c index d547f18..f98b235 100644 --- a/source3/rpc_server/rpc_handles.c +++ b/source3/rpc_server/rpc_handles.c @@ -299,8 +299,8 @@ static struct dcesrv_handle *create_rpc_handle_internal(struct pipes_struct *p, *hnd = rpc_hnd->wire_handle; - DEBUG(4, ("Opened policy hnd[%d] ", (int)p->pipe_handles->count)); - dump_data(4, (uint8_t *)hnd, sizeof(*hnd)); + DEBUG(6, ("Opened policy hnd[%d] ", (int)p->pipe_handles->count)); + dump_data(6, (uint8_t *)hnd, sizeof(*hnd)); return rpc_hnd; } @@ -334,8 +334,8 @@ static struct dcesrv_handle *find_policy_by_hnd_internal(struct pipes_struct *p, count = 0; for (h = p->pipe_handles->handles; h != NULL; h = h->next) { if (memcmp(&h->wire_handle, hnd, sizeof(*hnd)) == 0) { - DEBUG(4,("Found policy hnd[%u] ", count)); - dump_data(4, (const uint8 *)hnd, sizeof(*hnd)); + DEBUG(6,("Found policy hnd[%u] ", count)); + dump_data(6, (const uint8 *)hnd, sizeof(*hnd)); if (data_p) { *data_p = h->data; } @@ -383,7 +383,7 @@ bool close_policy_hnd(struct pipes_struct *p, struct policy_handle *hnd) return false; } - DEBUG(3,("Closed policy\n")); + DEBUG(6,("Closed policy\n")); p->pipe_handles->count--; diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index daed990..ef987e5 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -6257,6 +6257,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, WERROR result = WERR_OK; struct dcerpc_binding_handle *b; TALLOC_CTX *tmp_ctx; + bool ok; tmp_ctx = talloc_new(mem_ctx); if (!tmp_ctx) { @@ -6271,15 +6272,26 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, goto done; } - if (force_update || !strequal(printer->drivername, old_printer->drivername)) { - push_reg_sz(tmp_ctx, &buffer, printer->drivername); - winreg_set_printer_dataex(tmp_ctx, b, + if (printer->drivername != NULL && + (force_update || + !strequal(printer->drivername, old_printer->drivername))) { + ok = push_reg_sz(tmp_ctx, &buffer, printer->drivername); + if (!ok) { + DEBUG(0, ("%s data corrupted\n", SPOOL_REG_DRIVERNAME)); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_DRIVERNAME, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_DRIVERNAME)); + goto done; + } if (!force_update) { DEBUG(10,("update_printer: changing driver [%s]! Sending event!\n", @@ -6291,15 +6303,26 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, } } - if (force_update || !strequal(printer->comment, old_printer->comment)) { - push_reg_sz(tmp_ctx, &buffer, printer->comment); - winreg_set_printer_dataex(tmp_ctx, b, + if (printer->comment != NULL && + (force_update || + !strequal(printer->comment, old_printer->comment))) { + ok = push_reg_sz(tmp_ctx, &buffer, printer->comment); + if (!ok) { + DEBUG(0, ("comment data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_DESCRIPTION, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_DESCRIPTION)); + goto done; + } if (!force_update) { notify_printer_comment(server_event_context(), msg_ctx, @@ -6308,15 +6331,26 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, } } - if (force_update || !strequal(printer->sharename, old_printer->sharename)) { - push_reg_sz(tmp_ctx, &buffer, printer->sharename); - winreg_set_printer_dataex(tmp_ctx, b, + if (printer->sharename != NULL && + (force_update || + !strequal(printer->sharename, old_printer->sharename))) { + ok = push_reg_sz(tmp_ctx, &buffer, printer->sharename); + if (!ok) { + DEBUG(0, ("sharename data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PRINTSHARENAME, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PRINTSHARENAME)); + goto done; + } if (!force_update) { notify_printer_sharename(server_event_context(), @@ -6326,7 +6360,9 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, } } - if (force_update || !strequal(printer->printername, old_printer->printername)) { + if (printer->printername != NULL && + (force_update || + !strequal(printer->printername, old_printer->printername))) { const char *p; p = strrchr(printer->printername, '\\' ); @@ -6336,14 +6372,23 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, p = printer->printername; } - push_reg_sz(tmp_ctx, &buffer, p); - winreg_set_printer_dataex(tmp_ctx, b, + ok = push_reg_sz(tmp_ctx, &buffer, p); + if (!ok) { + DEBUG(0, ("printername data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PRINTERNAME, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PRINTSHARENAME)); + goto done; + } if (!force_update) { notify_printer_printername(server_event_context(), @@ -6351,15 +6396,26 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, } } - if (force_update || !strequal(printer->portname, old_printer->portname)) { - push_reg_sz(tmp_ctx, &buffer, printer->portname); - winreg_set_printer_dataex(tmp_ctx, b, + if (printer->portname != NULL && + (force_update || + !strequal(printer->portname, old_printer->portname))) { + ok = push_reg_sz(tmp_ctx, &buffer, printer->portname); + if (!ok) { + DEBUG(0, ("portname data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PORTNAME, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PORTNAME)); + goto done; + } if (!force_update) { notify_printer_port(server_event_context(), @@ -6368,15 +6424,26 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, } } - if (force_update || !strequal(printer->location, old_printer->location)) { - push_reg_sz(tmp_ctx, &buffer, printer->location); - winreg_set_printer_dataex(tmp_ctx, b, + if (printer->location != NULL && + (force_update || + !strequal(printer->location, old_printer->location))) { + ok = push_reg_sz(tmp_ctx, &buffer, printer->location); + if (!ok) { + DEBUG(0, ("location data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_LOCATION, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_LOCATION)); + goto done; + } if (!force_update) { notify_printer_location(server_event_context(), @@ -6386,15 +6453,26 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, } } - if (force_update || !strequal(printer->sepfile, old_printer->sepfile)) { - push_reg_sz(tmp_ctx, &buffer, printer->sepfile); - winreg_set_printer_dataex(tmp_ctx, b, + if (printer->sepfile != NULL && + (force_update || + !strequal(printer->sepfile, old_printer->sepfile))) { + ok = push_reg_sz(tmp_ctx, &buffer, printer->sepfile); + if (!ok) { + DEBUG(0, ("sepfile data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PRINTSEPARATORFILE, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PRINTSEPARATORFILE)); + goto done; + } if (!force_update) { notify_printer_sepfile(server_event_context(), @@ -6404,53 +6482,73 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, } } - if (force_update || printer->starttime != old_printer->starttime) { + if (printer->starttime != 0 && + (force_update || + printer->starttime != old_printer->starttime)) { buffer = data_blob_talloc(tmp_ctx, NULL, 4); SIVAL(buffer.data, 0, printer->starttime); - winreg_set_printer_dataex(tmp_ctx, b, + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PRINTSTARTTIME, REG_DWORD, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PRINTSTARTTIME)); + goto done; + } } - if (force_update || printer->untiltime != old_printer->untiltime) { + if (printer->untiltime != 0 && + (force_update || + printer->untiltime != old_printer->untiltime)) { buffer = data_blob_talloc(tmp_ctx, NULL, 4); SIVAL(buffer.data, 0, printer->untiltime); - winreg_set_printer_dataex(tmp_ctx, b, + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PRINTENDTIME, REG_DWORD, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PRINTENDTIME)); + goto done; + } } if (force_update || printer->priority != old_printer->priority) { buffer = data_blob_talloc(tmp_ctx, NULL, 4); SIVAL(buffer.data, 0, printer->priority); - winreg_set_printer_dataex(tmp_ctx, b, + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PRIORITY, REG_DWORD, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PRINTENDTIME)); + goto done; + } } if (force_update || printer->attributes != old_printer->attributes) { buffer = data_blob_talloc(tmp_ctx, NULL, 4); SIVAL(buffer.data, 0, (printer->attributes & PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS)); - winreg_set_printer_dataex(tmp_ctx, b, + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_PRINTKEEPPRINTEDJOBS, REG_DWORD, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_PRINTENDTIME)); + goto done; + } switch (printer->attributes & 0x3) { case 0: @@ -6465,7 +6563,12 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, default: spooling = "unknown"; } - push_reg_sz(tmp_ctx, &buffer, spooling); + ok = push_reg_sz(tmp_ctx, &buffer, spooling); + if (!ok) { + DEBUG(0, ("printSpooling data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, @@ -6475,14 +6578,23 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, buffer.length); } - push_reg_sz(tmp_ctx, &buffer, lp_netbios_name()); - winreg_set_printer_dataex(tmp_ctx, b, + ok = push_reg_sz(tmp_ctx, &buffer, lp_netbios_name()); + if (!ok) { + DEBUG(0, ("shortServerName data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_SHORTSERVERNAME, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_SHORTSERVERNAME)); + goto done; + } dnsdomname = get_mydnsfullname(); if (dnsdomname != NULL && dnsdomname[0] != '\0') { @@ -6495,25 +6607,43 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, goto done; } - push_reg_sz(tmp_ctx, &buffer, longname); - winreg_set_printer_dataex(tmp_ctx, b, - printer->sharename, - SPOOL_DSSPOOLER_KEY, - SPOOL_REG_SERVERNAME, - REG_SZ, - buffer.data, - buffer.length); + ok = push_reg_sz(tmp_ctx, &buffer, longname); + if (!ok) { + DEBUG(0, ("longname data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, + printer->sharename, + SPOOL_DSSPOOLER_KEY, + SPOOL_REG_SERVERNAME, + REG_SZ, + buffer.data, + buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_SERVERNAME)); + goto done; + } uncname = talloc_asprintf(tmp_ctx, "\\\\%s\\%s", lp_netbios_name(), printer->sharename); - push_reg_sz(tmp_ctx, &buffer, uncname); - winreg_set_printer_dataex(tmp_ctx, b, + ok = push_reg_sz(tmp_ctx, &buffer, uncname); + if (!ok) { + DEBUG(0, ("uncName data corrupted\n")); + result = WERR_INVALID_DATA; + goto done; + } + result = winreg_set_printer_dataex(tmp_ctx, b, printer->sharename, SPOOL_DSSPOOLER_KEY, SPOOL_REG_UNCNAME, REG_SZ, buffer.data, buffer.length); + if (!W_ERROR_IS_OK(result)) { + DEBUG(0, ("Failed to set %s\n", SPOOL_REG_UNCNAME)); + goto done; + } done: -- Samba Shared Repository