~ubuntu-branches/ubuntu/gutsy/vnc4/gutsy

« back to all changes in this revision

Viewing changes to unix/xc/programs/Xserver/iplan2p4/iplpack.c

  • Committer: Bazaar Package Importer
  • Author(s): Ola Lundqvist
  • Date: 2006-05-15 20:35:17 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060515203517-l4lre1ku942mn26k
Tags: 4.1.1+X4.3.0-10
* Correction of critical security issue. Thanks to Martin Kogler
  <e9925248@student.tuwien.ac.at> that informed me about the issue,
  and provided the patch.
  This flaw was originally found by Steve Wiseman of intelliadmin.com.
* Applied patch from Javier Kohen <jkohen@users.sourceforge.net> that
  inform the user that only 8 first characters of the password will
  actually be used when typing more than 8 characters, closes:
  #355619.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $XFree86: xc/programs/Xserver/iplan2p4/iplpack.c,v 3.0 1996/08/18 01:54:56 dawes Exp $ */
 
2
/* Modified nov 94 by Martin Schaller (Martin_Schaller@maus.r.de) for use with
 
3
interleaved planes */
 
4
 
 
5
/* abcd abcd abcd abcd abcd abcd abcd abcd */
 
6
/* aaaa aaaa bbbb bbbb cccc cccc dddd dddd */
 
7
 
 
8
unsigned long tabi[256] = {
 
9
        0x00000000,0x00001000,0x10000000,0x10001000,
 
10
        0x00002000,0x00003000,0x10002000,0x10003000,
 
11
        0x20000000,0x20001000,0x30000000,0x30001000,
 
12
        0x20002000,0x20003000,0x30002000,0x30003000,
 
13
        0x00004000,0x00005000,0x10004000,0x10005000,
 
14
        0x00006000,0x00007000,0x10006000,0x10007000,
 
15
        0x20004000,0x20005000,0x30004000,0x30005000,
 
16
        0x20006000,0x20007000,0x30006000,0x30007000,
 
17
        0x40000000,0x40001000,0x50000000,0x50001000,
 
18
        0x40002000,0x40003000,0x50002000,0x50003000,
 
19
        0x60000000,0x60001000,0x70000000,0x70001000,
 
20
        0x60002000,0x60003000,0x70002000,0x70003000,
 
21
        0x40004000,0x40005000,0x50004000,0x50005000,
 
22
        0x40006000,0x40007000,0x50006000,0x50007000,
 
23
        0x60004000,0x60005000,0x70004000,0x70005000,
 
24
        0x60006000,0x60007000,0x70006000,0x70007000,
 
25
        0x00008000,0x00009000,0x10008000,0x10009000,
 
26
        0x0000a000,0x0000b000,0x1000a000,0x1000b000,
 
27
        0x20008000,0x20009000,0x30008000,0x30009000,
 
28
        0x2000a000,0x2000b000,0x3000a000,0x3000b000,
 
29
        0x0000c000,0x0000d000,0x1000c000,0x1000d000,
 
30
        0x0000e000,0x0000f000,0x1000e000,0x1000f000,
 
31
        0x2000c000,0x2000d000,0x3000c000,0x3000d000,
 
32
        0x2000e000,0x2000f000,0x3000e000,0x3000f000,
 
33
        0x40008000,0x40009000,0x50008000,0x50009000,
 
34
        0x4000a000,0x4000b000,0x5000a000,0x5000b000,
 
35
        0x60008000,0x60009000,0x70008000,0x70009000,
 
36
        0x6000a000,0x6000b000,0x7000a000,0x7000b000,
 
37
        0x4000c000,0x4000d000,0x5000c000,0x5000d000,
 
38
        0x4000e000,0x4000f000,0x5000e000,0x5000f000,
 
39
        0x6000c000,0x6000d000,0x7000c000,0x7000d000,
 
40
        0x6000e000,0x6000f000,0x7000e000,0x7000f000,
 
41
        0x80000000,0x80001000,0x90000000,0x90001000,
 
42
        0x80002000,0x80003000,0x90002000,0x90003000,
 
43
        0xa0000000,0xa0001000,0xb0000000,0xb0001000,
 
44
        0xa0002000,0xa0003000,0xb0002000,0xb0003000,
 
45
        0x80004000,0x80005000,0x90004000,0x90005000,
 
46
        0x80006000,0x80007000,0x90006000,0x90007000,
 
47
        0xa0004000,0xa0005000,0xb0004000,0xb0005000,
 
48
        0xa0006000,0xa0007000,0xb0006000,0xb0007000,
 
49
        0xc0000000,0xc0001000,0xd0000000,0xd0001000,
 
50
        0xc0002000,0xc0003000,0xd0002000,0xd0003000,
 
51
        0xe0000000,0xe0001000,0xf0000000,0xf0001000,
 
52
        0xe0002000,0xe0003000,0xf0002000,0xf0003000,
 
53
        0xc0004000,0xc0005000,0xd0004000,0xd0005000,
 
54
        0xc0006000,0xc0007000,0xd0006000,0xd0007000,
 
55
        0xe0004000,0xe0005000,0xf0004000,0xf0005000,
 
56
        0xe0006000,0xe0007000,0xf0006000,0xf0007000,
 
57
        0x80008000,0x80009000,0x90008000,0x90009000,
 
58
        0x8000a000,0x8000b000,0x9000a000,0x9000b000,
 
59
        0xa0008000,0xa0009000,0xb0008000,0xb0009000,
 
60
        0xa000a000,0xa000b000,0xb000a000,0xb000b000,
 
61
        0x8000c000,0x8000d000,0x9000c000,0x9000d000,
 
62
        0x8000e000,0x8000f000,0x9000e000,0x9000f000,
 
63
        0xa000c000,0xa000d000,0xb000c000,0xb000d000,
 
64
        0xa000e000,0xa000f000,0xb000e000,0xb000f000,
 
65
        0xc0008000,0xc0009000,0xd0008000,0xd0009000,
 
66
        0xc000a000,0xc000b000,0xd000a000,0xd000b000,
 
67
        0xe0008000,0xe0009000,0xf0008000,0xf0009000,
 
68
        0xe000a000,0xe000b000,0xf000a000,0xf000b000,
 
69
        0xc000c000,0xc000d000,0xd000c000,0xd000d000,
 
70
        0xc000e000,0xc000f000,0xd000e000,0xd000f000,
 
71
        0xe000c000,0xe000d000,0xf000c000,0xf000d000,
 
72
        0xe000e000,0xe000f000,0xf000e000,0xf000f000,
 
73
        };
 
