~ubuntu-branches/ubuntu/raring/gimp/raring-updates

« back to all changes in this revision

Viewing changes to plug-ins/common/file-xwd.c

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2013-12-06 13:26:35 UTC
  • Revision ID: package-import@ubuntu.com-20131206132635-qpa5qocyku0xtpey
Tags: 2.8.4-1ubuntu1.1
* SECURITY UPDATE: denial of service and possible code execution via
  huge color maps in xwd plugin
  - debian/patches/CVE-2013-1913.patch: limit number of color map entries
    in plug-ins/common/file-xwd.c.
  - CVE-2013-1913
* SECURITY UPDATE: denial of service and possible code execution via
  large number of color map entries in xwd plugin
  - debian/patches/CVE-2013-1978.patch: validate number of color map
    entries in plug-ins/common/file-xwd.c
  - CVE-2013-1978

Show diffs side-by-side

added added

removed removed

Lines of Context:
422
422
load_image (const gchar  *filename,
423
423
            GError      **error)
424
424
{
425
 
  FILE            *ifp;
 
425
  FILE            *ifp = NULL;
426
426
  gint             depth, bpp;
427
 
  gint32           image_ID;
 
427
  gint32           image_ID = -1;
428
428
  L_XWDFILEHEADER  xwdhdr;
429
429
  L_XWDCOLOR      *xwdcolmap = NULL;
430
430
 
434
434
      g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno),
435
435
                   _("Could not open '%s' for reading: %s"),
436
436
                   gimp_filename_to_utf8 (filename), g_strerror (errno));
437
 
      return -1;
 
437
      goto out;
438
438
    }
439
439
 
440
440
  read_xwd_header (ifp, &xwdhdr);
443
443
      g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
444
444
                   _("Could not read XWD header from '%s'"),
445
445
                   gimp_filename_to_utf8 (filename));
446
 
      fclose (ifp);
447
 
      return -1;
 
446
      goto out;
448
447
    }
449
448
 
450
449
#ifdef XWD_COL_WAIT_DEBUG
459
458
  /* Position to start of XWDColor structures */
460
459
  fseek (ifp, (long)xwdhdr.l_header_size, SEEK_SET);
461
460
 
 
461
  /* Guard against insanely huge color maps -- gimp_image_set_colormap() only
 
462
   * accepts colormaps with 0..256 colors anyway. */
 
463
  if (xwdhdr.l_colormap_entries > 256)
 
464
    {
 
465
      g_message (_("'%s':\nIllegal number of colormap entries: %ld"),
 
466
                 gimp_filename_to_utf8 (filename),
 
467
                 (long)xwdhdr.l_colormap_entries);
 
468
      goto out;
 
469
    }
 
470
 
462
471
  if (xwdhdr.l_colormap_entries > 0)
463
472
    {
 
473
      if (xwdhdr.l_colormap_entries < xwdhdr.l_ncolors)
 
474
        {
 
475
          g_message (_("'%s':\nNumber of colormap entries < number of colors"),
 
476
                     gimp_filename_to_utf8 (filename));
 
477
          goto out;
 
478
        }
 
479
 
464
480
      xwdcolmap = g_new (L_XWDCOLOR, xwdhdr.l_colormap_entries);
465
481
 
466
482
      read_xwd_cols (ifp, &xwdhdr, xwdcolmap);
480
496
      if (xwdhdr.l_file_version != 7)
481
497
        {
482
498
          g_message (_("Can't read color entries"));
483
 
          g_free (xwdcolmap);
484
 
          fclose (ifp);
485
 
          return (-1);
 
499
          goto out;
486
500
        }
487
501
    }
488
502
 
490
504
    {
491
505
      g_message (_("'%s':\nNo image width specified"),
492
506
                 gimp_filename_to_utf8 (filename));
493
 
      g_free (xwdcolmap);
494
 
      fclose (ifp);
495
 
      return (-1);
 
507
      goto out;
496
508
    }
497
509
 
498
510
  if (xwdhdr.l_pixmap_width > GIMP_MAX_IMAGE_SIZE
500
512
    {
501
513
      g_message (_("'%s':\nImage width is larger than GIMP can handle"),
502
514
                 gimp_filename_to_utf8 (filename));
503
 
      g_free (xwdcolmap);
504
 
      fclose (ifp);
505
 
      return (-1);
 
515
      goto out;
506
516
    }
507
517
 
508
518
  if (xwdhdr.l_pixmap_height <= 0)
509
519
    {
510
520
      g_message (_("'%s':\nNo image height specified"),
511
521
                 gimp_filename_to_utf8 (filename));
512
 
      g_free (xwdcolmap);
513
 
      fclose (ifp);
514
 
      return (-1);
 
522
      goto out;
515
523
    }
516
524
 
517
525
  if (xwdhdr.l_pixmap_height > GIMP_MAX_IMAGE_SIZE)
518
526
    {
519
527
      g_message (_("'%s':\nImage height is larger than GIMP can handle"),
520
528
                 gimp_filename_to_utf8 (filename));
521
 
      g_free (xwdcolmap);
522
 
      fclose (ifp);
523
 
      return (-1);
 
529
      goto out;
524
530
    }
525
531
 
526
532
  gimp_progress_init_printf (_("Opening '%s'"),
569
575
    }
570
576
  gimp_progress_update (1.0);
571
577
 
572
 
  fclose (ifp);
573
 
 
574
 
  if (xwdcolmap)
575
 
    g_free (xwdcolmap);
576
 
 
577
578
  if (image_ID == -1 && ! (error && *error))
578
579
    g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
579
580
                 _("XWD-file %s has format %d, depth %d and bits per pixel %d. "
581
582
                 gimp_filename_to_utf8 (filename),
582
583
                 (gint) xwdhdr.l_pixmap_format, depth, bpp);
583
584
 
 
585
out:
 
586
  if (ifp)
 
587
    {
 
588
      fclose (ifp);
 
589
    }
 
590
 
 
591
  if (xwdcolmap)
 
592
    {
 
593
      g_free (xwdcolmap);
 
594
    }
 
595
 
584
596
  return image_ID;
585
597
}
586
598