]> granicus.if.org Git - imagemagick/commitdiff
Support policy rights of "All"
authorCristy <urban-warrior@imagemagick.org>
Fri, 27 Jan 2017 23:52:14 +0000 (18:52 -0500)
committerCristy <urban-warrior@imagemagick.org>
Fri, 27 Jan 2017 23:52:14 +0000 (18:52 -0500)
MagickCore/constitute.c
MagickCore/option.c
MagickCore/policy.c
MagickCore/policy.h

index 7c943d28e5324a91dd68dc9be5fbacac487f4488..7c193b6b5081e77289afa0d5bea17db6a0a068dd 100644 (file)
@@ -388,12 +388,6 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
   MagickStatusType
     flags;
 
-  PolicyDomain
-    domain;
-
-  PolicyRights
-    rights;
-
   /*
     Determine image type from filename prefix or suffix (e.g. image.jpg).
   */
@@ -409,16 +403,6 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
   (void) SetImageInfo(read_info,0,exception);
   (void) CopyMagickString(filename,read_info->filename,MagickPathExtent);
   (void) CopyMagickString(magick,read_info->magick,MagickPathExtent);
-  domain=CoderPolicyDomain;
-  rights=ReadPolicyRights;
-  if (IsRightsAuthorized(domain,rights,read_info->magick) == MagickFalse)
-    {
-      errno=EPERM;
-      (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
-        "NotAuthorized","`%s'",read_info->filename);
-      read_info=DestroyImageInfo(read_info);
-      return((Image *) NULL);
-    }
   /*
     Call appropriate image reader based on image type.
   */
@@ -427,6 +411,22 @@ MagickExport Image *ReadImage(const ImageInfo *image_info,
   sans_exception=DestroyExceptionInfo(sans_exception);
   if (magick_info != (const MagickInfo *) NULL)
     {
+      PolicyDomain
+        domain;
+
+      PolicyRights
+        rights;
+
+      domain=CoderPolicyDomain;
+      rights=ReadPolicyRights;
+      if (IsRightsAuthorized(domain,rights,magick_info->module) == MagickFalse)
+        {
+          errno=EPERM;
+          (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
+            "NotAuthorized","`%s'",read_info->filename);
+          read_info=DestroyImageInfo(read_info);
+          return((Image *) NULL);
+        }
       if (GetMagickEndianSupport(magick_info) == MagickFalse)
         read_info->endian=UndefinedEndian;
       else
@@ -986,12 +986,6 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
     status,
     temporary;
 
-  PolicyDomain
-    domain;
-
-  PolicyRights
-    rights;
-
   /*
     Determine image type from filename prefix or suffix (e.g. image.jpg).
   */
@@ -1013,15 +1007,6 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
   (void) CopyMagickString(filename,image->filename,MagickPathExtent);
   (void) CopyMagickString(image->filename,write_info->filename,
     MagickPathExtent);
-  domain=CoderPolicyDomain;
-  rights=WritePolicyRights;
-  if (IsRightsAuthorized(domain,rights,write_info->magick) == MagickFalse)
-    {
-      sans_exception=DestroyExceptionInfo(sans_exception);
-      write_info=DestroyImageInfo(write_info);
-      errno=EPERM;
-      ThrowBinaryException(PolicyError,"NotAuthorized",filename);
-    }
   /*
     Call appropriate image writer based on image type.
   */
@@ -1029,6 +1014,20 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info,
   sans_exception=DestroyExceptionInfo(sans_exception);
   if (magick_info != (const MagickInfo *) NULL)
     {
+      PolicyDomain
+        domain;
+
+      PolicyRights
+        rights;
+
+      domain=CoderPolicyDomain;
+      rights=WritePolicyRights;
+      if (IsRightsAuthorized(domain,rights,magick_info->module) == MagickFalse)
+        {
+          write_info=DestroyImageInfo(write_info);
+          errno=EPERM;
+          ThrowBinaryException(PolicyError,"NotAuthorized",filename);
+        }
       if (GetMagickEndianSupport(magick_info) == MagickFalse)
         image->endian=UndefinedEndian;
       else
index eb7d4f16938ccf4bcba1623bae9ea273e3ee2e6c..276b88261c6c28a23f7b72db2fbb3a7d37e6951f 100644 (file)
@@ -1559,10 +1559,11 @@ static const OptionInfo
   PolicyRightsOptions[] =
   {
     { "Undefined", UndefinedPolicyRights, UndefinedOptionFlag, MagickTrue },
+    { "All", AllPolicyRights, UndefinedOptionFlag, MagickFalse },
+    { "Execute", ExecutePolicyRights, UndefinedOptionFlag, MagickFalse },
     { "None", NoPolicyRights, UndefinedOptionFlag, MagickFalse },
     { "Read", ReadPolicyRights, UndefinedOptionFlag, MagickFalse },
     { "Write", WritePolicyRights, UndefinedOptionFlag, MagickFalse },
-    { "Execute", ExecutePolicyRights, UndefinedOptionFlag, MagickFalse },
     { (char *) NULL, UndefinedPolicyRights, UndefinedOptionFlag, MagickFalse }
   },
   PreviewOptions[] =
index 433cf85ec63d360bdb9360c62f002a671f3f7cdc..ee81b3208c0adf794466730e0eac97993d56819f 100644 (file)
@@ -593,20 +593,17 @@ MagickExport MagickBooleanType IsRightsAuthorized(const PolicyDomain domain,
   LockSemaphoreInfo(policy_semaphore);
   ResetLinkedListIterator(policy_cache);
   p=(PolicyInfo *) GetNextValueInLinkedList(policy_cache);
-  while ((p != (PolicyInfo *) NULL) && (authorized != MagickFalse))
+  while (p != (PolicyInfo *) NULL)
   {
     if ((p->domain == domain) &&
         (GlobExpression(pattern,p->pattern,MagickFalse) != MagickFalse))
       {
-        if (((rights & ReadPolicyRights) != 0) &&
-            ((p->rights & ReadPolicyRights) == 0))
-          authorized=MagickFalse;
-        if (((rights & WritePolicyRights) != 0) &&
-            ((p->rights & WritePolicyRights) == 0))
-          authorized=MagickFalse;
-        if (((rights & ExecutePolicyRights) != 0) &&
-            ((p->rights & ExecutePolicyRights) == 0))
-          authorized=MagickFalse;
+        if ((rights & ReadPolicyRights) != 0)
+          authorized=(p->rights & ReadPolicyRights) != 0;
+        if ((rights & WritePolicyRights) != 0)
+          authorized=(p->rights & WritePolicyRights) != 0;
+        if ((rights & ExecutePolicyRights) != 0)
+          authorized=(p->rights & ExecutePolicyRights) != 0;
       }
     p=(PolicyInfo *) GetNextValueInLinkedList(policy_cache);
   }
index d6e6bfce5682f980a4873a26600f7f6b27aed1cb..d4657f55dd5f68693c18bb60ba505209d8195b5d 100644 (file)
@@ -43,7 +43,8 @@ typedef enum
   NoPolicyRights = 0x00,
   ReadPolicyRights = 0x01,
   WritePolicyRights = 0x02,
-  ExecutePolicyRights = 0x04
+  ExecutePolicyRights = 0x04,
+  AllPolicyRights = 0xff
 } PolicyRights;
 
 typedef struct _PolicyInfo