The branch, master has been updated via 3975203 s3-spoolss: fix do_drv_upgrade_printer() which must have been broken since the days we moved away from fstrings. via fa3264f s3-net: better handle obscure 0x80070002 error reply when trying to update an not yet published printer. via 21576e3 s3-net: make sure we dont crash when publishing a single printer. via 5cb5e0a s3-spoolss: make sure we dont crash on NULL setprinter level2 elements as seen from win7. via 48fca54 s3-spoolss: dont overwrite location change notify. from 62d87f8 s3-selftest: added samba3.posix_s3.rpc.spoolss.printer to knownfail
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 3975203a0242a01fe6d3737f8f04ec80e90cb831 Author: Günther Deschner <g...@samba.org> Date: Fri Oct 1 06:42:58 2010 +0200 s3-spoolss: fix do_drv_upgrade_printer() which must have been broken since the days we moved away from fstrings. Guenther commit fa3264f89b1de8c7a284b8bc4469a80db7c6084f Author: Günther Deschner <g...@samba.org> Date: Fri Oct 1 06:08:47 2010 +0200 s3-net: better handle obscure 0x80070002 error reply when trying to update an not yet published printer. Guenther commit 21576e3f8c32878910460bf9575c200ad93d682a Author: Günther Deschner <g...@samba.org> Date: Fri Oct 1 06:08:12 2010 +0200 s3-net: make sure we dont crash when publishing a single printer. Guenther commit 5cb5e0aa9881758ec9f5af7da4fbc002ba91f49b Author: Günther Deschner <g...@samba.org> Date: Fri Oct 1 06:07:25 2010 +0200 s3-spoolss: make sure we dont crash on NULL setprinter level2 elements as seen from win7. Guenther commit 48fca54a29375dfad84a9863c70fed8b88d70221 Author: Günther Deschner <g...@samba.org> Date: Fri Oct 1 06:05:38 2010 +0200 s3-spoolss: dont overwrite location change notify. Guenther ----------------------------------------------------------------------- Summary of changes: source3/include/proto.h | 3 +++ source3/printing/notify.c | 13 +++++++++++++ source3/rpc_server/srv_spoolss_nt.c | 33 +++++++++++++++++++++------------ source3/utils/net_rpc_printer.c | 15 ++++++++++++--- 4 files changed, 49 insertions(+), 15 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/include/proto.h b/source3/include/proto.h index 5cdb956..866836f 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -4044,6 +4044,9 @@ void notify_printer_byname(struct tevent_context *ev, struct messaging_context *msg_ctx, const char *printername, uint32 change, const char *value); +void notify_printer_sepfile(struct tevent_context *ev, + struct messaging_context *msg_ctx, + int snum, const char *sepfile); /* The following definitions come from printing/pcap.c */ diff --git a/source3/printing/notify.c b/source3/printing/notify.c index 9f07f6c..84a979e 100644 --- a/source3/printing/notify.c +++ b/source3/printing/notify.c @@ -577,6 +577,19 @@ void notify_printer_location(struct tevent_context *ev, snum, strlen(location) + 1, location); } +void notify_printer_sepfile(struct tevent_context *ev, + struct messaging_context *msg_ctx, + int snum, const char *sepfile) +{ + const char *sharename = lp_servicename(snum); + + send_notify_field_buffer( + ev, msg_ctx, + sharename, PRINTER_NOTIFY_TYPE, PRINTER_NOTIFY_FIELD_SEPFILE, + snum, strlen(sepfile) + 1, sepfile); +} + + void notify_printer_byname(struct tevent_context *ev, struct messaging_context *msg_ctx, const char *printername, uint32 change, diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 889c370..bb3b05d 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -1493,7 +1493,6 @@ void do_drv_upgrade_printer(struct messaging_context *msg, const char *drivername; int snum; int n_services = lp_numservices(); - size_t len; tmp_ctx = talloc_new(NULL); if (!tmp_ctx) return; @@ -1505,8 +1504,7 @@ void do_drv_upgrade_printer(struct messaging_context *msg, goto done; } - len = MIN(data->length,sizeof(drivername)-1); - drivername = talloc_strndup(tmp_ctx, (const char *)data->data, len); + drivername = talloc_strndup(tmp_ctx, (const char *)data->data, data->length); if (!drivername) { DEBUG(0, ("do_drv_upgrade_printer: Out of memoery ?!\n")); goto done; @@ -1522,6 +1520,11 @@ void do_drv_upgrade_printer(struct messaging_context *msg, continue; } + /* ignore [printers] share */ + if (strequal(lp_const_servicename(snum), "printers")) { + continue; + } + result = winreg_get_printer(tmp_ctx, server_info, msg, lp_const_servicename(snum), &pinfo2); @@ -6127,7 +6130,8 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, printer->drivername)); notify_printer_driver(server_event_context(), msg_ctx, - snum, printer->drivername); + snum, printer->drivername ? + printer->drivername : ""); } } @@ -6145,7 +6149,8 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, if (!force_update) { notify_printer_comment(server_event_context(), msg_ctx, - snum, printer->comment); + snum, printer->comment ? + printer->comment : ""); } } @@ -6164,7 +6169,8 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, if (!force_update) { notify_printer_sharename(server_event_context(), msg_ctx, - snum, printer->sharename); + snum, printer->sharename ? + printer->sharename : ""); } } @@ -6191,7 +6197,7 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, if (!force_update) { notify_printer_printername(server_event_context(), - msg_ctx, snum, p); + msg_ctx, snum, p ? p : ""); } } @@ -6209,7 +6215,8 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, if (!force_update) { notify_printer_port(server_event_context(), - msg_ctx, snum, printer->portname); + msg_ctx, snum, printer->portname ? + printer->portname : ""); } } @@ -6228,7 +6235,8 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, if (!force_update) { notify_printer_location(server_event_context(), msg_ctx, snum, - printer->location); + printer->location ? + printer->location : ""); } } @@ -6245,9 +6253,10 @@ static WERROR update_dsspooler(TALLOC_CTX *mem_ctx, buffer.length); if (!force_update) { - notify_printer_location(server_event_context(), - msg_ctx, snum, - printer->location); + notify_printer_sepfile(server_event_context(), + msg_ctx, snum, + printer->sepfile ? + printer->sepfile : ""); } } diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c index 589a569..0396e2a 100644 --- a/source3/utils/net_rpc_printer.c +++ b/source3/utils/net_rpc_printer.c @@ -1093,6 +1093,11 @@ static bool get_printer_info(struct rpc_pipe_client *pipe_hnd, &hnd)) return false; + *info_p = talloc_zero(mem_ctx, union spoolss_PrinterInfo); + if (*info_p == NULL) { + return false; + } + if (!net_spoolss_getprinter(pipe_hnd, mem_ctx, &hnd, level, *info_p)) { rpccli_spoolss_ClosePrinter(pipe_hnd, mem_ctx, &hnd, NULL); return false; @@ -1317,9 +1322,13 @@ static NTSTATUS rpc_printer_publish_internals_args(struct rpc_pipe_client *pipe_ 0, /* command */ &result); - if (!W_ERROR_IS_OK(result) && (W_ERROR_V(result) != W_ERROR_V(WERR_IO_PENDING))) { - printf(_("cannot set printer-info: %s\n"), - win_errstr(result)); + if (!W_ERROR_IS_OK(result) && !W_ERROR_EQUAL(result, WERR_IO_PENDING)) { + if ((action == DSPRINT_UPDATE) && W_ERROR_EQUAL(result, W_ERROR(0x80070002))) { + printf(_("printer not published yet\n")); + } else { + printf(_("cannot set printer-info: %s\n"), + win_errstr(result)); + } goto done; } -- Samba Shared Repository