Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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

1 niro 153 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     }