~siretart/xine-lib/ubuntu

« back to all changes in this revision

Viewing changes to src/libffmpeg/libavcodec/golomb.h

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2005-12-15 13:13:45 UTC
  • mfrom: (0.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051215131345-8n4osv1j7fy9c1s1
* SECURITY UPDATE: Fix arbitrary code execution with crafted PNG images in
  embedded ffmpeg copy.
* src/libffmpeg/libavcodec/utils.c, avcodec_default_get_buffer(): Apply
  upstream patch to fix buffer overflow on decoding of small PIX_FMT_PAL8
  PNG files.
* References:
  CVE-2005-4048
  http://mplayerhq.hu/pipermail/ffmpeg-devel/2005-November/005333.html
  http://www1.mplayerhq.hu/cgi-bin/cvsweb.cgi/ffmpeg/libavcodec/
  utils.c.diff?r1=1.161&r2=1.162&cvsroot=FFMpeg

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 * exp golomb vlc stuff
3
3
 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
 
4
 * Copyright (c) 2004 Alex Beregszaszi
4
5
 *
5
6
 * This library is free software; you can redistribute it and/or
6
7
 * modify it under the terms of the GNU Lesser General Public
22
23
 * @file golomb.h
23
24
 * @brief 
24
25
 *     exp golomb vlc stuff
25
 
 * @author Michael Niedermayer <michaelni@gmx.at>
 
26
 * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
26
27
 */
27
28
 
28
29
#define INVALID_VLC           0x80000000
80
81
        
81
82
        return ff_interleaved_ue_golomb_vlc_code[buf];
82
83
    }else{
83
 
        buf|=1;
 
84
        LAST_SKIP_BITS(re, gb, 8);
 
85
        UPDATE_CACHE(re, gb);
 
86
        buf |= 1 | (GET_CACHE(re, gb) >> 8);
 
87
 
84
88
        if((buf & 0xAAAAAAAA) == 0)
85
89
            return INVALID_VLC;
86
90
 
88
92
            buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
89
93
        }
90
94
 
91
 
        LAST_SKIP_BITS(re, gb, 63 - 2*log);
 
95
        LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
92
96
        CLOSE_READER(re, gb);
93
97
 
94
98
        return ((buf << log) >> log) - 1;
163
167
        
164
168
        return ff_interleaved_se_golomb_vlc_code[buf];
165
169
    }else{
166
 
        buf |=1;
 
170
        LAST_SKIP_BITS(re, gb, 8);
 
171
        UPDATE_CACHE(re, gb);
 
172
        buf |= 1 | (GET_CACHE(re, gb) >> 8);
 
173
 
167
174
        if((buf & 0xAAAAAAAA) == 0)
168
175
            return INVALID_VLC;
169
176
 
171
178
            buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
172
179
        }
173
180
 
174
 
        LAST_SKIP_BITS(re, gb, 63 - 2*log);
 
181
        LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
175
182
        CLOSE_READER(re, gb);
176
183
 
177
184
        return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
257
264
}
258
265
 
259
266
/**
260
 
 * read unsigned golomb rice code (flac).
 
267
 * read signed golomb rice code (ffv1).
 
268
 */
 
269
static inline int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len){
 
270
    int v= get_ur_golomb(gb, k, limit, esc_len);
 
271
    
 
272
    v++;
 
273
    if (v&1) return v>>1;
 
274
    else return -(v>>1);
 
275
    
 
276
//    return (v>>1) ^ -(v&1);
 
277
}
 
278
 
 
279
/**
 
280
 * read signed golomb rice code (flac).
261
281
 */
262
282
static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
263
283
    int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
264
284
    return (v>>1) ^ -(v&1);
265
285
}
266
286
 
 
287
/**
 
288
 * read unsigned golomb rice code (shorten).
 
289
 */
 
290
static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k){
 
291
        return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
 
292
}
 
293
 
 
294
/**
 
295
 * read signed golomb rice code (shorten).
 
296
 */
 
297
static inline int get_sr_golomb_shorten(GetBitContext* gb, int k)
 
298
{
 
299
    int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
 
300
    if (uvar & 1)
 
301
        return ~(uvar >> 1);
 
302
    else
 
303
        return uvar >> 1;
 
304
}
 
305
 
 
306
 
 
307
 
267
308
#ifdef TRACE
268
309
 
269
 
static inline int get_ue(GetBitContext *s, char *file, char *func, int line){
 
310
static inline int get_ue(GetBitContext *s, char *file, const char *func, int line){
270
311
    int show= show_bits(s, 24);
271
312
    int pos= get_bits_count(s);
272
313
    int i= get_ue_golomb(s);
275
316
    
276
317
    print_bin(bits, len);
277
318
    
278
 
    printf("%5d %2d %3d ue  @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
 
319
    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue  @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
279
320
    
280
321
    return i;
281
322
}
282
323
 
283
 
static inline int get_se(GetBitContext *s, char *file, char *func, int line){
 
324
static inline int get_se(GetBitContext *s, char *file, const char *func, int line){
284
325
    int show= show_bits(s, 24);
285
326
    int pos= get_bits_count(s);
286
327
    int i= get_se_golomb(s);
289
330
    
290
331
    print_bin(bits, len);
291
332
    
292
 
    printf("%5d %2d %3d se  @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
 
333
    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se  @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
293
334
    
294
335
    return i;
295
336
}
296
337
 
297
 
static inline int get_te(GetBitContext *s, int r, char *file, char *func, int line){
 
338
static inline int get_te(GetBitContext *s, int r, char *file, const char *func, int line){
298
339
    int show= show_bits(s, 24);
299
340
    int pos= get_bits_count(s);
300
341
    int i= get_te0_golomb(s, r);
303
344
    
304
345
    print_bin(bits, len);
305
346
    
306
 
    printf("%5d %2d %3d te  @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
 
347
    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te  @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
307
348
    
308
349
    return i;
309
350
}
350
391
}
351
392
 
352
393
/**
353
 
 * write signed exp golomb code.
 
394
 * write signed exp golomb code. 16 bits at most.
354
395
 */
355
396
static inline void set_se_golomb(PutBitContext *pb, int i){
 
397
//    if (i>32767 || i<-32767)
 
398
//      av_log(NULL,AV_LOG_ERROR,"value out of range %d\n", i);
356
399
#if 0 
357
400
    if(i<=0) i= -2*i;
358
401
    else     i=  2*i-1;
400
443
        put_bits(pb, esc_len, i - 1);
401
444
    }
402
445
}
 
446
 
 
447
/**
 
448
 * write signed golomb rice code (ffv1).
 
449
 */
 
450
static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
 
451
    int v;
 
452
 
 
453
    v = -2*i-1;
 
454
    v ^= (v>>31);
 
455
 
 
456
    set_ur_golomb(pb, v, k, limit, esc_len);
 
457
}
 
458
 
 
459
/**
 
460
 * write signed golomb rice code (flac).
 
461
 */
 
462
static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k, int limit, int esc_len){
 
463
    int v;
 
464
 
 
465
    v = -2*i-1;
 
466
    v ^= (v>>31);
 
467
 
 
468
    set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
 
469
}