Would this be a better fix for the devicetype problem?

It looks like we are putting the strings into the buffer twice, and we
are not returning the 'fixed' devicetype for both protocol levels (< NT1
and NT1).

What happened here is that jermey 'fixed' a const warning.  This meant
that this 'in/out' buffer became an 'in' buffer, and we didn't push the
correct devicetype back to the wire.

Volker then tried to fix the specific case he hit.

Andrew Bartlett
-- 
Andrew Bartlett                                 [EMAIL PROTECTED]
Manager, Authentication Subsystems, Samba Team  [EMAIL PROTECTED]
Student Network Administrator, Hawker College   [EMAIL PROTECTED]
http://samba.org     http://build.samba.org     http://hawkerc.net
Index: smbd/reply.c
===================================================================
RCS file: /data/cvs/samba/source/smbd/reply.c,v
retrieving revision 1.422
diff -u -r1.422 reply.c
--- smbd/reply.c	25 Mar 2003 04:19:04 -0000	1.422
+++ smbd/reply.c	25 Mar 2003 10:51:14 -0000
@@ -204,16 +204,21 @@
 {
 	fstring service;
 	DATA_BLOB password;
-	fstring devicename;
+	
+	/* what the cleint thinks the device is */
+	fstring client_devicetype;
+	/* what the server tells the client the share represents */
+	const char *server_devicetype;
 	NTSTATUS nt_status;
 	uint16 vuid = SVAL(inbuf,smb_uid);
 	int passlen = SVAL(inbuf,smb_vwv3);
 	pstring path;
 	char *p, *q;
 	extern BOOL global_encrypted_passwords_negotiated;
+	
 	START_PROFILE(SMBtconX);	
 
-	*service = *devicename = 0;
+	*service = *client_devicetype = 0;
 
 	/* we might have to close an old one */
 	if ((SVAL(inbuf,smb_vwv2) & 0x1) && conn) {
@@ -250,11 +255,11 @@
 	else
 		fstrcpy(service,path);
 		
-	p += srvstr_pull(inbuf, devicename, p, sizeof(devicename), 6, STR_ASCII);
+	p += srvstr_pull(inbuf, client_devicetype, p, sizeof(client_devicetype), 6, STR_ASCII);
 
-	DEBUG(4,("Got device type %s\n",devicename));
+	DEBUG(4,("Client requested device type [%s] for share [%s]\n", client_devicetype, service));
 
-	conn = make_connection(service,password,devicename,vuid,&nt_status);
+	conn = make_connection(service,password,client_devicetype,vuid,&nt_status);
 	
 	data_blob_clear_free(&password);
 
@@ -263,37 +268,30 @@
 		return ERROR_NT(nt_status);
 	}
 
+	if ( IS_IPC(conn) )
+		server_devicetype = "IPC";
+	else if ( IS_PRINT(conn) )
+		server_devicetype = "LPT:";
+	else 
+		server_devicetype = "A:";
+
 	if (Protocol < PROTOCOL_NT1) {
 		set_message(outbuf,2,0,True);
 		p = smb_buf(outbuf);
-		p += srvstr_push(outbuf, p, devicename, -1, 
+		p += srvstr_push(outbuf, p, server_devicetype, -1, 
 				 STR_TERMINATE|STR_ASCII);
 		set_message_end(outbuf,p);
 	} else {
 		/* NT sets the fstype of IPC$ to the null string */
 		const char *fsname = IS_IPC(conn) ? "" : lp_fstype(SNUM(conn));
-		const char *devicetype;
-
 		set_message(outbuf,3,0,True);
  
-		if ( IS_IPC(conn) )
-			devicetype = "IPC";
-		else if ( IS_PRINT(conn) )
-			devicetype = "LPT:";
-		else 
-			devicetype = "A:";
-
  		p = smb_buf(outbuf);
-		p += srvstr_push(outbuf, p, IS_IPC(conn) ? "IPC" : devicetype, -1, 
+		p += srvstr_push(outbuf, p, server_devicetype, -1, 
  				 STR_TERMINATE|STR_ASCII);
  		p += srvstr_push(outbuf, p, fsname, -1, 
  				 STR_TERMINATE);
 		p = smb_buf(outbuf);
-		p += srvstr_push(outbuf, p, IS_IPC(conn) ? "IPC" : devicename, -1, 
-				 STR_TERMINATE|STR_ASCII);
-		p += srvstr_push(outbuf, p, fsname, -1, 
-				 STR_TERMINATE);
-		
 		set_message_end(outbuf,p);
 		
 		/* what does setting this bit do? It is set by NT4 and

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to