diff --git a/ppd/ppd-cache.c b/ppd/ppd-cache.c index d3b6eb1c..8fcc4ffe 100644 --- a/ppd/ppd-cache.c +++ b/ppd/ppd-cache.c @@ -2453,6 +2453,9 @@ ppdCacheAssignPresets(ppd_file_t *ppd, char *o, *c, *p; int score; + if (option->num_choices <= 0 || !option->choices) + continue; + o = option->keyword; // Skip options which do not change color mode and quality or @@ -2491,6 +2494,7 @@ ppdCacheAssignPresets(ppd_file_t *ppd, if (ppd->nickname && strstr(ppd->nickname, "Foomatic") && + option->num_choices > 0 && option->choices && !strncmp(option->choices[0].choice, "From", 4) && ppdFindOption(ppd, option->choices[0].choice + 4)) { diff --git a/ppd/test_ppd_cache.c b/ppd/test_ppd_cache.c index e4ca9f5f..81fcfb44 100644 --- a/ppd/test_ppd_cache.c +++ b/ppd/test_ppd_cache.c @@ -557,6 +557,53 @@ main(void) testEnd(sz == NULL); + // T53 — Foomatic PPD with an empty *OpenUI option must not dereference + // option->choices[0] in ppdCacheAssignPresets() (Issue #81). + testBegin("ppdCacheCreateWithPPD on Foomatic PPD with empty OpenUI option"); + { + static const char foomatic_empty_opt_ppd[] = + "*PPD-Adobe: \"4.3\"\n" + "*FormatVersion: \"4.3\"\n" + "*FileVersion: \"1.0\"\n" + "*LanguageVersion: English\n" + "*LanguageEncoding: ISOLatin1\n" + "*PCFileName: \"FOOEMPTY.PPD\"\n" + "*Manufacturer: \"Generic\"\n" + "*Product: \"(Foomatic Printer)\"\n" + "*ModelName: \"Generic Foomatic Printer\"\n" + "*ShortNickName: \"FoomaticPrinter\"\n" + "*NickName: \"Generic Foomatic Printer Foomatic/foo (recommended)\"\n" + "*PSVersion: \"(3010.000) 0\"\n" + "*OpenUI *PageSize/Page Size: PickOne\n" + "*OrderDependency: 10 AnySetup *PageSize\n" + "*DefaultPageSize: Letter\n" + "*PageSize Letter/US Letter: \"<>setpagedevice\"\n" + "*CloseUI: *PageSize\n" + "*OpenUI *PageRegion/Page Region: PickOne\n" + "*OrderDependency: 10 AnySetup *PageRegion\n" + "*DefaultPageRegion: Letter\n" + "*PageRegion Letter/US Letter: \"<>setpagedevice\"\n" + "*CloseUI: *PageRegion\n" + "*DefaultImageableArea: Letter\n" + "*ImageableArea Letter/US Letter: \"18 18 594 774\"\n" + "*DefaultPaperDimension: Letter\n" + "*PaperDimension Letter/US Letter: \"612 792\"\n" + "*OpenUI *AuditEmpty/Empty Option: PickOne\n" + "*OrderDependency: 20 AnySetup *AuditEmpty\n" + "*DefaultAuditEmpty: None\n" + "*CloseUI: *AuditEmpty\n"; + FILE *fp_foo = tmpfile(); + fputs(foomatic_empty_opt_ppd, fp_foo); + rewind(fp_foo); + ppd_file_t *ppd_foo = ppdOpen(fp_foo); + fclose(fp_foo); + ppd_cache_t *pc_foo = ppdCacheCreateWithPPD(ppd_foo); + testEnd(ppd_foo != NULL && pc_foo != NULL); + ppdCacheDestroy(pc_foo); + ppdClose(ppd_foo); + } + + // ========================================================================= // Cleanup // =========================================================================