summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/printing/nt_printing.c11
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c67
2 files changed, 30 insertions, 48 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index c70a6891d4..3712cfbb14 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -1431,9 +1431,8 @@ NT_DEVICEMODE *construct_nt_devicemode(const fstring default_devicename)
ZERO_STRUCTP(nt_devmode);
- snprintf(adevice, sizeof(adevice), "\\\\%s\\%s", global_myname, default_devicename);
- fstrcpy(nt_devmode->devicename, adevice);
-
+ safe_strcpy(adevice, default_devicename, sizeof(adevice));
+ fstrcpy(nt_devmode->devicename, adevice);
fstrcpy(nt_devmode->formname, "Letter");
@@ -1663,8 +1662,10 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin
snum = lp_servicenumber(sharename);
- fstrcpy(info.servername, global_myname);
- fstrcpy(info.printername, sharename);
+ slprintf(info.servername, sizeof(info.servername), "\\\\%s", global_myname);
+ slprintf(info.printername, sizeof(info.printername), "\\\\%s\\%s",
+ global_myname, sharename);
+ fstrcpy(info.sharename, sharename);
fstrcpy(info.portname, SAMBA_PRINTER_PORT_NAME);
fstrcpy(info.drivername, lp_printerdriver(snum));
pstrcpy(info.comment, "");
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 67b29bdbcf..86c97b33ef 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -1103,12 +1103,19 @@ static void spoolss_notify_server_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, p
static void spoolss_notify_printer_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue,
NT_PRINTER_INFO_LEVEL *printer)
{
+ /* the notify name should not contain the \\server\ part */
+ char *p = strrchr(printer->info_2->printername, '\\');
+ if (!p) {
+ p = printer->info_2->printername;
+ } else {
+ p++;
+ }
/*
data->notify_data.data.length=strlen(lp_servicename(snum));
dos_PutUniCode(data->notify_data.data.string, lp_servicename(snum), sizeof(data->notify_data.data.string), True);
*/
data->notify_data.data.length=(uint32)((dos_PutUniCode((char *)data->notify_data.data.string,
- printer->info_2->printername, sizeof(data->notify_data.data.string), True) - sizeof(uint16))/sizeof(uint16));
+ p, sizeof(data->notify_data.data.string), True) - sizeof(uint16))/sizeof(uint16));
}
/*******************************************************************
@@ -1871,8 +1878,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring
*/
global_counter=session_counter->counter;
- /* the description and the name are of the form \\server\share */
- slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s",servername, ntprinter->info_2->printername);
+ pstrcpy(chaine,ntprinter->info_2->printername);
init_unistr(&printer->printername, chaine);
@@ -2013,7 +2019,7 @@ static DEVICEMODE *construct_dev_mode(int snum, char *servername)
DEBUGADD(8,("loading DEVICEMODE\n"));
- snprintf(adevice, sizeof(adevice), "\\\\%s\\%s", global_myname, printer->info_2->printername);
+ safe_strcpy(adevice, printer->info_2->printername, sizeof(adevice));
init_unistr(&devmode->devicename, adevice);
snprintf(aform, sizeof(aform), ntdevmode->formname);
@@ -3433,50 +3439,25 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level,
/********************************************************************
Do Samba sanity checks on a printer info struct.
+ this has changed purpose: it now "canonicalises" printer
+ info from a client rather than just checking it is correct
********************************************************************/
static BOOL check_printer_ok(NT_PRINTER_INFO_LEVEL_2 *info, int snum)
{
- /*
- * Ensure that this printer is shared under the correct name
- * as this is what Samba insists upon.
- */
-
- if (!(info->attributes & (PRINTER_ATTRIBUTE_SHARED|PRINTER_ATTRIBUTE_NETWORK))) {
- DEBUG(10,("check_printer_ok: SHARED/NETWORK check failed (%x).\n",
- (unsigned int)info->attributes ));
- return False;
- }
-
- if (!(info->attributes & PRINTER_ATTRIBUTE_RAW_ONLY)) {
- /* NT forgets to set the raw attribute but sends the correct type. */
- if (strequal(info->datatype, "RAW"))
- info->attributes |= PRINTER_ATTRIBUTE_RAW_ONLY;
- else {
- DEBUG(10,("check_printer_ok: RAW check failed (%x).\n", (unsigned int)info->attributes ));
- return False;
- }
- }
-
- /*
- * Sometimes the NT client doesn't set the sharename, but
- * includes the sharename in the printername. This could
- * cause SETPRINTER to fail which causes problems with the
- * client getting confused between local/remote printers...
- */
-
- if (*info->sharename == '\0') {
- char *p = strrchr(info->printername, '\\');
- if (p)
- fstrcpy(info->sharename, p+1);
- }
-
- if (!strequal(info->sharename, lp_servicename(snum))) {
- DEBUG(10,("check_printer_ok: NAME check failed (%s) (%s).\n",
- info->sharename, lp_servicename(snum)));
- return False;
- }
+ DEBUG(5,("check_printer_ok: servername=%s printername=%s sharename=%s portname=%s drivername=%s comment=%s location=%s\n",
+ info->servername, info->printername, info->sharename, info->portname, info->drivername, info->comment, info->location));
+ /* we force some elements to "correct" values */
+ slprintf(info->servername, sizeof(info->servername), "\\\\%s", global_myname);
+ slprintf(info->printername, sizeof(info->printername), "\\\\%s\\%s",
+ global_myname, lp_servicename(snum));
+ fstrcpy(info->sharename, lp_servicename(snum));
+ info->attributes = PRINTER_ATTRIBUTE_SHARED \
+ | PRINTER_ATTRIBUTE_LOCAL \
+ | PRINTER_ATTRIBUTE_RAW_ONLY \
+ | PRINTER_ATTRIBUTE_QUEUED ;
+
return True;
}