18104362 Both /usr/bin/ppdpo and /usr/bin/ppdhtml dump core with fuzz input
authorVishwas Shekarappa Gudiyavar <vishwas.shekarappa.gudiyavar@oracle.com>
Fri, 31 Jul 2015 02:20:49 -0700
changeset 4724 7b96ca49258f
parent 4723 4193dfeb0e39
child 4725 b637001b5b2d
18104362 Both /usr/bin/ppdpo and /usr/bin/ppdhtml dump core with fuzz input
components/cups/patches/18104362.patch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/cups/patches/18104362.patch	Fri Jul 31 02:20:49 2015 -0700
@@ -0,0 +1,213 @@
+/*-------------------------------------------------------------------------------------------------
+This patch is taken from the community.
+Details can be found at https://www.cups.org/str.php?L4627
+---------------------------------------------------------------------------------------------------*/
+
+--- ppdc/ppdpo.cxx	2009-04-03 10:35:17.000000000 -0700
++++ ppdc/ppdpo.cxx	2015-05-18 02:34:42.016321242 -0700
+@@ -58,7 +58,7 @@
+ 
+   // Scan the command-line...
+   catalog = new ppdcCatalog("en");
+-  src     = 0;
++  src     = new ppdcSource();
+   verbose = 0;
+   outfile = 0;
+ 
+@@ -123,24 +123,26 @@
+ 	                _("ppdc: Loading driver information file \"%s\"...\n"),
+ 			argv[i]);
+ 
+-      src = new ppdcSource(argv[i]);
+-
+-      // Add UI strings...
+-      for (d = (ppdcDriver *)src->drivers->first();
+-           d;
+-	   d = (ppdcDriver *)src->drivers->next())
+-      {
+-	if (verbose)
+-	  _cupsLangPrintf(stderr,
+-	                  _("ppdc: Adding/updating UI text from %s...\n"),
+-			  argv[i]);
+-
+-        add_ui_strings(d, catalog);
+-      }
++	src->read_file(argv[i]);
++    }
+ 
+-      // Delete the printer driver information...
+-      src->release();
++    // If no drivers have been loaded, display the program usage message.
++  if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
++  {
++    // Add UI strings...
++    while (d != NULL)
++    {
++      if (verbose)
++	_cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."), argv[i]);
++      add_ui_strings(d, catalog);
++      d = (ppdcDriver *)src->drivers->next();
+     }
++  }
++  else
++     usage();
++
++// Delete the printer driver information...
++  src->release();
+ 
+   // Write the message catalog...
+   if (!outfile)
+@@ -150,10 +152,6 @@
+ 
+   catalog->release();
+ 
+-  // If no drivers have been loaded, display the program usage message.
+-  if (!src)
+-    usage();
+-
+   // Return with no errors.
+   return (0);
+ }
+
+
+
+
+--- ppdc/ppdhtml.cxx	2009-04-03 10:35:17.000000000 -0700
++++ ppdc/ppdhtml.cxx	2015-05-18 02:34:50.033654707 -0700
+@@ -58,7 +58,7 @@
+   _cupsSetLocale(argv);
+ 
+   // Scan the command-line...
+-  src = 0;
++  src = new ppdcSource();
+ 
+   for (i = 1; i < argc; i ++)
+     if (argv[i][0] == '-')
+@@ -97,67 +97,75 @@
+     else
+     {
+       // Open and load the driver info file...
+-      src = new ppdcSource(argv[i]);
++      src->read_file(argv[i]);
++    }
+ 
++      if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
++    {
+       // Create a composite group with all of the features from the
+       // drivers in the info file...
+       composite = new ppdcGroup("", "");
+ 
+-      for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
+-        for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
+-	  for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
+-	  {
+-	    if ((compo = composite->find_option(o->name->value)) == NULL)
+-	      composite->add_option(new ppdcOption(o));
+-	  }
+-
+-      puts("<html>");
+-      printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]);
+-      printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]);
+-      printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>");
+-      for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next())
+-        printf("<th>%s</th>", compo->text->value);
+-      puts("</tr></thead><tbody>");
+-
+-      // Write HTML summary...
+-      for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
+-      {
+-        // Write the summary for this driver...
+-	printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value);
+-	for (size = (ppdcMediaSize *)d->sizes->first(); size;
+-	     size = (ppdcMediaSize *)d->sizes->next())
+-          printf("%s<br>", size->text->value);
+-        printf("</td>");
+-
+-        for (compo = (ppdcOption *)composite->options->first(); compo;
+-	     compo = (ppdcOption *)composite->options->next())
+-	  if ((o = d->find_option(compo->name->value)) != NULL)
+-	  {
+-	    printf("<td nowrap>");
+-	    for (c = (ppdcChoice *)o->choices->first(); c;
+-	         c = (ppdcChoice *)o->choices->next())
+-	      printf("%s<br>", c->text->value);
+-	    printf("</td>");
+-	  }
+-	  else
+-	    printf("<td>N/A</td>");
+-
+-        puts("</tr>");
+-      }
+-
+-      puts("</tbody></table></p>");
+-      puts("</body>");
+-      puts("</html>");
+-      // Delete the printer driver information...
+-      composite->release();
+-      src->release();
++    while (d != NULL)
++    {
++      for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
++	for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
++	{
++	  if ((compo = composite->find_option(o->name->value)) == NULL)
++	    composite->add_option(new ppdcOption(o));
++	}
++        d = (ppdcDriver *)src->drivers->next();
+     }
++    puts("<html>");
++    printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]);
++    printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]);
++    printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>");
++    for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next())
++      printf("<th>%s</th>", compo->text->value);
++    puts("</tr></thead><tbody>");
+ 
+-  // If no drivers have been loaded, display the program usage message.
+-  if (!src)
++    // Write HTML summary...
++    for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
++    {
++      // Write the summary for this driver...
++      printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value);
++      for (size = (ppdcMediaSize *)d->sizes->first(); size;
++	   size = (ppdcMediaSize *)d->sizes->next())
++	printf("%s<br>", size->text->value);
++      printf("</td>");
++      
++      for (compo = (ppdcOption *)composite->options->first(); compo;
++	   compo = (ppdcOption *)composite->options->next())
++	if ((o = d->find_option(compo->name->value)) != NULL)
++	{
++	  printf("<td nowrap>");
++	  for (c = (ppdcChoice *)o->choices->first(); c;
++	       c = (ppdcChoice *)o->choices->next())
++	    printf("%s<br>", c->text->value);
++	  printf("</td>");
++	}
++	else
++	  printf("<td>N/A</td>");
++
++      puts("</tr>");
++     }
++
++     puts("</tbody></table></p>");
++    puts("</body>");
++    puts("</html>");
++
++    // Delete the printer driver information...
++    composite->release();
++  }
++  else
++  {
++    // If no drivers have been loaded, display the program usage message.
+     usage();
++  }
++
++  src->release();
+ 
+-  // Return with no errors.
++// Return with no errors.
+   return (0);
+ }
+