• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt/router/samba-3.5.8/source3/torture/
1/*
2   Unix SMB/CIFS implementation.
3   SMB torture tester - unicode table dumper
4   Copyright (C) Andrew Tridgell 2001
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#include "includes.h"
21
22bool torture_utable(int dummy)
23{
24	struct cli_state *cli;
25	fstring fname, alt_name;
26	uint16_t fnum;
27	smb_ucs2_t c2;
28	int c, len, fd;
29	int chars_allowed=0, alt_allowed=0;
30	uint8 valid[0x10000];
31
32	printf("starting utable\n");
33
34	if (!torture_open_connection(&cli, 0)) {
35		return False;
36	}
37
38	memset(valid, 0, sizeof(valid));
39
40	cli_mkdir(cli, "\\utable");
41	cli_unlink(cli, "\\utable\\*", aSYSTEM | aHIDDEN);
42
43	for (c=1; c < 0x10000; c++) {
44		char *p;
45
46		SSVAL(&c2, 0, c);
47		fstrcpy(fname, "\\utable\\x");
48		p = fname+strlen(fname);
49		len = convert_string(CH_UTF16LE, CH_UNIX,
50				     &c2, 2,
51				     p, sizeof(fname)-strlen(fname), True);
52		p[len] = 0;
53		fstrcat(fname,"_a_long_extension");
54
55		if (!NT_STATUS_IS_OK(cli_open(cli, fname, O_RDWR | O_CREAT | O_TRUNC,
56				DENY_NONE, &fnum))) {
57			continue;
58		}
59
60		chars_allowed++;
61
62		cli_qpathinfo_alt_name(cli, fname, alt_name);
63
64		if (strncmp(alt_name, "X_A_L", 5) != 0) {
65			alt_allowed++;
66			valid[c] = 1;
67			d_printf("fname=[%s] alt_name=[%s]\n", fname, alt_name);
68		}
69
70		cli_close(cli, fnum);
71		cli_unlink(cli, fname, aSYSTEM | aHIDDEN);
72
73		if (c % 100 == 0) {
74			printf("%d (%d/%d)\r", c, chars_allowed, alt_allowed);
75		}
76	}
77	printf("%d (%d/%d)\n", c, chars_allowed, alt_allowed);
78
79	cli_rmdir(cli, "\\utable");
80
81	d_printf("%d chars allowed   %d alt chars allowed\n", chars_allowed, alt_allowed);
82
83	fd = open("valid.dat", O_WRONLY|O_CREAT|O_TRUNC, 0644);
84	if (fd == -1) {
85		d_printf("Failed to create valid.dat - %s", strerror(errno));
86		return False;
87	}
88	if (write(fd, valid, 0x10000) != 0x10000) {
89		d_printf("Failed to create valid.dat - %s", strerror(errno));
90		close(fd);
91		return false;
92	}
93	close(fd);
94	d_printf("wrote valid.dat\n");
95
96	return True;
97}
98
99
100static char *form_name(int c)
101{
102	static fstring fname;
103	smb_ucs2_t c2;
104	char *p;
105	int len;
106
107	fstrcpy(fname, "\\utable\\");
108	p = fname+strlen(fname);
109	SSVAL(&c2, 0, c);
110
111	len = convert_string(CH_UTF16LE, CH_UNIX,
112			     &c2, 2,
113			     p, sizeof(fname)-strlen(fname), True);
114	p[len] = 0;
115	return fname;
116}
117
118bool torture_casetable(int dummy)
119{
120	static struct cli_state *cli;
121	char *fname;
122	uint16_t fnum;
123	int c, i;
124#define MAX_EQUIVALENCE 8
125	smb_ucs2_t equiv[0x10000][MAX_EQUIVALENCE];
126	printf("starting casetable\n");
127
128	if (!torture_open_connection(&cli, 0)) {
129		return False;
130	}
131
132	memset(equiv, 0, sizeof(equiv));
133
134	cli_unlink(cli, "\\utable\\*", aSYSTEM | aHIDDEN);
135	cli_rmdir(cli, "\\utable");
136	if (!NT_STATUS_IS_OK(cli_mkdir(cli, "\\utable"))) {
137		printf("Failed to create utable directory!\n");
138		return False;
139	}
140
141	for (c=1; c < 0x10000; c++) {
142		SMB_OFF_T size;
143
144		if (c == '.' || c == '\\') continue;
145
146		printf("%04x (%c)\n", c, isprint(c)?c:'.');
147
148		fname = form_name(c);
149		if (!NT_STATUS_IS_OK(cli_ntcreate(cli, fname, 0,
150					  GENERIC_ALL_ACCESS,
151					  FILE_ATTRIBUTE_NORMAL,
152					  FILE_SHARE_NONE,
153					  FILE_OPEN_IF, 0, 0, &fnum))) {
154			printf("Failed to create file with char %04x\n", c);
155			continue;
156		}
157
158		size = 0;
159
160		if (!cli_qfileinfo(cli, fnum, NULL, &size,
161				   NULL, NULL, NULL, NULL, NULL)) continue;
162
163		if (size > 0) {
164			/* found a character equivalence! */
165			int c2[MAX_EQUIVALENCE];
166
167			if (size/sizeof(int) >= MAX_EQUIVALENCE) {
168				printf("too many chars match?? size=%ld c=0x%04x\n",
169				       (unsigned long)size, c);
170				cli_close(cli, fnum);
171				return False;
172			}
173
174			cli_read(cli, fnum, (char *)c2, 0, size);
175			printf("%04x: ", c);
176			equiv[c][0] = c;
177			for (i=0; i<size/sizeof(int); i++) {
178				printf("%04x ", c2[i]);
179				equiv[c][i+1] = c2[i];
180			}
181			printf("\n");
182			fflush(stdout);
183		}
184
185		cli_write(cli, fnum, 0, (char *)&c, size, sizeof(c));
186		cli_close(cli, fnum);
187	}
188
189	cli_unlink(cli, "\\utable\\*", aSYSTEM | aHIDDEN);
190	cli_rmdir(cli, "\\utable");
191
192	return True;
193}
194