From 9761497b76854d321613b2a3bac941475df070fc Mon Sep 17 00:00:00 2001 From: Cristy Date: Fri, 25 Mar 2016 19:05:07 -0400 Subject: [PATCH] Check for buffer overflow --- MagickCore/geometry.c | 198 +++++++++++++++++++++++------------------- 1 file changed, 108 insertions(+), 90 deletions(-) diff --git a/MagickCore/geometry.c b/MagickCore/geometry.c index d60fc00ed..b7844960c 100644 --- a/MagickCore/geometry.c +++ b/MagickCore/geometry.c @@ -348,118 +348,136 @@ MagickExport MagickStatusType GetGeometry(const char *geometry,ssize_t *x, */ MagickExport char *GetPageGeometry(const char *page_geometry) { - static const char - *PageSizes[][2]= +#define MagickPageSize(name,geometry) { (name), sizeof(name)-1, (geometry) } + + typedef struct _PageInfo + { + char + *name; + + size_t + extent; + + char + *geometry; + } PageInfo; + + static const PageInfo + const PageSizes[] = { - { "4x6", "288x432" }, - { "5x7", "360x504" }, - { "7x9", "504x648" }, - { "8x10", "576x720" }, - { "9x11", "648x792" }, - { "9x12", "648x864" }, - { "10x13", "720x936" }, - { "10x14", "720x1008" }, - { "11x17", "792x1224" }, - { "a0", "2384x3370" }, - { "a1", "1684x2384" }, - { "a10", "73x105" }, - { "a2", "1191x1684" }, - { "a3", "842x1191" }, - { "a4", "595x842" }, - { "a4small", "595x842" }, - { "a5", "420x595" }, - { "a6", "297x420" }, - { "a7", "210x297" }, - { "a8", "148x210" }, - { "a9", "105x148" }, - { "archa", "648x864" }, - { "archb", "864x1296" }, - { "archC", "1296x1728" }, - { "archd", "1728x2592" }, - { "arche", "2592x3456" }, - { "b0", "2920x4127" }, - { "b1", "2064x2920" }, - { "b10", "91x127" }, - { "b2", "1460x2064" }, - { "b3", "1032x1460" }, - { "b4", "729x1032" }, - { "b5", "516x729" }, - { "b6", "363x516" }, - { "b7", "258x363" }, - { "b8", "181x258" }, - { "b9", "127x181" }, - { "c0", "2599x3676" }, - { "c1", "1837x2599" }, - { "c2", "1298x1837" }, - { "c3", "918x1296" }, - { "c4", "649x918" }, - { "c5", "459x649" }, - { "c6", "323x459" }, - { "c7", "230x323" }, - { "executive", "540x720" }, - { "flsa", "612x936" }, - { "flse", "612x936" }, - { "folio", "612x936" }, - { "halfletter", "396x612" }, - { "isob0", "2835x4008" }, - { "isob1", "2004x2835" }, - { "isob10", "88x125" }, - { "isob2", "1417x2004" }, - { "isob3", "1001x1417" }, - { "isob4", "709x1001" }, - { "isob5", "499x709" }, - { "isob6", "354x499" }, - { "isob7", "249x354" }, - { "isob8", "176x249" }, - { "isob9", "125x176" }, - { "jisb0", "1030x1456" }, - { "jisb1", "728x1030" }, - { "jisb2", "515x728" }, - { "jisb3", "364x515" }, - { "jisb4", "257x364" }, - { "jisb5", "182x257" }, - { "jisb6", "128x182" }, - { "ledger", "1224x792" }, - { "legal", "612x1008" }, - { "letter", "612x792" }, - { "lettersmall", "612x792" }, - { "quarto", "610x780" }, - { "statement", "396x612" }, - { "tabloid", "792x1224" }, - { (char *) NULL, (char *) NULL } + MagickPageSize("4x6", "288x432"), + MagickPageSize("5x7", "360x504"), + MagickPageSize("7x9", "504x648"), + MagickPageSize("8x10", "576x720"), + MagickPageSize("9x11", "648x792"), + MagickPageSize("9x12", "648x864"), + MagickPageSize("10x13", "720x936"), + MagickPageSize("10x14", "720x1008"), + MagickPageSize("11x17", "792x1224"), + MagickPageSize("a0", "2384x3370"), + MagickPageSize("a1", "1684x2384"), + MagickPageSize("a10", "73x105"), + MagickPageSize("a2", "1191x1684"), + MagickPageSize("a3", "842x1191"), + MagickPageSize("a4", "595x842"), + MagickPageSize("a4small", "595x842"), + MagickPageSize("a5", "420x595"), + MagickPageSize("a6", "297x420"), + MagickPageSize("a7", "210x297"), + MagickPageSize("a8", "148x210"), + MagickPageSize("a9", "105x148"), + MagickPageSize("archa", "648x864"), + MagickPageSize("archb", "864x1296"), + MagickPageSize("archC", "1296x1728"), + MagickPageSize("archd", "1728x2592"), + MagickPageSize("arche", "2592x3456"), + MagickPageSize("b0", "2920x4127"), + MagickPageSize("b1", "2064x2920"), + MagickPageSize("b10", "91x127"), + MagickPageSize("b2", "1460x2064"), + MagickPageSize("b3", "1032x1460"), + MagickPageSize("b4", "729x1032"), + MagickPageSize("b5", "516x729"), + MagickPageSize("b6", "363x516"), + MagickPageSize("b7", "258x363"), + MagickPageSize("b8", "181x258"), + MagickPageSize("b9", "127x181"), + MagickPageSize("c0", "2599x3676"), + MagickPageSize("c1", "1837x2599"), + MagickPageSize("c2", "1298x1837"), + MagickPageSize("c3", "918x1296"), + MagickPageSize("c4", "649x918"), + MagickPageSize("c5", "459x649"), + MagickPageSize("c6", "323x459"), + MagickPageSize("c7", "230x323"), + MagickPageSize("executive", "540x720"), + MagickPageSize("flsa", "612x936"), + MagickPageSize("flse", "612x936"), + MagickPageSize("folio", "612x936"), + MagickPageSize("halfletter", "396x612"), + MagickPageSize("isob0", "2835x4008"), + MagickPageSize("isob1", "2004x2835"), + MagickPageSize("isob10", "88x125"), + MagickPageSize("isob2", "1417x2004"), + MagickPageSize("isob3", "1001x1417"), + MagickPageSize("isob4", "709x1001"), + MagickPageSize("isob5", "499x709"), + MagickPageSize("isob6", "354x499"), + MagickPageSize("isob7", "249x354"), + MagickPageSize("isob8", "176x249"), + MagickPageSize("isob9", "125x176"), + MagickPageSize("jisb0", "1030x1456"), + MagickPageSize("jisb1", "728x1030"), + MagickPageSize("jisb2", "515x728"), + MagickPageSize("jisb3", "364x515"), + MagickPageSize("jisb4", "257x364"), + MagickPageSize("jisb5", "182x257"), + MagickPageSize("jisb6", "128x182"), + MagickPageSize("ledger", "1224x792"), + MagickPageSize("legal", "612x1008"), + MagickPageSize("letter", "612x792"), + MagickPageSize("lettersmall", "612x792"), + MagickPageSize("quarto", "610x780"), + MagickPageSize("statement", "396x612"), + MagickPageSize("tabloid", "792x1224") }; char - *page; + page[MaxTextExtent]; register ssize_t i; assert(page_geometry != (char *) NULL); (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",page_geometry); - page=AcquireString(page_geometry); - for (i=0; *PageSizes[i] != (char *) NULL; i++) - if (LocaleNCompare(PageSizes[i][0],page,strlen(PageSizes[i][0])) == 0) + CopyMagickMemory(page,page_geometry,MaxTextExtent); + for (i=0; i < sizeof(PageSizes)/sizeof(PageSizes[0]); i++) + { + int + status; + + status=LocaleNCompare(PageSizes[i].name,page_geometry,PageSizes[i].extent); + if (status == 0) { - RectangleInfo - geometry; - MagickStatusType flags; + RectangleInfo + geometry; + /* Replace mneumonic with the equivalent size in dots-per-inch. */ - (void) CopyMagickString(page,PageSizes[i][1],MagickPathExtent); - (void) ConcatenateMagickString(page,page_geometry+ - strlen(PageSizes[i][0]),MagickPathExtent); + (void) FormatLocaleString(page,MaxTextExtent,"%s%.80s", + PageSizes[i].geometry,page_geometry+PageSizes[i].extent); flags=GetGeometry(page,&geometry.x,&geometry.y,&geometry.width, &geometry.height); if ((flags & GreaterValue) == 0) - (void) ConcatenateMagickString(page,">",MagickPathExtent); + (void) ConcatenateMagickString(page,">",MaxTextExtent); break; } - return(page); + } + return(AcquireString(page)); } /* -- 2.40.0