74
static unsigned long tabp[256] = {
 
75
        0x00000000,0x00020000,0x00080000,0x000a0000,
 
76
        0x00200000,0x00220000,0x00280000,0x002a0000,
 
77
        0x00800000,0x00820000,0x00880000,0x008a0000,
 
78
        0x00a00000,0x00a20000,0x00a80000,0x00aa0000,
 
79
        0x02000000,0x02020000,0x02080000,0x020a0000,
 
80
        0x02200000,0x02220000,0x02280000,0x022a0000,
 
81
        0x02800000,0x02820000,0x02880000,0x028a0000,
 
82
        0x02a00000,0x02a20000,0x02a80000,0x02aa0000,
 
83
        0x08000000,0x08020000,0x08080000,0x080a0000,
 
84
        0x08200000,0x08220000,0x08280000,0x082a0000,
 
85
        0x08800000,0x08820000,0x08880000,0x088a0000,
 
86
        0x08a00000,0x08a20000,0x08a80000,0x08aa0000,
 
87
        0x0a000000,0x0a020000,0x0a080000,0x0a0a0000,
 
88
        0x0a200000,0x0a220000,0x0a280000,0x0a2a0000,
 
89
        0x0a800000,0x0a820000,0x0a880000,0x0a8a0000,
 
90
        0x0aa00000,0x0aa20000,0x0aa80000,0x0aaa0000,
 
91
        0x20000000,0x20020000,0x20080000,0x200a0000,
 
92
        0x20200000,0x20220000,0x20280000,0x202a0000,
 
93
        0x20800000,0x20820000,0x20880000,0x208a0000,
 
94
        0x20a00000,0x20a20000,0x20a80000,0x20aa0000,
 
95
        0x22000000,0x22020000,0x22080000,0x220a0000,
 
96
        0x22200000,0x22220000,0x22280000,0x222a0000,
 
97
        0x22800000,0x22820000,0x22880000,0x228a0000,
 
98
        0x22a00000,0x22a20000,0x22a80000,0x22aa0000,
 
99
        0x28000000,0x28020000,0x28080000,0x280a0000,
 
100
        0x28200000,0x28220000,0x28280000,0x282a0000,
 
101
        0x28800000,0x28820000,0x28880000,0x288a0000,
 
102
        0x28a00000,0x28a20000,0x28a80000,0x28aa0000,
 
103
        0x2a000000,0x2a020000,0x2a080000,0x2a0a0000,
 
104
        0x2a200000,0x2a220000,0x2a280000,0x2a2a0000,
 
105
        0x2a800000,0x2a820000,0x2a880000,0x2a8a0000,
 
106
        0x2aa00000,0x2aa20000,0x2aa80000,0x2aaa0000,
 
107
        0x80000000,0x80020000,0x80080000,0x800a0000,
 
108
        0x80200000,0x80220000,0x80280000,0x802a0000,
 
109
        0x80800000,0x80820000,0x80880000,0x808a0000,
 
110
        0x80a00000,0x80a20000,0x80a80000,0x80aa0000,
 
111
        0x82000000,0x82020000,0x82080000,0x820a0000,
 
112
        0x82200000,0x82220000,0x82280000,0x822a0000,
 
113
        0x82800000,0x82820000,0x82880000,0x828a0000,
 
114
        0x82a00000,0x82a20000,0x82a80000,0x82aa0000,
 
115
        0x88000000,0x88020000,0x88080000,0x880a0000,
 
116
        0x88200000,0x88220000,0x88280000,0x882a0000,
 
117
        0x88800000,0x88820000,0x88880000,0x888a0000,
 
118
        0x88a00000,0x88a20000,0x88a80000,0x88aa0000,
 
119
        0x8a000000,0x8a020000,0x8a080000,0x8a0a0000,
 
120
        0x8a200000,0x8a220000,0x8a280000,0x8a2a0000,
 
121
        0x8a800000,0x8a820000,0x8a880000,0x8a8a0000,
 
122
        0x8aa00000,0x8aa20000,0x8aa80000,0x8aaa0000,
 
123
        0xa0000000,0xa0020000,0xa0080000,0xa00a0000,
 
124
        0xa0200000,0xa0220000,0xa0280000,0xa02a0000,
 
125
        0xa0800000,0xa0820000,0xa0880000,0xa08a0000,
 
126
        0xa0a00000,0xa0a20000,0xa0a80000,0xa0aa0000,
 
127
        0xa2000000,0xa2020000,0xa2080000,0xa20a0000,
 
128
        0xa2200000,0xa2220000,0xa2280000,0xa22a0000,
 
129
        0xa2800000,0xa2820000,0xa2880000,0xa28a0000,
 
130
        0xa2a00000,0xa2a20000,0xa2a80000,0xa2aa0000,
 
131
        0xa8000000,0xa8020000,0xa8080000,0xa80a0000,
 
132
        0xa8200000,0xa8220000,0xa8280000,0xa82a0000,
 
133
        0xa8800000,0xa8820000,0xa8880000,0xa88a0000,
 
134
        0xa8a00000,0xa8a20000,0xa8a80000,0xa8aa0000,
 
135
        0xaa000000,0xaa020000,0xaa080000,0xaa0a0000,
 
136
        0xaa200000,0xaa220000,0xaa280000,0xaa2a0000,
 
137
        0xaa800000,0xaa820000,0xaa880000,0xaa8a0000,
 
138
        0xaaa00000,0xaaa20000,0xaaa80000,0xaaaa0000,
 
139
        };
 
