Magellan Linux

Contents of /trunk/samba/patches/samba-3.0.24-spoolss.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 153 - (show annotations) (download)
Tue May 8 20:52:56 2007 UTC (17 years ago) by niro
File size: 6649 byte(s)
-import

1 Index: samba-3.0.24/source/rpc_server/srv_spoolss_nt.c
2 ===================================================================
3 --- samba-3.0.24.orig/source/rpc_server/srv_spoolss_nt.c 2007-02-04 12:59:21.000000000 -0600
4 +++ samba-3.0.24/source/rpc_server/srv_spoolss_nt.c 2007-02-15 11:02:09.000000000 -0600
5 @@ -5848,6 +5848,12 @@
6 goto done;
7 }
8
9 + if (!secdesc_ctr) {
10 + DEBUG(10,("update_printer_sec: secdesc_ctr is NULL !\n"));
11 + result = WERR_INVALID_PARAM;
12 + goto done;
13 + }
14 +
15 /* Check the user has permissions to change the security
16 descriptor. By experimentation with two NT machines, the user
17 requires Full Access to the printer to change security
18 @@ -9378,6 +9384,15 @@
19
20 /* housekeeping information in the reply */
21
22 + /* Fix from Martin Zielinski <mz@seh.de> - ensure
23 + * the hand marshalled container size is a multiple
24 + * of 4 bytes for RPC alignment.
25 + */
26 +
27 + if (needed % 4) {
28 + needed += 4-(needed % 4);
29 + }
30 +
31 r_u->needed = needed;
32 r_u->returned = num_entries;
33
34 Index: samba-3.0.24/source/printing/nt_printing.c
35 ===================================================================
36 --- samba-3.0.24.orig/source/printing/nt_printing.c 2007-02-04 13:09:01.000000000 -0600
37 +++ samba-3.0.24/source/printing/nt_printing.c 2007-02-15 11:02:09.000000000 -0600
38 @@ -2984,11 +2984,15 @@
39 return True;
40 }
41
42 +/*****************************************************************
43 + ****************************************************************/
44 +
45 static void store_printer_guid(NT_PRINTER_INFO_LEVEL_2 *info2,
46 struct uuid guid)
47 {
48 int i;
49 REGVAL_CTR *ctr=NULL;
50 + UNISTR2 unistr_guid;
51
52 /* find the DsSpooler key */
53 if ((i = lookup_printerkey(info2->data, SPOOL_DSSPOOLER_KEY)) < 0)
54 @@ -2996,8 +3000,18 @@
55 ctr = info2->data->keys[i].values;
56
57 regval_ctr_delvalue(ctr, "objectGUID");
58 - regval_ctr_addvalue(ctr, "objectGUID", REG_BINARY,
59 - (char *) &guid, sizeof(struct uuid));
60 +
61 + /* We used to store this as a REG_BINARY but that causes
62 + Vista to whine */
63 +
64 + ZERO_STRUCT( unistr_guid );
65 + init_unistr2( &unistr_guid, smb_uuid_string_static(guid),
66 + UNI_STR_TERMINATE );
67 +
68 + regval_ctr_addvalue(ctr, "objectGUID", REG_SZ,
69 + (char *)unistr_guid.buffer,
70 + unistr_guid.uni_max_len*2);
71 +
72 }
73
74 static WERROR nt_printer_publish_ads(ADS_STRUCT *ads,
75 @@ -3254,6 +3268,7 @@
76 REGISTRY_VALUE *guid_val;
77 WERROR win_rc;
78 int i;
79 + BOOL ret = False;
80
81 win_rc = get_a_printer(print_hnd, &printer, 2, lp_servicename(snum));
82
83 @@ -3267,12 +3282,36 @@
84 return False;
85 }
86
87 - /* fetching printer guids really ought to be a separate function.. */
88 - if (guid && regval_size(guid_val) == sizeof(struct uuid))
89 - memcpy(guid, regval_data_p(guid_val), sizeof(struct uuid));
90 + /* fetching printer guids really ought to be a separate function. */
91 +
92 + if ( guid ) {
93 + fstring guid_str;
94 +
95 + /* We used to store the guid as REG_BINARY, then swapped
96 + to REG_SZ for Vista compatibility so check for both */
97 +
98 + switch ( regval_type(guid_val) ){
99 + case REG_SZ:
100 + rpcstr_pull( guid_str, regval_data_p(guid_val),
101 + sizeof(guid_str)-1, -1, STR_TERMINATE );
102 + ret = smb_string_to_uuid( guid_str, guid );
103 + break;
104 + case REG_BINARY:
105 + if ( regval_size(guid_val) != sizeof(struct uuid) ) {
106 + ret = False;
107 + break;
108 + }
109 + memcpy(guid, regval_data_p(guid_val), sizeof(struct uuid));
110 + break;
111 + default:
112 + DEBUG(0,("is_printer_published: GUID value stored as "
113 + "invaluid type (%d)\n", regval_type(guid_val) ));
114 + break;
115 + }
116 + }
117
118 free_a_printer(&printer, 2);
119 - return True;
120 + return ret;
121 }
122 #else
123 WERROR nt_printer_publish(Printer_entry *print_hnd, int snum, int action)
124 @@ -3539,13 +3578,43 @@
125 break;
126 }
127
128 - /* add the new value */
129 + DEBUG(8,("specific: [%s:%s], len: %d\n", keyname, valuename, size));
130 +
131 + /* Vista doesn't like unknown REG_BINARY values in DsSpooler.
132 + Thanks to Martin Zielinski for the hint. */
133 +
134 + if ( type == REG_BINARY &&
135 + strequal( keyname, SPOOL_DSSPOOLER_KEY ) &&
136 + strequal( valuename, "objectGUID" ) )
137 + {
138 + struct uuid guid;
139 + UNISTR2 unistr_guid;
140 +
141 + ZERO_STRUCT( unistr_guid );
142 +
143 + /* convert the GUID to a UNICODE string */
144 +
145 + memcpy( &guid, data_p, sizeof(struct uuid) );
146 +
147 + init_unistr2( &unistr_guid, smb_uuid_string_static(guid),
148 + UNI_STR_TERMINATE );
149 +
150 + regval_ctr_addvalue( printer_data->keys[key_index].values,
151 + valuename, REG_SZ,
152 + (const char *)unistr_guid.buffer,
153 + unistr_guid.uni_str_len*2 );
154 +
155 + } else {
156 + /* add the value */
157 +
158 + regval_ctr_addvalue( printer_data->keys[key_index].values,
159 + valuename, type, (const char *)data_p,
160 + size );
161 + }
162
163 - regval_ctr_addvalue( printer_data->keys[key_index].values, valuename, type, (const char *)data_p, size );
164
165 SAFE_FREE(data_p); /* 'B' option to tdbpack does a malloc() */
166
167 - DEBUG(8,("specific: [%s:%s], len: %d\n", keyname, valuename, size));
168 }
169
170 return len;
171 Index: samba-3.0.24/source/rpc_server/srv_spoolss.c
172 ===================================================================
173 --- samba-3.0.24.orig/source/rpc_server/srv_spoolss.c 2006-04-19 21:29:27.000000000 -0500
174 +++ samba-3.0.24/source/rpc_server/srv_spoolss.c 2007-02-15 11:02:09.000000000 -0600
175 @@ -1477,6 +1477,15 @@
176 ZERO_STRUCT(r_u);
177
178 if(!spoolss_io_q_addprinterdriverex("", &q_u, data, 0)) {
179 + if (q_u.level != 3 && q_u.level != 6) {
180 + /* Clever hack from Martin Zielinski <mz@seh.de>
181 + * to allow downgrade from level 8 (Vista).
182 + */
183 + DEBUG(3,("api_spoolss_addprinterdriverex: unknown SPOOL_Q_ADDPRINTERDRIVEREX level %u.\n",
184 + (unsigned int)q_u.level ));
185 + setup_fault_pdu(p, NT_STATUS(DCERPC_FAULT_INVALID_TAG));
186 + return True;
187 + }
188 DEBUG(0,("spoolss_io_q_addprinterdriverex: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVEREX.\n"));
189 return False;
190 }
191 Index: samba-3.0.24/source/rpc_parse/parse_spoolss.c
192 ===================================================================
193 --- samba-3.0.24.orig/source/rpc_parse/parse_spoolss.c 2007-02-15 11:02:19.000000000 -0600
194 +++ samba-3.0.24/source/rpc_parse/parse_spoolss.c 2007-02-15 11:02:25.000000000 -0600
195 @@ -3893,7 +3893,16 @@
196 }
197 case 3:
198 {
199 - ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
200 + /* FIXME ! Our parsing here is wrong I think,
201 + * but for a level3 it makes no sense for
202 + * ptr_sec_desc to be NULL. JRA. Based on
203 + * a Vista sniff from Martin Zielinski <mz@seh.de>.
204 + */
205 + if (UNMARSHALLING(ps)) {
206 + ptr_sec_desc = 1;
207 + } else {
208 + ptr_sec_desc = q_u->info.info_3->secdesc_ptr;
209 + }
210 break;
211 }
212 }