The branch, v3-0-test has been updated
       via  e9737fded98933cddbbff91fd38600f4bcc99bb2 (commit)
      from  8c12b31481d7c1f8acdec006977c556337adb98f (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-0-test


- Log -----------------------------------------------------------------
commit e9737fded98933cddbbff91fd38600f4bcc99bb2
Author: Jeremy Allison <[EMAIL PROTECTED]>
Date:   Wed Jul 2 16:10:50 2008 -0700

    Canonicalize servername in the printer functions to remove leading '\\' 
characters. Ensure we always return consistent names.
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/rpc_server/srv_spoolss_nt.c |  110 +++++++++++++++++++-----------------
 1 files changed, 58 insertions(+), 52 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/rpc_server/srv_spoolss_nt.c 
b/source/rpc_server/srv_spoolss_nt.c
index 5ccc91c..b4b9521 100644
--- a/source/rpc_server/srv_spoolss_nt.c
+++ b/source/rpc_server/srv_spoolss_nt.c
@@ -73,6 +73,18 @@ struct xcv_api_table {
        WERROR(*fn) (NT_USER_TOKEN *token, RPC_BUFFER *in, RPC_BUFFER *out, 
uint32 *needed);
 };
 
+/********************************************************************
+ * Canonicalize servername.
+ ********************************************************************/
+
+static const char *canon_servername(const char *servername)
+{
+       const char *pservername = servername;
+       while (*pservername == '\\') {
+               pservername++;
+       }
+       return pservername;
+}
 
 /* translate between internal status numbers and NT status numbers */
 static int nt_printj_status(int v)
@@ -444,13 +456,12 @@ static BOOL set_printer_hnd_name(Printer_entry *Printer, 
char *handlename)
 
        aprinter = handlename;
        if ( *handlename == '\\' ) {
-               servername = handlename + 2;
-               if ( (aprinter = strchr_m( handlename+2, '\\' )) != NULL ) {
+               servername = canon_servername(handlename);
+               if ( (aprinter = strchr_m( servername, '\\' )) != NULL ) {
                        *aprinter = '\0';
                        aprinter++;
                }
-       }
-       else {
+       } else {
                servername = "";
        }
        
@@ -4639,20 +4650,16 @@ static WERROR enumprinters_level1( uint32 flags, 
fstring name,
  * handle enumeration of printers at level 2
  ********************************************************************/
 
-static WERROR enumprinters_level2( uint32 flags, fstring servername,
+static WERROR enumprinters_level2( uint32 flags, const char *servername,
                                 RPC_BUFFER *buffer, uint32 offered,
                                 uint32 *needed, uint32 *returned)
 {
-       char *s = servername;
-
        if (flags & PRINTER_ENUM_LOCAL) {
                        return enum_all_printers_info_2(buffer, offered, 
needed, returned);
        }
 
        if (flags & PRINTER_ENUM_NAME) {
-               if ((servername[0] == '\\') && (servername[1] == '\\'))
-                       s = servername + 2;
-               if (is_myname_or_ipaddr(s))
+               if (is_myname_or_ipaddr(canon_servername(servername)))
                        return enum_all_printers_info_2(buffer, offered, 
needed, returned);
                else
                        return WERR_INVALID_NAME;
@@ -4668,7 +4675,7 @@ static WERROR enumprinters_level2( uint32 flags, fstring 
servername,
  * handle enumeration of printers at level 5
  ********************************************************************/
 
-static WERROR enumprinters_level5( uint32 flags, fstring servername,
+static WERROR enumprinters_level5( uint32 flags, const char *servername,
                                 RPC_BUFFER *buffer, uint32 offered,
                                 uint32 *needed, uint32 *returned)
 {
@@ -5046,7 +5053,7 @@ WERROR _spoolss_getprinter(pipes_struct *p, 
SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET
  * fill a DRIVER_INFO_1 struct
  ********************************************************************/
 
-static void fill_printer_driver_info_1(DRIVER_INFO_1 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, fstring servername, fstring architecture)
+static void fill_printer_driver_info_1(DRIVER_INFO_1 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, const char *servername, fstring 
architecture)
 {
        init_unistr( &info->name, driver.info_3->name);
 }
@@ -5055,7 +5062,7 @@ static void fill_printer_driver_info_1(DRIVER_INFO_1 
*info, NT_PRINTER_DRIVER_IN
  * construct_printer_driver_info_1
  ********************************************************************/
 
-static WERROR construct_printer_driver_info_1(DRIVER_INFO_1 *info, int snum, 
fstring servername, fstring architecture, uint32 version)
+static WERROR construct_printer_driver_info_1(DRIVER_INFO_1 *info, int snum, 
const char *servername, fstring architecture, uint32 version)
 {      
        NT_PRINTER_INFO_LEVEL *printer = NULL;
        NT_PRINTER_DRIVER_INFO_LEVEL driver;
@@ -5082,9 +5089,10 @@ static WERROR 
construct_printer_driver_info_1(DRIVER_INFO_1 *info, int snum, fst
  * fill a printer_info_2 struct
  ********************************************************************/
 
-static void fill_printer_driver_info_2(DRIVER_INFO_2 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, fstring servername)
+static void fill_printer_driver_info_2(DRIVER_INFO_2 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, const char *servername)
 {
        pstring temp;
+       const char *cservername = canon_servername(servername);
 
        info->version=driver.info_3->cversion;
 
@@ -5093,19 +5101,19 @@ static void fill_printer_driver_info_2(DRIVER_INFO_2 
*info, NT_PRINTER_DRIVER_IN
 
 
     if (strlen(driver.info_3->driverpath)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->driverpath);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->driverpath);
                init_unistr( &info->driverpath, temp );
     } else
         init_unistr( &info->driverpath, "" );
 
        if (strlen(driver.info_3->datafile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->datafile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->datafile);
                init_unistr( &info->datafile, temp );
        } else
                init_unistr( &info->datafile, "" );
        
        if (strlen(driver.info_3->configfile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->configfile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->configfile);
                init_unistr( &info->configfile, temp ); 
        } else
                init_unistr( &info->configfile, "" );
@@ -5116,7 +5124,7 @@ static void fill_printer_driver_info_2(DRIVER_INFO_2 
*info, NT_PRINTER_DRIVER_IN
  * fill a printer_info_2 struct
  ********************************************************************/
 
-static WERROR construct_printer_driver_info_2(DRIVER_INFO_2 *info, int snum, 
fstring servername, fstring architecture, uint32 version)
+static WERROR construct_printer_driver_info_2(DRIVER_INFO_2 *info, int snum, 
const char *servername, fstring architecture, uint32 version)
 {
        NT_PRINTER_INFO_LEVEL *printer = NULL;
        NT_PRINTER_DRIVER_INFO_LEVEL driver;
@@ -5170,7 +5178,7 @@ static uint32 init_unistr_array(uint16 **uni_array, 
fstring *char_array, const c
                   the list of dependent files */
                   
                if ( servername )
-                       slprintf( line, sizeof(line)-1, "\\\\%s%s", servername, 
v );
+                       slprintf( line, sizeof(line)-1, "\\\\%s%s", 
canon_servername(servername), v );
                else
                        pstrcpy( line, v );
                        
@@ -5209,9 +5217,10 @@ static uint32 init_unistr_array(uint16 **uni_array, 
fstring *char_array, const c
  * fill a printer_info_3 struct
  ********************************************************************/
 
-static void fill_printer_driver_info_3(DRIVER_INFO_3 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, fstring servername)
+static void fill_printer_driver_info_3(DRIVER_INFO_3 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, const char *servername)
 {
        pstring temp;
+       const char *cservername = canon_servername(servername);
 
        ZERO_STRUCTP(info);
 
@@ -5221,25 +5230,25 @@ static void fill_printer_driver_info_3(DRIVER_INFO_3 
*info, NT_PRINTER_DRIVER_IN
        init_unistr( &info->architecture, driver.info_3->environment );
 
        if (strlen(driver.info_3->driverpath)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->driverpath);              
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->driverpath);             
                init_unistr( &info->driverpath, temp );
        } else
                init_unistr( &info->driverpath, "" );
     
        if (strlen(driver.info_3->datafile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->datafile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->datafile);
                init_unistr( &info->datafile, temp );
        } else
                init_unistr( &info->datafile, "" );
 
        if (strlen(driver.info_3->configfile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->configfile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->configfile);
                init_unistr( &info->configfile, temp ); 
        } else
                init_unistr( &info->configfile, "" );
 
        if (strlen(driver.info_3->helpfile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->helpfile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->helpfile);
                init_unistr( &info->helpfile, temp );
        } else
                init_unistr( &info->helpfile, "" );
@@ -5248,7 +5257,7 @@ static void fill_printer_driver_info_3(DRIVER_INFO_3 
*info, NT_PRINTER_DRIVER_IN
        init_unistr( &info->defaultdatatype, driver.info_3->defaultdatatype );
 
        info->dependentfiles=NULL;
-       init_unistr_array(&info->dependentfiles, driver.info_3->dependentfiles, 
servername);
+       init_unistr_array(&info->dependentfiles, driver.info_3->dependentfiles, 
cservername);
 }
 
 /********************************************************************
@@ -5256,7 +5265,7 @@ static void fill_printer_driver_info_3(DRIVER_INFO_3 
*info, NT_PRINTER_DRIVER_IN
  * fill a printer_info_3 struct
  ********************************************************************/
 
-static WERROR construct_printer_driver_info_3(DRIVER_INFO_3 *info, int snum, 
fstring servername, fstring architecture, uint32 version)
+static WERROR construct_printer_driver_info_3(DRIVER_INFO_3 *info, int snum, 
const char *servername, fstring architecture, uint32 version)
 {      
        NT_PRINTER_INFO_LEVEL *printer = NULL;
        NT_PRINTER_DRIVER_INFO_LEVEL driver;
@@ -5315,10 +5324,11 @@ static WERROR 
construct_printer_driver_info_3(DRIVER_INFO_3 *info, int snum, fst
  * fill a printer_info_6 struct - we know that driver is really level 3. This 
sucks. JRA.
  ********************************************************************/
 
-static void fill_printer_driver_info_6(DRIVER_INFO_6 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, fstring servername)
+static void fill_printer_driver_info_6(DRIVER_INFO_6 *info, 
NT_PRINTER_DRIVER_INFO_LEVEL driver, const char *servername)
 {
        pstring temp;
        fstring nullstr;
+       const char *cservername = canon_servername(servername);
 
        ZERO_STRUCTP(info);
        memset(&nullstr, '\0', sizeof(fstring));
@@ -5329,25 +5339,25 @@ static void fill_printer_driver_info_6(DRIVER_INFO_6 
*info, NT_PRINTER_DRIVER_IN
        init_unistr( &info->architecture, driver.info_3->environment );
 
        if (strlen(driver.info_3->driverpath)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->driverpath);              
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->driverpath);             
                init_unistr( &info->driverpath, temp );
        } else
                init_unistr( &info->driverpath, "" );
 
        if (strlen(driver.info_3->datafile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->datafile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->datafile);
                init_unistr( &info->datafile, temp );
        } else
                init_unistr( &info->datafile, "" );
 
        if (strlen(driver.info_3->configfile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->configfile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->configfile);
                init_unistr( &info->configfile, temp ); 
        } else
                init_unistr( &info->configfile, "" );
 
        if (strlen(driver.info_3->helpfile)) {
-               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername, 
driver.info_3->helpfile);
+               slprintf(temp, sizeof(temp)-1, "\\\\%s%s", cservername, 
driver.info_3->helpfile);
                init_unistr( &info->helpfile, temp );
        } else
                init_unistr( &info->helpfile, "" );
@@ -5379,7 +5389,7 @@ static void fill_printer_driver_info_6(DRIVER_INFO_6 
*info, NT_PRINTER_DRIVER_IN
  ********************************************************************/
 
 static WERROR construct_printer_driver_info_6(DRIVER_INFO_6 *info, int snum, 
-              fstring servername, fstring architecture, uint32 version)
+              const char *servername, fstring architecture, uint32 version)
 {      
        NT_PRINTER_INFO_LEVEL           *printer = NULL;
        NT_PRINTER_DRIVER_INFO_LEVEL    driver;
@@ -5446,7 +5456,7 @@ static void free_printer_driver_info_6(DRIVER_INFO_6 
*info)
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinterdriver2_level1(fstring servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
+static WERROR getprinterdriver2_level1(const char *servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
 {
        DRIVER_INFO_1 *info=NULL;
        WERROR result;
@@ -5484,7 +5494,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinterdriver2_level2(fstring servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
+static WERROR getprinterdriver2_level2(const char *servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
 {
        DRIVER_INFO_2 *info=NULL;
        WERROR result;
@@ -5522,7 +5532,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinterdriver2_level3(fstring servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
+static WERROR getprinterdriver2_level3(const char *servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
 {
        DRIVER_INFO_3 info;
        WERROR result;
@@ -5558,7 +5568,7 @@ out:
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinterdriver2_level6(fstring servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
+static WERROR getprinterdriver2_level6(const char *servername, fstring 
architecture, uint32 version, int snum, RPC_BUFFER *buffer, uint32 offered, 
uint32 *needed)
 {
        DRIVER_INFO_6 info;
        WERROR result;
@@ -6787,7 +6797,7 @@ WERROR _spoolss_setjob(pipes_struct *p, SPOOL_Q_SETJOB 
*q_u, SPOOL_R_SETJOB *r_u
  Enumerates all printer drivers at level 1.
 ****************************************************************************/
 
-static WERROR enumprinterdrivers_level1(fstring servername, fstring 
architecture, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 
*returned)
+static WERROR enumprinterdrivers_level1(const char *servername, fstring 
architecture, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 
*returned)
 {
        int i;
        int ndrivers;
@@ -6871,7 +6881,7 @@ out:
  Enumerates all printer drivers at level 2.
 ****************************************************************************/
 
-static WERROR enumprinterdrivers_level2(fstring servername, fstring 
architecture, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 
*returned)
+static WERROR enumprinterdrivers_level2(const char *servername, fstring 
architecture, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 
*returned)
 {
        int i;
        int ndrivers;
@@ -6956,7 +6966,7 @@ out:
  Enumerates all printer drivers at level 3.
 ****************************************************************************/
 
-static WERROR enumprinterdrivers_level3(fstring servername, fstring 
architecture, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 
*returned)
+static WERROR enumprinterdrivers_level3(const char *servername, fstring 
architecture, RPC_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 
*returned)
 {
        int i;
        int ndrivers;
@@ -7052,7 +7062,7 @@ WERROR _spoolss_enumprinterdrivers( pipes_struct *p, 
SPOOL_Q_ENUMPRINTERDRIVERS
        uint32 offered = q_u->offered;
        uint32 *needed = &r_u->needed;
        uint32 *returned = &r_u->returned;
-
+       const char *cservername;
        fstring servername;
        fstring architecture;
 
@@ -7073,16 +7083,18 @@ WERROR _spoolss_enumprinterdrivers( pipes_struct *p, 
SPOOL_Q_ENUMPRINTERDRIVERS
        unistr2_to_ascii(architecture, &q_u->environment, 
sizeof(architecture)-1);
        unistr2_to_ascii(servername, &q_u->name, sizeof(servername)-1);
 
-       if ( !is_myname_or_ipaddr( servername ) )
+       cservername = canon_servername(servername);
+
+       if (!is_myname_or_ipaddr(cservername))
                return WERR_UNKNOWN_PRINTER_DRIVER;
 
        switch (level) {
        case 1:
-               return enumprinterdrivers_level1(servername, architecture, 
buffer, offered, needed, returned);
+               return enumprinterdrivers_level1(cservername, architecture, 
buffer, offered, needed, returned);
        case 2:
-               return enumprinterdrivers_level2(servername, architecture, 
buffer, offered, needed, returned);
+               return enumprinterdrivers_level2(cservername, architecture, 
buffer, offered, needed, returned);
        case 3:
-               return enumprinterdrivers_level3(servername, architecture, 
buffer, offered, needed, returned);
+               return enumprinterdrivers_level3(cservername, architecture, 
buffer, offered, needed, returned);
        default:
                return WERR_UNKNOWN_LEVEL;
        }
@@ -7852,7 +7864,7 @@ static WERROR getprinterdriverdir_level_1(UNISTR2 *name, 
UNISTR2 *uni_environmen
        pstring path;
        pstring long_archi;
        fstring servername;
-       char *pservername; 
+       const char *pservername; 
        const char *short_archi;
        DRIVER_DIRECTORY_1 *info=NULL;
        WERROR result = WERR_OK;
@@ -7860,13 +7872,7 @@ static WERROR getprinterdriverdir_level_1(UNISTR2 *name, 
UNISTR2 *uni_environmen
        unistr2_to_ascii(servername, name, sizeof(servername)-1);
        unistr2_to_ascii(long_archi, uni_environment, sizeof(long_archi)-1);
 
-       /* check for beginning double '\'s and that the server
-          long enough */
-
-       pservername = servername;
-       if ( *pservername == '\\' && strlen(servername)>2 ) {
-               pservername += 2;
-       } 
+       pservername = canon_servername(servername);
        
        if ( !is_myname_or_ipaddr( pservername ) )
                return WERR_INVALID_PARAM;


-- 
Samba Shared Repository

Reply via email to