140
 
 
141
void
 
142
iplUnpackLine(int planes, int longs, unsigned int *psrc, unsigned short *ipsrc)
 
143
{
 
144
        unsigned long temp,m;
 
145
        unsigned char *t=(unsigned char *) &temp;
 
146
        unsigned char *i=(unsigned char *) ipsrc;
 
147
        unsigned char *s=(unsigned char *) psrc;
 
148
        int j,off;
 
149
        switch (planes) {
 
150
        case 2:
 
151
                for (j = 0 ; j < longs ; j++)
 
152
                {
 
153
                        *((long *) ipsrc)++=(tabi[s[0]] >>  0)  |
 
154
                                            (tabi[s[1]] >>  4)  |
 
155
                                            (tabi[s[2]] >>  8)  |
 
156
                                            (tabi[s[3]] >> 12);
 
157
                        s+=4;
 
158
                }
 
159
                break;
 
160
        case 4:
 
161
                for (j = 0 ; j < longs ; j++)
 
162
                {
 
163
                        temp=   (tabi[s[0]] >>  0)      |
 
164
                                (tabi[s[1]] >>  4)      |
 
165
                                (tabi[s[2]] >>  8)      |
 
166
                                (tabi[s[3]] >> 12);
 
167
                        temp=   (tabi[t[0]] >>  0)      |
 
168
                                (tabi[t[1]] >>  4)      |
 
169
                                (tabi[t[2]] >>  8)      |
 
170
                                (tabi[t[3]] >> 12);
 
171
                        s+=4;
 
172
                        if (j & 1) {
 
173
                                i[7]=t[0];
 
174
                                i[5]=t[1];
 
175
                                i[3]=t[2];
 
176
                                i[1]=t[3];
 
177
                                i += 8;
 
178
                        }       
 
179
                        else {
 
180
                                i[6]=t[0];
 
181
                                i[4]=t[1];
 
182
                                i[2]=t[2];
 
183
                                i[0]=t[3];
 
184
                        }
 
185
                }
 
186
                break;
 
187
        case 8:
 
188
                for (j = 0 ; j < longs ; j++)
 
189
                {
 
190
                        temp=   (tabi[s[0]] >>  0)      |
 
191
                                (tabi[s[1]] >>  4)      |
 
192
                                (tabi[s[2]] >>  8)      |
 
193
                                (tabi[s[3]] >> 12);
 
194
 
 
195
                        temp=   (tabi[t[0]] >>  0)      |
 
196
                                (tabi[t[1]] >>  4)      |
 
197
                                (tabi[t[2]] >>  8)      |
 
198
                                (tabi[t[3]] >> 12);
 
199
 
 
200
                        temp=   (tabi[t[0]] >>  0)      |
 
201
                                (tabi[t[1]] >>  4)      |
 
202
                                (tabi[t[2]] >>  8)      |
 
203
                                (tabi[t[3]] >> 12);
 
204
 
 
205
                        off=12-(j & 3)*4;
 
206
                        m=0xf << off;
 
207
                        ipsrc[7]=(ipsrc[7] & ~m) | (((temp >> 28) << off) & m); 
 
208
                        ipsrc[6]=(ipsrc[6] & ~m) | (((temp >> 24) << off) & m); 
 
209
                        ipsrc[5]=(ipsrc[5] & ~m) | (((temp >> 20) << off) & m); 
 
210
                        ipsrc[4]=(ipsrc[4] & ~m) | (((temp >> 16) << off) & m); 
 
211
                        ipsrc[3]=(ipsrc[3] & ~m) | (((temp >> 12) << off) & m); 
 
212
                        ipsrc[2]=(ipsrc[2] & ~m) | (((temp >>  8) << off) & m); 
 
213
                        ipsrc[1]=(ipsrc[1] & ~m) | (((temp >>  4) << off) & m); 
 
214
                        ipsrc[0]=(ipsrc[0] & ~m) | (((temp >>  0) << off) & m); 
 
215
                        if (! off)
 
216
                                ipsrc +=8; 
 
217
                        s+=4;
 
218
                }
 
219
        }
 
220
}
 
