it never amazes me when some new things crawls out of the windows
authorGerald Carter <jerry@samba.org>
Sat, 23 Aug 2003 03:34:24 +0000 (03:34 +0000)
committerGerald Carter <jerry@samba.org>
Sat, 23 Aug 2003 03:34:24 +0000 (03:34 +0000)
spooler. :-(

When installing the Adobe PS driver onto a Samba printer via cupsaddsmb,
I noticed a WIN2k client sending DeletePrinterData("DependentFiles")
pver and over.  I also noticed that we never checked to see if the
value was valid.  No now we do and return WERR_BADFILE which I think
is correct.

Next, I noticed that we never wrote the updated printer out to disk
after a succesfully DeletePrinterData[Ex]().

Finally, I found a driver (Canon BJC 1000 using the Adobe PS drivers
and foomatic PPD file) that was destroying the device name string
in the devmode.  So now get_a_printer_2() always writes out the
device name in \\server\share form.

I think these changes might fix bug 294.
(This used to be commit deb25780874b66e68ac597db24fbc50e7f7458b5)

source3/printing/nt_printing.c
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index 60a6ecba4b597b31b5742c1c43ba7dc124f19369..294b9c9018a21e18ff6f8db498e1e7f81226947b 100644 (file)
@@ -2256,7 +2256,7 @@ int unpack_devicemode(NT_DEVICEMODE **nt_devmode, char *buf, int buflen)
        int len = 0;
        int extra_len = 0;
        NT_DEVICEMODE devmode;
-
+       
        ZERO_STRUCT(devmode);
 
        len += tdb_unpack(buf+len, buflen-len, "p", nt_devmode);
@@ -3206,6 +3206,7 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, const char *sh
        int             len = 0;
        TDB_DATA kbuf, dbuf;
        fstring printername;
+       char adevice[MAXDEVICENAME];
                
        ZERO_STRUCT(info);
 
@@ -3266,6 +3267,10 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, const char *sh
                        printername));
                info.devmode = construct_nt_devicemode(printername);
        }
+       
+       safe_strcpy(adevice, info.printername, sizeof(adevice)-1);
+       fstrcpy(info.devmode->devicename, adevice);     
+
 
        len += unpack_values( &info.data, dbuf.dptr+len, dbuf.dsize-len );
 
index a903ae902989c644423695f68ce065ba7a74b343..f846813a40b86be85dc653b428e60ae4f316fc47 100755 (executable)
@@ -141,7 +141,7 @@ static BOOL api_spoolss_deleteprinterdata(pipes_struct *p)
                return False;
        }
        
-       r_u.status = _spoolss_deleteprinterdata( p, &q_u, &r_u);
+       r_u.status = _spoolss_deleteprinterdata( p, &q_u, &r_u );
 
        if (!spoolss_io_r_deleteprinterdata("", &r_u, rdata, 0)) {
                DEBUG(0,("spoolss_io_r_deleteprinterdata: unable to marshall SPOOL_R_DELETEPRINTERDATA.\n"));
index 646aac347c973986af3fd92cf3e332bf08327641..7159527a7d8d3ead86460427c71711adf6083d87 100644 (file)
@@ -8023,6 +8023,9 @@ WERROR _spoolss_deleteprinterdata(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATA *q_
        unistr2_to_ascii( valuename, value, sizeof(valuename)-1 );
 
        status = delete_printer_dataex( printer, SPOOL_PRINTERDATA_KEY, valuename );
+       
+       if ( W_ERROR_IS_OK(status) )
+               mod_a_printer( *printer, 2 );
 
        free_a_printer(&printer, 2);
 
@@ -8886,6 +8889,9 @@ WERROR _spoolss_deleteprinterdataex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATAEX
 
        status = delete_printer_dataex( printer, keyname, valuename );
 
+       if ( W_ERROR_IS_OK(status) )
+               mod_a_printer( *printer, 2 );
+               
        free_a_printer(&printer, 2);
 
        return status;