40 #include "magick/studio.h"
41 #include "magick/cache-private.h"
42 #include "magick/client.h"
43 #include "magick/configure.h"
44 #include "magick/exception.h"
45 #include "magick/exception-private.h"
46 #include "magick/hashmap-private.h"
47 #include "magick/locale_.h"
48 #include "magick/magick-private.h"
49 #include "magick/memory_.h"
50 #include "magick/memory-private.h"
51 #include "magick/monitor.h"
52 #include "magick/monitor-private.h"
53 #include "magick/option.h"
54 #include "magick/policy.h"
55 #include "magick/policy-private.h"
56 #include "magick/resource_.h"
57 #include "magick/semaphore.h"
58 #include "magick/stream-private.h"
59 #include "magick/string_.h"
60 #include "magick/string-private.h"
61 #include "magick/timer-private.h"
62 #include "magick/token.h"
63 #include "magick/utility.h"
64 #include "magick/utility-private.h"
65 #include "magick/xml-tree.h"
66 #include "magick/xml-tree-private.h"
67 #if defined(MAGICKCORE_XML_DELEGATE)
68 # include <libxml/parser.h>
69 # include <libxml/tree.h>
75 #define PolicyFilename "policy.xml"
128 { UndefinedPolicyDomain, UndefinedPolicyRights, (
const char *) NULL,
129 (
const char *) NULL, (
const char *) NULL }
141 static MagickBooleanType
143 LoadPolicyCache(
LinkedListInfo *,
const char *,
const char *,
const size_t,
145 SetMagickSecurityPolicyValue(
const PolicyDomain,
const char *,
const char *,
189 cache=NewLinkedList(0);
191 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
193 #if MAGICKCORE_ZERO_CONFIGURATION_SUPPORT
194 magick_unreferenced(filename);
195 status=LoadPolicyCache(cache,ZeroConfigurationPolicy,
"[zero-configuration]",0,
197 if (status == MagickFalse)
198 CatchException(exception);
207 options=GetConfigureOptions(filename,exception);
208 option=(
const StringInfo *) GetNextValueInLinkedList(options);
211 status&=LoadPolicyCache(cache,(
const char *) GetStringInfoDatum(option),
212 GetStringInfoPath(option),0,exception);
213 if (status == MagickFalse)
214 CatchException(exception);
215 option=(
const StringInfo *) GetNextValueInLinkedList(options);
217 options=DestroyConfigureOptions(options);
223 for (i=0; i < (ssize_t) (
sizeof(PolicyMap)/
sizeof(*PolicyMap)); i++)
232 policy_info=(
PolicyInfo *) AcquireMagickMemory(
sizeof(*policy_info));
235 (void) ThrowMagickException(exception,GetMagickModule(),
236 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
237 p->name == (
char *) NULL ?
"" : p->name);
238 CatchException(exception);
242 (void) memset(policy_info,0,
sizeof(*policy_info));
243 policy_info->path=(
char *)
"[built-in]";
244 policy_info->domain=p->domain;
245 policy_info->rights=p->rights;
246 policy_info->name=(
char *) p->name;
247 policy_info->pattern=(
char *) p->pattern;
248 policy_info->value=(
char *) p->value;
249 policy_info->exempt=MagickTrue;
250 policy_info->signature=MagickCoreSignature;
251 status&=AppendValueToLinkedList(cache,policy_info);
252 if (status == MagickFalse)
254 (void) ThrowMagickException(exception,GetMagickModule(),
255 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
256 p->name == (
char *) NULL ?
"" : p->name);
257 CatchException(exception);
260 if (status == MagickFalse)
261 CatchException(exception);
293 policyname[MagickPathExtent],
306 if (IsPolicyCacheInstantiated(exception) == MagickFalse)
312 if (name != (
const char *) NULL)
313 (void) CopyMagickString(policyname,name,MagickPathExtent);
314 for (q=policyname; *q !=
'\0'; q++)
316 if (isspace((
int) ((
unsigned char) *q)) == 0)
318 (void) CopyMagickString(q,q+1,MagickPathExtent);
324 domain=UndefinedPolicyDomain;
325 for (q=policyname; *q !=
'\0'; q++)
330 domain=(PolicyDomain) ParseCommandOption(MagickPolicyDomainOptions,
331 MagickTrue,policyname);
332 (void) CopyMagickString(policyname,q+1,MagickPathExtent);
339 LockSemaphoreInfo(policy_semaphore);
340 ResetLinkedListIterator(policy_cache);
341 p=GetHeadElementInLinkedList(policy_cache);
342 if ((name == (
const char *) NULL) || (LocaleCompare(name,
"*") == 0))
344 UnlockSemaphoreInfo(policy_semaphore);
352 if ((domain == UndefinedPolicyDomain) || (policy->domain == domain))
353 if (LocaleCompare(policyname,policy->name) == 0)
360 (
void) SetHeadElementInLinkedList(policy_cache,p);
361 UnlockSemaphoreInfo(policy_semaphore);
392 MagickExport
const PolicyInfo **GetPolicyInfoList(
const char *pattern,
407 assert(pattern != (
char *) NULL);
408 assert(number_policies != (
size_t *) NULL);
409 if (IsEventLogging() != MagickFalse)
410 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
412 p=GetPolicyInfo(
"*",exception);
415 policies=(
const PolicyInfo **) AcquireQuantumMemory((
size_t)
416 GetNumberOfElementsInLinkedList(policy_cache)+1UL,
sizeof(*policies));
422 LockSemaphoreInfo(policy_semaphore);
423 ResetLinkedListIterator(policy_cache);
424 p=(
const PolicyInfo *) GetNextValueInLinkedList(policy_cache);
427 if ((p->stealth == MagickFalse) &&
428 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
430 p=(
const PolicyInfo *) GetNextValueInLinkedList(policy_cache);
432 UnlockSemaphoreInfo(policy_semaphore);
434 *number_policies=(size_t) i;
466 static char *AcquirePolicyString(
const char *source,
const size_t pad)
475 if (source != (
char *) NULL)
476 length+=strlen(source);
477 destination=(
char *) NULL;
479 destination=(
char *) AcquireMagickMemory((length+pad)*
sizeof(*destination));
480 if (destination == (
char *) NULL)
481 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
482 if (source != (
char *) NULL)
483 (
void) memcpy(destination,source,length*
sizeof(*destination));
484 destination[length]=
'\0';
488 MagickExport
char **GetPolicyList(
const char *pattern,
size_t *number_policies,
503 assert(pattern != (
char *) NULL);
504 assert(number_policies != (
size_t *) NULL);
505 if (IsEventLogging() != MagickFalse)
506 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
508 p=GetPolicyInfo(
"*",exception);
510 return((
char **) NULL);
511 policies=(
char **) AcquireQuantumMemory((
size_t)
512 GetNumberOfElementsInLinkedList(policy_cache)+1UL,
sizeof(*policies));
513 if (policies == (
char **) NULL)
514 return((
char **) NULL);
518 LockSemaphoreInfo(policy_semaphore);
519 ResetLinkedListIterator(policy_cache);
520 p=(
const PolicyInfo *) GetNextValueInLinkedList(policy_cache);
523 if ((p->stealth == MagickFalse) &&
524 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
525 policies[i++]=AcquirePolicyString(p->name,1);
526 p=(
const PolicyInfo *) GetNextValueInLinkedList(policy_cache);
528 UnlockSemaphoreInfo(policy_semaphore);
529 policies[i]=(
char *) NULL;
530 *number_policies=(size_t) i;
556 MagickExport
char *GetPolicyValue(
const char *name)
567 assert(name != (
const char *) NULL);
568 if (IsEventLogging() != MagickFalse)
569 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
570 exception=AcquireExceptionInfo();
571 policy_info=GetPolicyInfo(name,exception);
572 exception=DestroyExceptionInfo(exception);
574 return((
char *) NULL);
575 value=policy_info->value;
576 if ((value == (
const char *) NULL) || (*value ==
'\0'))
577 return((
char *) NULL);
578 return(AcquirePolicyString(value,1));
604 static MagickBooleanType IsPolicyCacheInstantiated(
ExceptionInfo *exception)
608 (void) GetMaxMemoryRequest();
610 ActivateSemaphoreInfo(&policy_semaphore);
611 LockSemaphoreInfo(policy_semaphore);
613 policy_cache=AcquirePolicyCache(PolicyFilename,exception);
614 UnlockSemaphoreInfo(policy_semaphore);
616 return(policy_cache != (
LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
653 MagickPrivate MagickBooleanType IsRightsAuthorizedByName(
654 const PolicyDomain domain,
const char *name,
const PolicyRights rights,
658 *canonical_directory = (
char *) NULL,
659 *canonical_path = (
char *) NULL,
660 *canonical_candidate = (
char *) NULL,
661 directory[MagickPathExtent],
662 filename[MagickPathExtent];
671 matched_any = MagickFalse,
672 paths_provisioned = MagickFalse,
676 effective_rights = AllPolicyRights;
681 if ((GetLogEventMask() & PolicyEvent) != 0)
682 (void) LogMagickEvent(PolicyEvent,GetMagickModule(),
683 "Domain: %s; name: %s; rights=%s; pattern=\"%s\"; ...",
684 CommandOptionToMnemonic(MagickPolicyDomainOptions,domain),
685 name == (
const char *) NULL ?
"undefined" : name,
686 CommandOptionToMnemonic(MagickPolicyRightsOptions,rights),
687 pattern == (
const char *) NULL ?
"undefined" : pattern);
688 exception=AcquireExceptionInfo();
689 status=IsPolicyCacheInstantiated(exception);
690 exception=DestroyExceptionInfo(exception);
691 if (status == MagickFalse)
693 if ((GetLogEventMask() & PolicyEvent) != 0)
694 (void) LogMagickEvent(PolicyEvent,GetMagickModule(),
695 " authorized: true (no security policies found)");
701 LockSemaphoreInfo(policy_semaphore);
702 ResetLinkedListIterator(policy_cache);
703 p=GetHeadElementInLinkedList(policy_cache);
712 if (policy->domain != domain)
714 if ((name != (
char *) NULL) && (LocaleCompare(name,policy->name) != 0))
716 match=GlobExpression(pattern,policy->pattern,MagickFalse);
717 if (policy->domain == PathPolicyDomain)
719 if (paths_provisioned == MagickFalse)
724 paths_provisioned=MagickTrue;
725 GetPathComponent(pattern,HeadPath,directory);
726 GetPathComponent(pattern,TailPath,filename);
727 canonical_directory=realpath_utf8(directory);
728 if ((canonical_directory != (
char *) NULL) && (*filename !=
'\0'))
733 length=strlen(canonical_directory)+strlen(filename)+2;
734 canonical_candidate=(
char *) AcquireCriticalMemory(length*
735 sizeof(*canonical_candidate));
736 if (canonical_candidate != (
char *) NULL)
737 (
void) FormatLocaleString(canonical_candidate,length,
"%s%s%s",
738 canonical_directory,DirectorySeparator,filename);
740 canonical_path=realpath_utf8(pattern);
745 if ((canonical_directory != (
char *) NULL) && (match == MagickFalse))
746 match=GlobExpression(canonical_directory,policy->pattern,MagickFalse);
747 if ((canonical_candidate != (
char *) NULL) && (match == MagickFalse))
748 match=GlobExpression(canonical_candidate,policy->pattern,MagickFalse);
749 if ((canonical_path != (
char *) NULL) && (match == MagickFalse))
750 match=GlobExpression(canonical_path,policy->pattern,MagickFalse);
752 if (match == MagickFalse)
754 matched_any=MagickTrue;
755 effective_rights=policy->rights;
757 UnlockSemaphoreInfo(policy_semaphore);
758 if (canonical_directory != (
char *) NULL)
759 canonical_directory=DestroyString(canonical_directory);
760 if (canonical_candidate != (
char *) NULL)
761 canonical_candidate=DestroyString(canonical_candidate);
762 if (canonical_path != (
char *) NULL)
763 canonical_path=DestroyString(canonical_path);
768 if (matched_any != MagickFalse)
770 if (((rights & ReadPolicyRights) != 0) &&
771 ((effective_rights & ReadPolicyRights) == 0))
773 if (((rights & WritePolicyRights) != 0) &&
774 ((effective_rights & WritePolicyRights) == 0))
776 if (((rights & ExecutePolicyRights) != 0) &&
777 ((effective_rights & ExecutePolicyRights) == 0))
780 if ((GetLogEventMask() & PolicyEvent) != 0)
781 (void) LogMagickEvent(PolicyEvent,GetMagickModule(),
782 " authorized: %s",status == MagickFalse ?
"false" :
"true");
786 MagickExport MagickBooleanType IsRightsAuthorized(
const PolicyDomain domain,
787 const PolicyRights rights,
const char *pattern)
789 return(IsRightsAuthorizedByName(domain,(
const char *) NULL,rights,pattern));
816 MagickExport MagickBooleanType ListPolicyInfo(FILE *file,
835 if (file == (
const FILE *) NULL)
837 policy_info=GetPolicyInfoList(
"*",&number_policies,exception);
838 if (policy_info == (
const PolicyInfo **) NULL)
840 path=(
const char *) NULL;
841 for (i=0; i < (ssize_t) number_policies; i++)
843 if (policy_info[i]->stealth != MagickFalse)
845 if (((path == (
const char *) NULL) ||
846 (LocaleCompare(path,policy_info[i]->path) != 0)) &&
847 (policy_info[i]->path != (
char *) NULL))
848 (
void) FormatLocaleFile(file,
"\nPath: %s\n",policy_info[i]->path);
849 path=policy_info[i]->path;
850 domain=CommandOptionToMnemonic(MagickPolicyDomainOptions,
851 policy_info[i]->domain);
852 (void) FormatLocaleFile(file,
" Policy: %s\n",domain);
853 if ((policy_info[i]->domain == CachePolicyDomain) ||
854 (policy_info[i]->domain == ResourcePolicyDomain) ||
855 (policy_info[i]->domain == SystemPolicyDomain))
857 if (policy_info[i]->name != (
char *) NULL)
858 (
void) FormatLocaleFile(file,
" name: %s\n",policy_info[i]->name);
859 if (policy_info[i]->value != (
char *) NULL)
860 (void) FormatLocaleFile(file,
" value: %s\n",policy_info[i]->value);
864 (void) FormatLocaleFile(file,
" rights: ");
865 if (policy_info[i]->rights == NoPolicyRights)
866 (void) FormatLocaleFile(file,
"None ");
867 if ((policy_info[i]->rights & ReadPolicyRights) != 0)
868 (
void) FormatLocaleFile(file,
"Read ");
869 if ((policy_info[i]->rights & WritePolicyRights) != 0)
870 (void) FormatLocaleFile(file,
"Write ");
871 if ((policy_info[i]->rights & ExecutePolicyRights) != 0)
872 (
void) FormatLocaleFile(file,
"Execute ");
873 (void) FormatLocaleFile(file,
"\n");
874 if (policy_info[i]->pattern != (
char *) NULL)
875 (
void) FormatLocaleFile(file,
" pattern: %s\n",
876 policy_info[i]->pattern);
879 policy_info=(
const PolicyInfo **) RelinquishMagickMemory((
void *)
915 static MagickBooleanType LoadPolicyCache(
LinkedListInfo *cache,
const char *xml,
916 const char *filename,
const size_t depth,
ExceptionInfo *exception)
919 keyword[MagickPathExtent],
937 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
938 "Loading policy file \"%s\" ...",filename);
939 if (xml == (
char *) NULL)
943 token=AcquirePolicyString(xml,MagickPathExtent);
944 extent=strlen(token)+MagickPathExtent;
945 for (q=(
const char *) xml; *q !=
'\0'; )
950 (void) GetNextToken(q,&q,extent,token);
953 (void) CopyMagickString(keyword,token,MagickPathExtent);
954 if (LocaleNCompare(keyword,
"<!DOCTYPE",9) == 0)
959 while ((LocaleNCompare(q,
"]>",2) != 0) && (*q !=
'\0'))
960 (
void) GetNextToken(q,&q,extent,token);
963 if (LocaleNCompare(keyword,
"<!--",4) == 0)
968 while ((LocaleNCompare(q,
"->",2) != 0) && (*q !=
'\0'))
969 (void) GetNextToken(q,&q,extent,token);
972 if (LocaleCompare(keyword,
"<include") == 0)
977 while (((*token !=
'/') && (*(token+1) !=
'>')) && (*q !=
'\0'))
979 (void) CopyMagickString(keyword,token,MagickPathExtent);
980 (void) GetNextToken(q,&q,extent,token);
983 (void) GetNextToken(q,&q,extent,token);
984 if (LocaleCompare(keyword,
"file") == 0)
986 if (depth > MagickMaxRecursionDepth)
987 (void) ThrowMagickException(exception,GetMagickModule(),
988 ConfigureError,
"IncludeElementNestedTooDeeply",
"`%s'",token);
992 path[MagickPathExtent],
995 GetPathComponent(filename,HeadPath,path);
997 (void) ConcatenateMagickString(path,DirectorySeparator,
999 if (*token == *DirectorySeparator)
1000 (void) CopyMagickString(path,token,MagickPathExtent);
1002 (
void) ConcatenateMagickString(path,token,MagickPathExtent);
1003 xml=FileToXML(path,~0UL);
1004 if (xml != (
char *) NULL)
1006 status&=LoadPolicyCache(cache,xml,path,depth+1,
1008 xml=(
char *) RelinquishMagickMemory(xml);
1015 if (LocaleCompare(keyword,
"<policy") == 0)
1020 policy_info=(
PolicyInfo *) AcquireMagickMemory(
sizeof(*policy_info));
1022 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1023 (void) memset(policy_info,0,
sizeof(*policy_info));
1024 policy_info->path=AcquirePolicyString(filename,1);
1025 policy_info->exempt=MagickFalse;
1026 policy_info->signature=MagickCoreSignature;
1031 if ((LocaleCompare(keyword,
"/>") == 0) ||
1032 (LocaleCompare(keyword,
"</policy>") == 0))
1034 status=AppendValueToLinkedList(cache,policy_info);
1035 if (status == MagickFalse)
1036 (void) ThrowMagickException(exception,GetMagickModule(),
1037 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
1042 (void) GetNextToken(q,(
const char **) NULL,extent,token);
1045 (void) GetNextToken(q,&q,extent,token);
1046 (void) GetNextToken(q,&q,extent,token);
1052 if (LocaleCompare((
char *) keyword,
"domain") == 0)
1054 policy_info->domain=(PolicyDomain) ParseCommandOption(
1055 MagickPolicyDomainOptions,MagickTrue,token);
1063 if (LocaleCompare((
char *) keyword,
"name") == 0)
1065 policy_info->name=AcquirePolicyString(token,1);
1073 if (LocaleCompare((
char *) keyword,
"pattern") == 0)
1075 policy_info->pattern=AcquirePolicyString(token,1);
1083 if (LocaleCompare((
char *) keyword,
"rights") == 0)
1085 policy_info->rights=(PolicyRights) ParseCommandOption(
1086 MagickPolicyRightsOptions,MagickTrue,token);
1094 if (LocaleCompare((
char *) keyword,
"stealth") == 0)
1096 policy_info->stealth=IsMagickTrue(token);
1104 if (LocaleCompare((
char *) keyword,
"value") == 0)
1106 policy_info->value=AcquirePolicyString(token,1);
1115 token=(
char *) RelinquishMagickMemory(token);
1116 if (status == MagickFalse)
1117 CatchException(exception);
1118 return(status != 0 ? MagickTrue : MagickFalse);
1139 MagickExport MagickBooleanType PolicyComponentGenesis(
void)
1142 policy_semaphore=AllocateSemaphoreInfo();
1165 static void *DestroyPolicyElement(
void *policy_info)
1171 if (p->exempt == MagickFalse)
1173 if (p->value != (
char *) NULL)
1174 p->value=DestroyString(p->value);
1175 if (p->pattern != (
char *) NULL)
1176 p->pattern=DestroyString(p->pattern);
1177 if (p->name != (
char *) NULL)
1178 p->name=DestroyString(p->name);
1179 if (p->path != (
char *) NULL)
1180 p->path=DestroyString(p->path);
1183 return((
void *) NULL);
1186 MagickExport
void PolicyComponentTerminus(
void)
1189 ActivateSemaphoreInfo(&policy_semaphore);
1190 LockSemaphoreInfo(policy_semaphore);
1192 policy_cache=DestroyLinkedList(policy_cache,DestroyPolicyElement);
1193 UnlockSemaphoreInfo(policy_semaphore);
1194 DestroySemaphoreInfo(&policy_semaphore);
1224 static MagickBooleanType ValidateSecurityPolicy(
const char *policy,
1227 #if defined(MAGICKCORE_XML_DELEGATE)
1234 document=xmlReadMemory(policy,(
int) strlen(policy),url,NULL,
1235 XML_PARSE_NOERROR | XML_PARSE_NOWARNING);
1236 if (document == (xmlDocPtr) NULL)
1238 (void) ThrowMagickException(exception,GetMagickModule(),ConfigureError,
1239 "PolicyValidationException",
"'%s'",url);
1240 return(MagickFalse);
1242 xmlFreeDoc(document);
1251 MagickExport MagickBooleanType SetMagickSecurityPolicy(
const char *policy,
1267 if (policy == (
const char *) NULL)
1268 return(MagickFalse);
1269 if (ValidateSecurityPolicy(policy,PolicyFilename,exception) == MagickFalse)
1270 return(MagickFalse);
1271 status=LoadPolicyCache(policy_cache,policy,
"[user-policy]",0,exception);
1272 if (status == MagickFalse)
1277 user_policies=NewLinkedList(0);
1278 status=LoadPolicyCache(user_policies,policy,
"[user-policy]",0,exception);
1279 if (status == MagickFalse)
1281 user_policies=DestroyLinkedList(user_policies,DestroyPolicyElement);
1282 return(MagickFalse);
1284 ResetLinkedListIterator(user_policies);
1285 p=(
PolicyInfo *) GetNextValueInLinkedList(user_policies);
1288 if ((p->name != (
char *) NULL) && (p->value != (
char *) NULL))
1289 (
void) SetMagickSecurityPolicyValue(p->domain,p->name,p->value,exception);
1290 p=(
PolicyInfo *) GetNextValueInLinkedList(user_policies);
1292 user_policies=DestroyLinkedList(user_policies,DestroyPolicyElement);
1329 static MagickBooleanType SetMagickSecurityPolicyValue(
const PolicyDomain domain,
1330 const char *name,
const char *value,
ExceptionInfo *exception)
1332 magick_unreferenced(exception);
1334 if ((name == (
const char *) NULL) || (value == (
const char *) NULL))
1335 return(MagickFalse);
1338 case CachePolicyDomain:
1340 if (LocaleCompare(name,
"memory-map") == 0)
1342 if (LocaleCompare(value,
"anonymous") != 0)
1343 return(MagickFalse);
1344 ResetCacheAnonymousMemory();
1345 ResetStreamAnonymousMemory();
1350 case ResourcePolicyDomain:
1355 type=ParseCommandOption(MagickResourceOptions,MagickFalse,name);
1361 limit=MagickResourceInfinity;
1362 if (LocaleCompare(
"unlimited",value) != 0)
1363 limit=StringToMagickSizeType(value,100.0);
1364 if ((ResourceType) type == TimeResource)
1365 limit=(MagickSizeType) ParseMagickTimeToLive(value);
1366 return(SetMagickResourceLimit((ResourceType) type,limit));
1370 case SystemPolicyDomain:
1372 if (LocaleCompare(name,
"max-memory-request") == 0)
1377 limit=MagickResourceInfinity;
1378 if (LocaleCompare(
"unlimited",value) != 0)
1379 limit=StringToMagickSizeType(value,100.0);
1380 SetMaxMemoryRequest(limit);
1383 if (LocaleCompare(name,
"memory-map") == 0)
1385 if (LocaleCompare(value,
"anonymous") != 0)
1386 return(MagickFalse);
1387 ResetVirtualAnonymousMemory();
1390 if (LocaleCompare(name,
"precision") == 0)
1395 limit=StringToInteger(value);
1396 SetMagickPrecision(limit);
1401 case CoderPolicyDomain:
1402 case DelegatePolicyDomain:
1403 case FilterPolicyDomain:
1404 case ModulePolicyDomain:
1405 case PathPolicyDomain:
1409 return(MagickFalse);