svn commit: samba r2534 - in branches/SAMBA_4_0/source/libcli/auth: .

abartlet at samba.org abartlet at samba.org
Wed Sep 22 21:45:52 GMT 2004


Author: abartlet
Date: 2004-09-22 21:45:52 +0000 (Wed, 22 Sep 2004)
New Revision: 2534

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source/libcli/auth&rev=2534&nolog=1

Log:
Change NTLMSSP parsing to avoid a seperate str_chrnum() call - storing
away the string as a data blob to be put in the buffers later.

This also avoids a length-limited push_str, moving to push_ucs2_talloc().

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/libcli/auth/ntlmssp_parse.c


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/auth/ntlmssp_parse.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/auth/ntlmssp_parse.c	2004-09-22 20:51:15 UTC (rev 2533)
+++ branches/SAMBA_4_0/source/libcli/auth/ntlmssp_parse.c	2004-09-22 21:45:52 UTC (rev 2534)
@@ -43,13 +43,20 @@
 BOOL msrpc_gen(TALLOC_CTX *mem_ctx, DATA_BLOB *blob,
 	       const char *format, ...)
 {
-	int i, n;
+	int i;
+	ssize_t n;
 	va_list ap;
 	char *s;
 	uint8_t *b;
 	int head_size=0, data_size=0;
 	int head_ofs, data_ofs;
+	int *intargs;
 
+	DATA_BLOB *pointers;
+
+	pointers = talloc_array_p(mem_ctx, DATA_BLOB, strlen(format));
+	intargs = talloc_array_p(pointers, int, strlen(format));
+
 	/* first scan the format to work out the header and body size */
 	va_start(ap, format);
 	for (i=0; format[i]; i++) {
@@ -57,34 +64,60 @@
 		case 'U':
 			s = va_arg(ap, char *);
 			head_size += 8;
-			data_size += str_charnum(s) * 2;
+			n = push_ucs2_talloc(pointers, (smb_ucs2_t **)&pointers[i].data, s);
+			if (n == -1) {
+				return False;
+			}
+			pointers[i].length = n;
+			pointers[i].length -= 2;
+			data_size += pointers[i].length;
 			break;
 		case 'A':
 			s = va_arg(ap, char *);
 			head_size += 8;
-			data_size += str_ascii_charnum(s);
+			n = push_ascii_talloc(pointers, (char **)&pointers[i].data, s);
+			if (n == -1) {
+				return False;
+			}
+			pointers[i].length = n;
+			pointers[i].length -= 1;
+			data_size += pointers[i].length;
 			break;
 		case 'a':
 			n = va_arg(ap, int);
+			intargs[i] = n;
 			s = va_arg(ap, char *);
-			data_size += (str_charnum(s) * 2) + 4;
+			n = push_ucs2_talloc(pointers, (smb_ucs2_t **)&pointers[i].data, s);
+			if (n == -1) {
+				return False;
+			}
+			pointers[i].length = n;
+			pointers[i].length -= 2;
+			data_size += pointers[i].length + 4;
 			break;
 		case 'B':
 			b = va_arg(ap, uint8_t *);
 			head_size += 8;
-			data_size += va_arg(ap, int);
+			pointers[i].data = b;
+			pointers[i].length = va_arg(ap, int);
+			data_size += pointers[i].length;
 			break;
 		case 'b':
 			b = va_arg(ap, uint8_t *);
-			head_size += va_arg(ap, int);
+			pointers[i].data = b;
+			pointers[i].length = va_arg(ap, int);
+			head_size += pointers[i].length;
 			break;
 		case 'd':
 			n = va_arg(ap, int);
+			intargs[i] = n;
 			head_size += 4;
 			break;
 		case 'C':
 			s = va_arg(ap, char *);
-			head_size += str_charnum(s) + 1;
+			pointers[i].data = s;
+			pointers[i].length = strlen(s)+1;
+			head_size += pointers[i].length;
 			break;
 		}
 	}
@@ -100,64 +133,47 @@
 	for (i=0; format[i]; i++) {
 		switch (format[i]) {
 		case 'U':
-			s = va_arg(ap, char *);
-			n = str_charnum(s);
-			SSVAL(blob->data, head_ofs, n*2); head_ofs += 2;
-			SSVAL(blob->data, head_ofs, n*2); head_ofs += 2;
-			SIVAL(blob->data, head_ofs, data_ofs); head_ofs += 4;
-			push_string(NULL, blob->data+data_ofs, s, n*2, STR_UNICODE|STR_NOALIGN);
-			data_ofs += n*2;
-			break;
 		case 'A':
-			s = va_arg(ap, char *);
-			n = str_ascii_charnum(s);
+		case 'B':
+			n = pointers[i].length;
 			SSVAL(blob->data, head_ofs, n); head_ofs += 2;
 			SSVAL(blob->data, head_ofs, n); head_ofs += 2;
 			SIVAL(blob->data, head_ofs, data_ofs); head_ofs += 4;
-			push_string(NULL, blob->data+data_ofs, s, n, STR_ASCII|STR_NOALIGN);
+			if (pointers[i].data && n) /* don't follow null pointers... */
+				memcpy(blob->data+data_ofs, pointers[i].data, n);
 			data_ofs += n;
 			break;
 		case 'a':
-			n = va_arg(ap, int);
+			n = intargs[i];
 			SSVAL(blob->data, data_ofs, n); data_ofs += 2;
-			s = va_arg(ap, char *);
-			n = str_charnum(s);
-			SSVAL(blob->data, data_ofs, n*2); data_ofs += 2;
-			if (0 < n) {
-				push_string(NULL, blob->data+data_ofs, s, n*2,
-					    STR_UNICODE|STR_NOALIGN);
+
+			n = pointers[i].length;
+			SSVAL(blob->data, data_ofs, n); data_ofs += 2;
+			if (n >= 0) {
+				memcpy(blob->data+data_ofs, pointers[i].data, n);
 			}
-			data_ofs += n*2;
-			break;
-
-		case 'B':
-			b = va_arg(ap, uint8_t *);
-			n = va_arg(ap, int);
-			SSVAL(blob->data, head_ofs, n); head_ofs += 2;
-			SSVAL(blob->data, head_ofs, n); head_ofs += 2;
-			SIVAL(blob->data, head_ofs, data_ofs); head_ofs += 4;
-			if (n && b) /* don't follow null pointers... */
-				memcpy(blob->data+data_ofs, b, n);
 			data_ofs += n;
 			break;
 		case 'd':
-			n = va_arg(ap, int);
-			SIVAL(blob->data, head_ofs, n); head_ofs += 4;
+			n = intargs[i];
+			SIVAL(blob->data, head_ofs, n); 
+			head_ofs += 4;
 			break;
 		case 'b':
-			b = va_arg(ap, uint8_t *);
-			n = va_arg(ap, int);
-			memcpy(blob->data + head_ofs, b, n);
+			n = pointers[i].length;
+			memcpy(blob->data + head_ofs, pointers[i].data, n);
 			head_ofs += n;
 			break;
 		case 'C':
-			s = va_arg(ap, char *);
-			head_ofs += push_string(NULL, blob->data+head_ofs, s, -1, 
-						STR_ASCII|STR_TERMINATE);
+			n = pointers[i].length;
+			memcpy(blob->data + head_ofs, pointers[i].data, n);
+			head_ofs += n;
 			break;
 		}
 	}
 	va_end(ap);
+	
+	talloc_free(pointers);
 
 	return True;
 }



More information about the samba-cvs mailing list