~ubuntu-branches/ubuntu/precise/mesa/precise-security

« back to all changes in this revision

Viewing changes to src/mesa/vbo/vbo_exec_api.c

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers, Steve Beattie
  • Date: 2012-10-19 09:04:04 UTC
  • mfrom: (163.1.4 precise-proposed)
  • Revision ID: package-import@ubuntu.com-20121019090404-5zbjpsp6knv7zl3b
Tags: 8.0.4-0ubuntu0.2
[ Steve Beattie ]
* SECURITY UPDATE: samplers array overflow (LP: #1046933)
  - debian/patches/50-CVE-2012-2864.patch: ensure that more than
    MAX_SAMPLERS are not used
  - CVE-2012-2864

Show diffs side-by-side

added added

removed removed

Lines of Context:
433
433
#include "vbo_attrib_tmp.h"
434
434
 
435
435
 
 
436
 
 
437
/**
 
438
 * Execute a glMaterial call.  Note that if GL_COLOR_MATERIAL is enabled,
 
439
 * this may be a (partial) no-op.
 
440
 */
 
441
static void GLAPIENTRY
 
442
vbo_Materialfv(GLenum face, GLenum pname, const GLfloat *params)
 
443
{
 
444
   GLbitfield updateMats;
 
445
   GET_CURRENT_CONTEXT(ctx);
 
446
 
 
447
   /* This function should be a no-op when it tries to update material
 
448
    * attributes which are currently tracking glColor via glColorMaterial.
 
449
    * The updateMats var will be a mask of the MAT_BIT_FRONT/BACK_x bits
 
450
    * indicating which material attributes can actually be updated below.
 
451
    */
 
452
   if (ctx->Light.ColorMaterialEnabled) {
 
453
      updateMats = ~ctx->Light.ColorMaterialBitmask;
 
454
   }
 
455
   else {
 
456
      /* GL_COLOR_MATERIAL is disabled so don't skip any material updates */
 
457
      updateMats = ALL_MATERIAL_BITS;
 
458
   }
 
459
 
 
460
   if (face == GL_FRONT) {
 
461
      updateMats &= FRONT_MATERIAL_BITS;
 
462
   }
 
463
   else if (face == GL_BACK) {
 
464
      updateMats &= BACK_MATERIAL_BITS;
 
465
   }
 
466
   else if (face != GL_FRONT_AND_BACK) {
 
467
      _mesa_error(ctx, GL_INVALID_ENUM, "glMaterial(invalid face)");
 
468
      return;
 
469
   }
 
470
 
 
471
   switch (pname) {
 
472
   case GL_EMISSION:
 
473
      if (updateMats & MAT_BIT_FRONT_EMISSION)
 
474
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_EMISSION, 4, params);
 
475
      if (updateMats & MAT_BIT_BACK_EMISSION)
 
476
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_EMISSION, 4, params);
 
477
      break;
 
478
   case GL_AMBIENT:
 
479
      if (updateMats & MAT_BIT_FRONT_AMBIENT)
 
480
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, params);
 
481
      if (updateMats & MAT_BIT_BACK_AMBIENT)
 
482
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_AMBIENT, 4, params);
 
483
      break;
 
484
   case GL_DIFFUSE:
 
485
      if (updateMats & MAT_BIT_FRONT_DIFFUSE)
 
486
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, params);
 
487
      if (updateMats & MAT_BIT_BACK_DIFFUSE)
 
488
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_DIFFUSE, 4, params);
 
489
      break;
 
490
   case GL_SPECULAR:
 
491
      if (updateMats & MAT_BIT_FRONT_SPECULAR)
 
492
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_SPECULAR, 4, params);
 
493
      if (updateMats & MAT_BIT_BACK_SPECULAR)
 
494
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_SPECULAR, 4, params);
 
495
      break;
 
496
   case GL_SHININESS:
 
497
      if (*params < 0 || *params > ctx->Const.MaxShininess) {
 
498
         _mesa_error(ctx, GL_INVALID_VALUE,
 
499
                     "glMaterial(invalid shininess: %f out range [0, %f])",
 
500
                     *params, ctx->Const.MaxShininess);
 
501
         return;
 
502
      }
 
503
      if (updateMats & MAT_BIT_FRONT_SHININESS)
 
504
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_SHININESS, 1, params);
 
505
      if (updateMats & MAT_BIT_BACK_SHININESS)
 
506
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_SHININESS, 1, params);
 
507
      break;
 
508
   case GL_COLOR_INDEXES:
 
509
      if (updateMats & MAT_BIT_FRONT_INDEXES)
 
510
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_INDEXES, 3, params);
 
511
      if (updateMats & MAT_BIT_BACK_INDEXES)
 
512
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_INDEXES, 3, params);
 
513
      break;
 
514
   case GL_AMBIENT_AND_DIFFUSE:
 
515
      if (updateMats & MAT_BIT_FRONT_AMBIENT)
 
516
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, params);
 
517
      if (updateMats & MAT_BIT_FRONT_DIFFUSE)
 
518
         MAT_ATTR(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, params);
 
519
      if (updateMats & MAT_BIT_BACK_AMBIENT)
 
520
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_AMBIENT, 4, params);
 
521
      if (updateMats & MAT_BIT_BACK_DIFFUSE)
 
522
         MAT_ATTR(VBO_ATTRIB_MAT_BACK_DIFFUSE, 4, params);
 
523
      break;
 
524
   default:
 
525
      _mesa_error(ctx, GL_INVALID_ENUM, "glMaterialfv(pname)");
 
526
      return;
 
527
   }
 
528
}
 
529
 
 
530
 
436
531
/**
437
532
 * Flush (draw) vertices.
438
533
 * \param  unmap - leave VBO unmapped after flushing?