221
 
 
222
void
 
223
iplPackLine(int planes, int longs, unsigned short *ipdst, unsigned int *pdst)
 
224
{
 
225
        unsigned long temp,m;
 
226
        unsigned char *t=(unsigned char *) &temp;
 
227
        unsigned char *i=(unsigned char *) ipdst;
 
228
        int j,off;
 
229
        switch (planes) {
 
230
        case 2:
 
231
                for (j = 0 ; j < longs ; j++)
 
232
                {
 
233
                        *pdst++=(tabp[i[2]] >>  0)      |
 
234
                                (tabp[i[0]] >>  1)      |
 
235
                                (tabp[i[3]] >> 16)      |
 
236
                                (tabp[i[1]] >> 17);
 
237
                        i+=4;
 
238
                }
 
239
                break;
 
240
        case 4:
 
241
                for (j = 0 ; j < longs ; j++)
 
242
                {
 
243
                        if (j & 1) {
 
244
                                temp=   (tabp[i[7]] >>  0)      |
 
245
                                        (tabp[i[3]] >>  1)      |
 
246
                                        (tabp[i[5]] >> 16)      |
 
247
                                        (tabp[i[1]] >> 17);
 
248
                                i += 8;
 
249
                        }       
 
250
                        else {
 
251
                                temp=   (tabp[i[6]] >>  0)      |
 
252
                                        (tabp[i[2]] >>  1)      |
 
253
                                        (tabp[i[4]] >> 16)      |
 
254
                                        (tabp[i[0]] >> 17);
 
255
                        }
 
256
                        *pdst++=(tabp[t[0]] >>  0)      |
 
257
                                (tabp[t[2]] >>  1)      |
 
258
                                (tabp[t[1]] >> 16)      |
 
259
                                (tabp[t[3]] >> 17);
 
260
                }
 
261
                break;
 
262
        case 8:
 
263
                for (j = 0 ; j < longs ; j++)
 
264
                {
 
265
                        off=12-(j & 3)*4;
 
266
                        m=0xf;
 
267
                        temp=(((ipdst[7] >> off) & m) << 28)    | 
 
268
                             (((ipdst[6] >> off) & m) << 24)    | 
 
269
                             (((ipdst[5] >> off) & m) << 20)    |
 
270
                             (((ipdst[4] >> off) & m) << 16)    |
 
271
                             (((ipdst[3] >> off) & m) << 12)    | 
 
272
                             (((ipdst[2] >> off) & m) <<  8)    |
 
273
                             (((ipdst[1] >> off) & m) <<  4)    |
 
274
                             (((ipdst[0] >> off) & m) <<  0);
 
275
 
 
276
                        if (! off)
 
277
                                ipdst +=8; 
 
278
 
 
279
                        temp=   (tabp[t[0]] >>  0)      |
 
280
                                (tabp[t[2]] >>  1)      |
 
281
                                (tabp[t[1]] >> 16)      |
 
282
                                (tabp[t[3]] >> 17);
 
283
 
 
284
                        temp=   (tabp[t[0]] >>  0)      |
 
285
                                (tabp[t[2]] >>  1)      |
 
286
                                (tabp[t[1]] >> 16)      |
 
287
                                (tabp[t[3]] >> 17);
 
288
 
 
289
                        *pdst++=(tabp[t[0]] >>  0)      |
 
290
                                (tabp[t[2]] >>  1)      |
 
291
                                (tabp[t[1]] >> 16)      |
 
292
                                (tabp[t[3]] >> 17);
 
293
                }
 
294
        }
 
295
}
 
296
 
 
297
unsigned long
 
298
iplpack(unsigned long ipl)
 
299
{
 
300
        unsigned char *ic=(unsigned char *) &ipl;
 
301
        return  (tabp[ic[0]])           | /* a0a0a0a0a0a0a0a00000000000000000 */
 
302
                (tabp[ic[2]] >> 1)      | /* abababababababab0000000000000000 */
 
303
                (tabp[ic[1]] >> 16)     | /* ababababababababa0a0a0a0a0a0a0a0 */
 
304
                (tabp[ic[3]] >> 17);      /* abababababababababababababababab */
 
305
}
 
306
 
 
307
unsigned long
 
308
iplunpack(unsigned long pack)
 
309
{
 
310
        unsigned char *ip=(unsigned char *) &pack;
 
311
        return  (tabi[ip[0]])           | /* aaaa000000000000bbbb000000000000 */
 
312
                (tabi[ip[1]] >>  4)     | /* aaaaaaaa00000000bbbbbbbb00000000 */
 
313
                (tabi[ip[2]] >>  8)     | /* aaaaaaaaaaaa0000bbbbbbbbbbbb0000 */
 
314
                (tabi[ip[3]] >> 12);      /* aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb */
 
315
}       
 
316