42#include "MagickCore/studio.h"
43#include "MagickCore/cache.h"
44#include "MagickCore/configure.h"
45#include "MagickCore/exception.h"
46#include "MagickCore/exception-private.h"
47#include "MagickCore/linked-list.h"
48#include "MagickCore/log.h"
49#include "MagickCore/image.h"
50#include "MagickCore/image-private.h"
51#include "MagickCore/memory_.h"
52#include "MagickCore/nt-base-private.h"
53#include "MagickCore/option.h"
54#include "MagickCore/policy.h"
55#include "MagickCore/random_.h"
56#include "MagickCore/registry.h"
57#include "MagickCore/resource_.h"
58#include "MagickCore/resource-private.h"
59#include "MagickCore/semaphore.h"
60#include "MagickCore/signature-private.h"
61#include "MagickCore/string_.h"
62#include "MagickCore/string-private.h"
63#include "MagickCore/splay-tree.h"
64#include "MagickCore/thread-private.h"
65#include "MagickCore/timer-private.h"
66#include "MagickCore/token.h"
67#include "MagickCore/utility.h"
68#include "MagickCore/utility-private.h"
73#define NumberOfResourceTypes \
74 (sizeof(resource_semaphore)/sizeof(*resource_semaphore))
112 *random_info = (RandomInfo *) NULL;
117 MagickULLConstant(0),
118 MagickULLConstant(0),
119 MagickULLConstant(0),
120 MagickULLConstant(0),
121 MagickULLConstant(0),
122 MagickULLConstant(0),
123 MagickULLConstant(0),
124 MagickULLConstant(0),
125 MagickULLConstant(0),
126 MagickULLConstant(0),
127 MagickULLConstant(0),
128 (MagickSizeType) (MAGICK_SSIZE_MAX/
sizeof(Quantum)/MaxPixelChannels),
129 (MagickSizeType) (MAGICK_SSIZE_MAX/
sizeof(Quantum)/MaxPixelChannels),
130 MagickResourceInfinity,
131 MagickULLConstant(3072)*1024*1024,
132 MagickULLConstant(1536)*1024*1024,
133 MagickULLConstant(3072)*1024*1024,
134 MagickResourceInfinity,
135 MagickULLConstant(768),
136 MagickULLConstant(1),
137 MagickULLConstant(0),
138 MagickResourceInfinity,
142 *resource_semaphore[] = {
158 *temporary_resources = (SplayTreeInfo *) NULL;
187MagickExport MagickBooleanType AcquireMagickResource(
const ResourceType type,
188 const MagickSizeType size)
201 request=(MagickOffsetType) size;
217 ActivateSemaphoreInfo(&resource_semaphore[type]);
218 LockSemaphoreInfo(resource_semaphore[type]);
228 resource_info.area=request;
229 limit=resource_info.area_limit;
230 if ((limit == MagickResourceInfinity) || (size < limit))
237 limit=resource_info.disk_limit;
238 if (resource_info.disk <= (MagickOffsetMax-request))
240 resource_info.disk+=request;
241 if ((limit == MagickResourceInfinity) ||
242 (resource_info.disk < (MagickOffsetType) limit))
245 resource_info.disk-=request;
247 current=resource_info.disk;
252 limit=resource_info.file_limit;
253 if (resource_info.file <= (MagickOffsetMax-request))
255 resource_info.file+=request;
256 if ((limit == MagickResourceInfinity) ||
257 (resource_info.file < (MagickOffsetType) limit))
260 current=resource_info.file;
266 resource_info.height=request;
267 limit=resource_info.height_limit;
268 if ((limit == MagickResourceInfinity) || (size < limit))
272 case ListLengthResource:
274 resource_info.list_length=request;
275 limit=resource_info.list_length_limit;
276 if ((limit == MagickResourceInfinity) || (size < limit))
283 limit=resource_info.map_limit;
284 if (resource_info.map <= (MagickOffsetMax-request))
286 resource_info.map+=request;
287 if ((limit == MagickResourceInfinity) ||
288 (resource_info.map < (MagickOffsetType) limit))
291 resource_info.map-=request;
293 current=resource_info.map;
299 limit=resource_info.memory_limit;
300 if (resource_info.memory <= (MagickOffsetMax-request))
302 resource_info.memory+=request;
303 if ((limit == MagickResourceInfinity) ||
304 (resource_info.memory < (MagickOffsetType) limit))
307 resource_info.memory-=request;
309 current=resource_info.memory;
314 limit=resource_info.thread_limit;
315 if ((limit == MagickResourceInfinity) ||
316 (resource_info.thread < (MagickOffsetType) limit))
320 case ThrottleResource:
322 limit=resource_info.throttle_limit;
323 if ((limit == MagickResourceInfinity) ||
324 (resource_info.throttle < (MagickOffsetType) limit))
330 limit=resource_info.time_limit;
331 if (resource_info.time <= (MagickOffsetMax-request))
333 resource_info.time+=request;
334 if ((limit == MagickResourceInfinity) ||
335 (resource_info.time < (MagickOffsetType) limit))
338 resource_info.time-=request;
340 current=resource_info.time;
346 resource_info.width=request;
347 limit=resource_info.width_limit;
348 if ((limit == MagickResourceInfinity) || (size < limit))
366 UnlockSemaphoreInfo(resource_semaphore[type]);
371 if ((GetLogEventMask() & ResourceEvent) != 0)
374 resource_current[MagickFormatExtent],
375 resource_limit[MagickFormatExtent],
376 resource_request[MagickFormatExtent];
378 (void) FormatMagickSize(size,bi,(bi != MagickFalse) ?
"B" :
379 (
const char *) NULL,MagickFormatExtent,resource_request);
380 (void) FormatMagickSize((MagickSizeType) current,bi,(bi != MagickFalse) ?
381 "B" : (
const char *) NULL,MagickFormatExtent,resource_current);
382 (void) FormatMagickSize(limit,bi,(bi != MagickFalse) ?
"B" :
383 (
const char *) NULL,MagickFormatExtent,resource_limit);
384 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"%s: %s/%s/%s",
385 CommandOptionToMnemonic(MagickResourceOptions,(ssize_t) type),
386 resource_request,resource_current,resource_limit);
411MagickExport
void AsynchronousResourceComponentTerminus(
void)
416 if (temporary_resources == (SplayTreeInfo *) NULL)
421 ResetSplayTreeIterator(temporary_resources);
422 path=(
const char *) GetNextKeyInSplayTree(temporary_resources);
423 while (path != (
const char *) NULL)
425 (void) ShredFile(path);
426 (void) remove_utf8(path);
427 path=(
const char *) GetNextKeyInSplayTree(temporary_resources);
456static void *DestroyTemporaryResources(
void *temporary_resource)
458 (void) ShredFile((
char *) temporary_resource);
459 (void) remove_utf8((
char *) temporary_resource);
460 temporary_resource=DestroyString((
char *) temporary_resource);
461 return((
void *) NULL);
464MagickExport
int AcquireUniqueFileResource(
char *path)
480 portable_filename[65] =
481 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
492 assert(path != (
char *) NULL);
493 if ((GetLogEventMask() & ResourceEvent) != 0)
494 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"...");
495 if (random_info == (RandomInfo *) NULL)
497 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
498 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
499 LockSemaphoreInfo(resource_semaphore[FileResource]);
500 if (random_info == (RandomInfo *) NULL)
501 random_info=AcquireRandomInfo();
502 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
505 for (i=0; i < (ssize_t) TMP_MAX; i++)
513 (void) GetPathTemplate(path);
514 key=GetRandomKey(random_info,strlen(MagickPathTemplate)-6);
515 p=path+strlen(path)-strlen(MagickPathTemplate);
516 datum=GetStringInfoDatum(key);
517 for (j=0; j < (ssize_t) GetStringInfoLength(key); j++)
519 c=(int) (datum[j] & 0x3f);
520 *p++=portable_filename[c];
522 key=DestroyStringInfo(key);
523#if defined(MAGICKCORE_HAVE_MKSTEMP)
527#if defined(MAGICKCORE_HAVE_FCHMOD)
528 (void) fchmod(file,0600);
531 setmode(file,O_BINARY);
536 key=GetRandomKey(random_info,strlen(MagickPathTemplate));
537 p=path+strlen(path)-strlen(MagickPathTemplate);
538 datum=GetStringInfoDatum(key);
539 for (j=0; j < (ssize_t) GetStringInfoLength(key); j++)
541 c=(int) (datum[j] & 0x3f);
542 *p++=portable_filename[c];
544 key=DestroyStringInfo(key);
545 file=open_utf8(path,O_RDWR | O_CLOEXEC | O_CREAT | O_EXCL | O_BINARY | O_NOFOLLOW,
547 if ((file >= 0) || (errno != EEXIST))
550 if ((GetLogEventMask() & ResourceEvent) != 0)
551 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"%s",path);
554 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
555 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
556 LockSemaphoreInfo(resource_semaphore[FileResource]);
557 if (temporary_resources == (SplayTreeInfo *) NULL)
558 temporary_resources=NewSplayTree(CompareSplayTreeString,
559 DestroyTemporaryResources,RelinquishMagickMemory);
560 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
561 attributes=(
struct stat *) AcquireCriticalMemory(
sizeof(
struct stat));
562 status=GetPathAttributes(path,attributes);
563 if (status == MagickFalse)
564 attributes=(
struct stat *) RelinquishMagickMemory(attributes);
566 status=AddValueToSplayTree(temporary_resources,ConstantString(path),
568 if (status == MagickFalse)
569 file=close_utf8(file)-1;
595MagickExport MagickSizeType GetMagickResource(
const ResourceType type)
610 ActivateSemaphoreInfo(&resource_semaphore[type]);
611 LockSemaphoreInfo(resource_semaphore[type]);
620 resource=(MagickSizeType) resource_info.area;
625 resource=(MagickSizeType) resource_info.disk;
630 resource=(MagickSizeType) resource_info.file;
635 resource=(MagickSizeType) resource_info.height;
638 case ListLengthResource:
640 resource=(MagickSizeType) resource_info.list_length;
645 resource=(MagickSizeType) resource_info.map;
650 resource=(MagickSizeType) resource_info.memory;
655 resource=(MagickSizeType) resource_info.time;
660 resource=(MagickSizeType) resource_info.thread;
663 case ThrottleResource:
665 resource=(MagickSizeType) resource_info.throttle;
670 resource=(MagickSizeType) resource_info.width;
684 UnlockSemaphoreInfo(resource_semaphore[type]);
715MagickExport MagickBooleanType IsFileResourceIdentityValid(
const char *path)
718 *temporary_attributes;
726 if (temporary_resources == (SplayTreeInfo *) NULL)
728 LockSemaphoreInfo(resource_semaphore[FileResource]);
729 temporary_attributes=(
const struct stat *) GetValueFromSplayTree(
730 temporary_resources,(
const void *) path);
731 if (temporary_attributes != (
const struct stat *) NULL)
733 status=GetPathAttributes(path,&attributes);
734 if (status != MagickFalse)
735 if ((attributes.st_dev != temporary_attributes->st_dev) ||
736 (attributes.st_ino != temporary_attributes->st_ino) ||
737 (attributes.st_mode != temporary_attributes->st_mode))
740 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
766MagickExport MagickSizeType GetMagickResourceLimit(
const ResourceType type)
774 return(resource_info.area_limit);
776 return(resource_info.height_limit);
777 case ListLengthResource:
778 return(resource_info.list_length_limit);
780 return(resource_info.thread_limit);
781 case ThrottleResource:
782 return(resource_info.throttle_limit);
784 return(resource_info.width_limit);
789 ActivateSemaphoreInfo(&resource_semaphore[type]);
790 LockSemaphoreInfo(resource_semaphore[type]);
795 resource=resource_info.disk_limit;
800 resource=resource_info.file_limit;
805 resource=resource_info.map_limit;
810 resource=resource_info.memory_limit;
815 resource=resource_info.time_limit;
821 UnlockSemaphoreInfo(resource_semaphore[type]);
851static void FormatTimeToLive(
const MagickSizeType ttl,
char *timeString)
863 seconds=ttl % 31536000;
866 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld years",years);
870 seconds=ttl % 2628000;
873 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld months",
878 seconds=ttl % 604800;
881 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld weeks",weeks);
888 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld days",days);
895 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld hours",hours);
902 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld minutes",
906 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld seconds",ttl);
909MagickExport MagickBooleanType ListMagickResourceInfo(FILE *file,
910 ExceptionInfo *magick_unused(exception))
913 area_limit[MagickFormatExtent],
914 disk_limit[MagickFormatExtent],
915 height_limit[MagickFormatExtent],
916 list_length_limit[MagickFormatExtent],
917 map_limit[MagickFormatExtent],
918 memory_limit[MagickFormatExtent],
919 time_limit[MagickFormatExtent],
920 width_limit[MagickFormatExtent];
922 magick_unreferenced(exception);
924 if (file == (
const FILE *) NULL)
926 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
927 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
928 LockSemaphoreInfo(resource_semaphore[FileResource]);
929 (void) FormatMagickSize(resource_info.width_limit,MagickFalse,
"P",
930 MagickFormatExtent,width_limit);
931 (void) FormatMagickSize(resource_info.height_limit,MagickFalse,
"P",
932 MagickFormatExtent,height_limit);
933 (void) FormatMagickSize(resource_info.area_limit,MagickFalse,
"P",
934 MagickFormatExtent,area_limit);
935 (void) CopyMagickString(list_length_limit,
"unlimited",MagickFormatExtent);
936 if (resource_info.list_length_limit != MagickResourceInfinity)
937 (void) FormatMagickSize(resource_info.list_length_limit,MagickTrue,
"B",
938 MagickFormatExtent,list_length_limit);
939 (void) FormatMagickSize(resource_info.memory_limit,MagickTrue,
"B",
940 MagickFormatExtent,memory_limit);
941 (void) FormatMagickSize(resource_info.map_limit,MagickTrue,
"B",
942 MagickFormatExtent,map_limit);
943 (void) CopyMagickString(disk_limit,
"unlimited",MagickFormatExtent);
944 if (resource_info.disk_limit != MagickResourceInfinity)
945 (void) FormatMagickSize(resource_info.disk_limit,MagickTrue,
"B",
946 MagickFormatExtent,disk_limit);
947 (void) CopyMagickString(time_limit,
"unlimited",MagickFormatExtent);
948 if (resource_info.time_limit != MagickResourceInfinity)
949 FormatTimeToLive(resource_info.time_limit,time_limit);
950 (void) FormatLocaleFile(file,
"Resource limits:\n");
951 (void) FormatLocaleFile(file,
" Width: %s\n",width_limit);
952 (void) FormatLocaleFile(file,
" Height: %s\n",height_limit);
953 (void) FormatLocaleFile(file,
" Area: %s\n",area_limit);
954 (void) FormatLocaleFile(file,
" List length: %s\n",list_length_limit);
955 (void) FormatLocaleFile(file,
" Memory: %s\n",memory_limit);
956 (void) FormatLocaleFile(file,
" Map: %s\n",map_limit);
957 (void) FormatLocaleFile(file,
" Disk: %s\n",disk_limit);
958 (void) FormatLocaleFile(file,
" File: %.17g\n",(
double) ((MagickOffsetType)
959 resource_info.file_limit));
960 (void) FormatLocaleFile(file,
" Thread: %.17g\n",(
double) ((MagickOffsetType)
961 resource_info.thread_limit));
962 (void) FormatLocaleFile(file,
" Throttle: %.17g\n",(
double)
963 ((MagickOffsetType) resource_info.throttle_limit));
964 (void) FormatLocaleFile(file,
" Time: %s\n",time_limit);
966 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
995MagickExport
void RelinquishMagickResource(
const ResourceType type,
996 const MagickSizeType size)
1013 case MemoryResource:
1017 ActivateSemaphoreInfo(&resource_semaphore[type]);
1018 LockSemaphoreInfo(resource_semaphore[type]);
1028 resource_info.disk-=(MagickOffsetType) size;
1029 current=(MagickSizeType) resource_info.disk;
1030 limit=resource_info.disk_limit;
1031 assert(resource_info.disk >= 0);
1036 resource_info.file-=(MagickOffsetType) size;
1037 current=(MagickSizeType) resource_info.file;
1038 limit=resource_info.file_limit;
1039 assert(resource_info.file >= 0);
1045 resource_info.map-=(MagickOffsetType) size;
1046 current=(MagickSizeType) resource_info.map;
1047 limit=resource_info.map_limit;
1048 assert(resource_info.map >= 0);
1051 case MemoryResource:
1054 resource_info.memory-=(MagickOffsetType) size;
1055 current=(MagickSizeType) resource_info.memory;
1056 limit=resource_info.memory_limit;
1057 assert(resource_info.memory >= 0);
1063 resource_info.time-=(MagickOffsetType) size;
1064 current=(MagickSizeType) resource_info.time;
1065 limit=resource_info.time_limit;
1066 assert(resource_info.time >= 0);
1080 case MemoryResource:
1083 UnlockSemaphoreInfo(resource_semaphore[type]);
1088 if ((GetLogEventMask() & ResourceEvent) != 0)
1091 resource_current[MagickFormatExtent],
1092 resource_limit[MagickFormatExtent],
1093 resource_request[MagickFormatExtent];
1095 (void) FormatMagickSize(size,bi,(bi != MagickFalse) ?
"B" :
1096 (
const char *) NULL,MagickFormatExtent,resource_request);
1097 (void) FormatMagickSize(current,bi,(bi != MagickFalse) ?
"B" :
1098 (
const char *) NULL,MagickFormatExtent,resource_current);
1099 (void) FormatMagickSize(limit,bi,(bi != MagickFalse) ?
"B" :
1100 (
const char *) NULL,MagickFormatExtent,resource_limit);
1101 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"%s: %s/%s/%s",
1102 CommandOptionToMnemonic(MagickResourceOptions,(ssize_t) type),
1103 resource_request,resource_current,resource_limit);
1129MagickExport MagickBooleanType RelinquishUniqueFileResource(
const char *path)
1132 cache_path[MagickPathExtent];
1137 assert(path != (
const char *) NULL);
1139 if ((GetLogEventMask() & ResourceEvent) != 0)
1140 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"%s",path);
1141 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
1142 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
1143 LockSemaphoreInfo(resource_semaphore[FileResource]);
1144 if (temporary_resources != (SplayTreeInfo *) NULL)
1145 status=DeleteNodeFromSplayTree(temporary_resources,(
const void *) path);
1146 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
1147 (void) CopyMagickString(cache_path,path,MagickPathExtent);
1148 AppendImageFormat(
"cache",cache_path);
1149 if (access_utf8(cache_path,F_OK) == 0)
1151 status=ShredFile(cache_path);
1152 status|=(MagickStatusType) remove_utf8(cache_path);
1154 if (status == MagickFalse)
1156 status=ShredFile(path);
1157 status|=(MagickStatusType) remove_utf8(path);
1159 return(status == 0 ? MagickFalse : MagickTrue);
1181MagickPrivate MagickBooleanType ResourceComponentGenesis(
void)
1199 for (i=0; i < (ssize_t) NumberOfResourceTypes; i++)
1201 resource_semaphore[i]=AcquireSemaphoreInfo();
1202 (void) SetMagickResourceLimit(WidthResource,resource_info.width_limit);
1203 limit=GetEnvironmentValue(
"MAGICK_WIDTH_LIMIT");
1204 if (limit != (
char *) NULL)
1206 (void) SetMagickResourceLimit(WidthResource,StringToMagickSizeType(limit,
1208 limit=DestroyString(limit);
1210 (void) SetMagickResourceLimit(HeightResource,resource_info.height_limit);
1211 limit=GetEnvironmentValue(
"MAGICK_HEIGHT_LIMIT");
1212 if (limit != (
char *) NULL)
1214 (void) SetMagickResourceLimit(HeightResource,StringToMagickSizeType(
1216 limit=DestroyString(limit);
1218 pagesize=GetMagickPageSize();
1220#if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_PHYS_PAGES)
1221 pages=(ssize_t) sysconf(_SC_PHYS_PAGES);
1222#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1226 memory=(MagickSizeType) ((MagickOffsetType) pages*pagesize);
1227 if ((pagesize <= 0) || (pages <= 0))
1228 memory=2048UL*1024UL*1024UL;
1229#if defined(MAGICKCORE_PixelCacheThreshold)
1230 memory=StringToMagickSizeType(MAGICKCORE_PixelCacheThreshold,100.0);
1232 (void) SetMagickResourceLimit(AreaResource,4*memory);
1233 limit=GetEnvironmentValue(
"MAGICK_AREA_LIMIT");
1234 if (limit != (
char *) NULL)
1236 (void) SetMagickResourceLimit(AreaResource,StringToMagickSizeType(limit,
1238 limit=DestroyString(limit);
1240 (void) SetMagickResourceLimit(MemoryResource,memory);
1241 limit=GetEnvironmentValue(
"MAGICK_MEMORY_LIMIT");
1242 if (limit != (
char *) NULL)
1244 (void) SetMagickResourceLimit(MemoryResource,StringToMagickSizeType(
1246 limit=DestroyString(limit);
1248 (void) SetMagickResourceLimit(MapResource,2*memory);
1249 limit=GetEnvironmentValue(
"MAGICK_MAP_LIMIT");
1250 if (limit != (
char *) NULL)
1252 (void) SetMagickResourceLimit(MapResource,StringToMagickSizeType(limit,
1254 limit=DestroyString(limit);
1256 (void) SetMagickResourceLimit(DiskResource,MagickResourceInfinity);
1257 limit=GetEnvironmentValue(
"MAGICK_DISK_LIMIT");
1258 if (limit != (
char *) NULL)
1260 (void) SetMagickResourceLimit(DiskResource,StringToMagickSizeType(limit,
1262 limit=DestroyString(limit);
1265#if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_OPEN_MAX)
1266 files=(ssize_t) sysconf(_SC_OPEN_MAX);
1268#if defined(MAGICKCORE_HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)
1274 if (getrlimit(RLIMIT_NOFILE,&resources) != -1)
1275 files=(ssize_t) resources.rlim_cur;
1278#if defined(MAGICKCORE_HAVE_GETDTABLESIZE) && defined(MAGICKCORE_POSIX_SUPPORT)
1280 files=(ssize_t) getdtablesize();
1284 (void) SetMagickResourceLimit(FileResource,MagickMax((
size_t)
1286 limit=GetEnvironmentValue(
"MAGICK_FILE_LIMIT");
1287 if (limit != (
char *) NULL)
1289 (void) SetMagickResourceLimit(FileResource,StringToMagickSizeType(limit,
1291 limit=DestroyString(limit);
1293 number_threads=(ssize_t) GetOpenMPMaximumThreads();
1294 if (number_threads > 1)
1296 (void) SetMagickResourceLimit(ThreadResource,(
size_t) number_threads);
1297 limit=GetEnvironmentValue(
"MAGICK_THREAD_LIMIT");
1298 if (limit != (
char *) NULL)
1300 (void) SetMagickResourceLimit(ThreadResource,StringToMagickSizeType(
1302 limit=DestroyString(limit);
1304 (void) SetMagickResourceLimit(ThrottleResource,0);
1305 limit=GetEnvironmentValue(
"MAGICK_THROTTLE_LIMIT");
1306 if (limit != (
char *) NULL)
1308 (void) SetMagickResourceLimit(ThrottleResource,StringToMagickSizeType(
1310 limit=DestroyString(limit);
1312 (void) SetMagickResourceLimit(TimeResource,MagickResourceInfinity);
1313 limit=GetEnvironmentValue(
"MAGICK_TIME_LIMIT");
1314 if (limit != (
char *) NULL)
1316 (void) SetMagickResourceLimit(TimeResource,(MagickSizeType)
1317 ParseMagickTimeToLive(limit));
1318 limit=DestroyString(limit);
1320 (void) SetMagickResourceLimit(ListLengthResource,MagickResourceInfinity);
1321 limit=GetEnvironmentValue(
"MAGICK_LIST_LENGTH_LIMIT");
1322 if (limit != (
char *) NULL)
1324 (void) SetMagickResourceLimit(ListLengthResource,
1325 StringToMagickSizeType(limit,100.0));
1326 limit=DestroyString(limit);
1331#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
1352MagickExport
void ResetMagickResourceCounters(
void)
1354 resource_info.width=0;
1355 resource_info.height=0;
1356 resource_info.list_length=0;
1357 resource_info.area=0;
1358 resource_info.memory=0;
1359 resource_info.map=0;
1360 resource_info.disk=0;
1361 resource_info.file=0;
1362 resource_info.thread=0;
1363 resource_info.throttle=0;
1364 resource_info.time=0;
1386MagickPrivate
void ResourceComponentTerminus(
void)
1391 for (i=0; i < (ssize_t) NumberOfResourceTypes; i++)
1393 resource_semaphore[i]=AcquireSemaphoreInfo();
1394 LockSemaphoreInfo(resource_semaphore[FileResource]);
1395 if (temporary_resources != (SplayTreeInfo *) NULL)
1396 temporary_resources=DestroySplayTree(temporary_resources);
1397 if (random_info != (RandomInfo *) NULL)
1398 random_info=DestroyRandomInfo(random_info);
1399 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
1400 for (i=0; i < (ssize_t) NumberOfResourceTypes; i++)
1401 RelinquishSemaphoreInfo(&resource_semaphore[i]);
1429MagickExport MagickBooleanType SetMagickResourceLimit(
const ResourceType type,
1430 const MagickSizeType limit)
1439 value=(
char *) NULL;
1445 case MemoryResource:
1449 ActivateSemaphoreInfo(&resource_semaphore[type]);
1450 LockSemaphoreInfo(resource_semaphore[type]);
1459 value=GetPolicyValue(
"resource:area");
1460 if (value == (
char *) NULL)
1461 resource_info.area_limit=limit;
1463 resource_info.area_limit=MagickMin(limit,StringToMagickSizeType(value,
1469 value=GetPolicyValue(
"resource:disk");
1470 if (value == (
char *) NULL)
1471 resource_info.disk_limit=limit;
1473 resource_info.disk_limit=MagickMin(limit,StringToMagickSizeType(value,
1479 value=GetPolicyValue(
"resource:file");
1480 if (value == (
char *) NULL)
1481 resource_info.file_limit=limit;
1483 resource_info.file_limit=MagickMin(limit,StringToMagickSizeType(value,
1487 case HeightResource:
1489 value=GetPolicyValue(
"resource:height");
1490 if (value == (
char *) NULL)
1491 resource_info.height_limit=limit;
1493 resource_info.height_limit=MagickMin(limit,StringToMagickSizeType(
1495 resource_info.height_limit=MagickMin(resource_info.height_limit,
1496 (MagickSizeType) MAGICK_SSIZE_MAX);
1499 case ListLengthResource:
1501 value=GetPolicyValue(
"resource:list-length");
1502 if (value == (
char *) NULL)
1503 resource_info.list_length_limit=limit;
1505 resource_info.list_length_limit=MagickMin(limit,
1506 StringToMagickSizeType(value,100.0));
1511 value=GetPolicyValue(
"resource:map");
1512 if (value == (
char *) NULL)
1513 resource_info.map_limit=limit;
1515 resource_info.map_limit=MagickMin(limit,StringToMagickSizeType(
1519 case MemoryResource:
1521 value=GetPolicyValue(
"resource:memory");
1522 if (value == (
char *) NULL)
1523 resource_info.memory_limit=limit;
1525 resource_info.memory_limit=MagickMin(limit,StringToMagickSizeType(
1529 case ThreadResource:
1531 value=GetPolicyValue(
"resource:thread");
1532 if (value == (
char *) NULL)
1533 resource_info.thread_limit=limit;
1535 resource_info.thread_limit=MagickMin(limit,StringToMagickSizeType(
1537 if (resource_info.thread_limit > GetOpenMPMaximumThreads())
1538 resource_info.thread_limit=GetOpenMPMaximumThreads();
1540 if (resource_info.thread_limit == 0)
1541 resource_info.thread_limit=1;
1544 case ThrottleResource:
1546 value=GetPolicyValue(
"resource:throttle");
1547 if (value == (
char *) NULL)
1548 resource_info.throttle_limit=limit;
1550 resource_info.throttle_limit=MagickMax(limit,StringToMagickSizeType(
1556 value=GetPolicyValue(
"resource:time");
1557 if (value == (
char *) NULL)
1558 resource_info.time_limit=limit;
1560 resource_info.time_limit=MagickMin(limit,(MagickSizeType)
1561 ParseMagickTimeToLive(value));
1566 value=GetPolicyValue(
"resource:width");
1567 if (value == (
char *) NULL)
1568 resource_info.width_limit=limit;
1570 resource_info.width_limit=MagickMin(limit,StringToMagickSizeType(value,
1572 resource_info.width_limit=MagickMin(resource_info.width_limit,
1573 (MagickSizeType) MAGICK_SSIZE_MAX);
1587 case MemoryResource:
1590 UnlockSemaphoreInfo(resource_semaphore[type]);
1595 if (value != (
char *) NULL)
1596 value=DestroyString(value);