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)
466#if !defined(O_NOFOLLOW)
470# define TMP_MAX 238328
487 portable_filename[65] =
488 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
499 assert(path != (
char *) NULL);
500 if ((GetLogEventMask() & ResourceEvent) != 0)
501 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"...");
502 if (random_info == (RandomInfo *) NULL)
504 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
505 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
506 LockSemaphoreInfo(resource_semaphore[FileResource]);
507 if (random_info == (RandomInfo *) NULL)
508 random_info=AcquireRandomInfo();
509 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
512 for (i=0; i < (ssize_t) TMP_MAX; i++)
520 (void) GetPathTemplate(path);
521 key=GetRandomKey(random_info,strlen(MagickPathTemplate)-6);
522 p=path+strlen(path)-strlen(MagickPathTemplate);
523 datum=GetStringInfoDatum(key);
524 for (j=0; j < (ssize_t) GetStringInfoLength(key); j++)
526 c=(int) (datum[j] & 0x3f);
527 *p++=portable_filename[c];
529 key=DestroyStringInfo(key);
530#if defined(MAGICKCORE_HAVE_MKSTEMP)
534#if defined(MAGICKCORE_HAVE_FCHMOD)
535 (void) fchmod(file,0600);
538 setmode(file,O_BINARY);
543 key=GetRandomKey(random_info,strlen(MagickPathTemplate));
544 p=path+strlen(path)-strlen(MagickPathTemplate);
545 datum=GetStringInfoDatum(key);
546 for (j=0; j < (ssize_t) GetStringInfoLength(key); j++)
548 c=(int) (datum[j] & 0x3f);
549 *p++=portable_filename[c];
551 key=DestroyStringInfo(key);
552 file=open_utf8(path,O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_NOFOLLOW,
554 if ((file >= 0) || (errno != EEXIST))
557 if ((GetLogEventMask() & ResourceEvent) != 0)
558 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"%s",path);
561 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
562 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
563 LockSemaphoreInfo(resource_semaphore[FileResource]);
564 if (temporary_resources == (SplayTreeInfo *) NULL)
565 temporary_resources=NewSplayTree(CompareSplayTreeString,
566 DestroyTemporaryResources,RelinquishMagickMemory);
567 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
568 attributes=(
struct stat *) AcquireCriticalMemory(
sizeof(
struct stat));
569 status=GetPathAttributes(path,attributes);
570 if (status == MagickFalse)
571 attributes=(
struct stat *) RelinquishMagickMemory(attributes);
573 status=AddValueToSplayTree(temporary_resources,ConstantString(path),
575 if (status == MagickFalse)
576 file=close_utf8(file)-1;
602MagickExport MagickSizeType GetMagickResource(
const ResourceType type)
617 ActivateSemaphoreInfo(&resource_semaphore[type]);
618 LockSemaphoreInfo(resource_semaphore[type]);
627 resource=(MagickSizeType) resource_info.area;
632 resource=(MagickSizeType) resource_info.disk;
637 resource=(MagickSizeType) resource_info.file;
642 resource=(MagickSizeType) resource_info.height;
645 case ListLengthResource:
647 resource=(MagickSizeType) resource_info.list_length;
652 resource=(MagickSizeType) resource_info.map;
657 resource=(MagickSizeType) resource_info.memory;
662 resource=(MagickSizeType) resource_info.time;
667 resource=(MagickSizeType) resource_info.thread;
670 case ThrottleResource:
672 resource=(MagickSizeType) resource_info.throttle;
677 resource=(MagickSizeType) resource_info.width;
691 UnlockSemaphoreInfo(resource_semaphore[type]);
722MagickExport MagickBooleanType IsFileResourceIdentityValid(
const char *path)
725 *temporary_attributes;
733 if (temporary_resources == (SplayTreeInfo *) NULL)
735 LockSemaphoreInfo(resource_semaphore[FileResource]);
736 temporary_attributes=(
const struct stat *) GetValueFromSplayTree(
737 temporary_resources,(
const void *) path);
738 if (temporary_attributes != (
const struct stat *) NULL)
740 status=GetPathAttributes(path,&attributes);
741 if (status != MagickFalse)
742 if ((attributes.st_dev != temporary_attributes->st_dev) ||
743 (attributes.st_ino != temporary_attributes->st_ino) ||
744 (attributes.st_mode != temporary_attributes->st_mode))
747 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
773MagickExport MagickSizeType GetMagickResourceLimit(
const ResourceType type)
781 return(resource_info.area_limit);
783 return(resource_info.height_limit);
784 case ListLengthResource:
785 return(resource_info.list_length_limit);
787 return(resource_info.thread_limit);
788 case ThrottleResource:
789 return(resource_info.throttle_limit);
791 return(resource_info.width_limit);
796 ActivateSemaphoreInfo(&resource_semaphore[type]);
797 LockSemaphoreInfo(resource_semaphore[type]);
802 resource=resource_info.disk_limit;
807 resource=resource_info.file_limit;
812 resource=resource_info.map_limit;
817 resource=resource_info.memory_limit;
822 resource=resource_info.time_limit;
828 UnlockSemaphoreInfo(resource_semaphore[type]);
858static void FormatTimeToLive(
const MagickSizeType ttl,
char *timeString)
870 seconds=ttl % 31536000;
873 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld years",years);
877 seconds=ttl % 2628000;
880 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld months",
885 seconds=ttl % 604800;
888 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld weeks",weeks);
895 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld days",days);
902 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld hours",hours);
909 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld minutes",
913 (void) FormatLocaleString(timeString,MagickPathExtent,
"%lld seconds",ttl);
916MagickExport MagickBooleanType ListMagickResourceInfo(FILE *file,
917 ExceptionInfo *magick_unused(exception))
920 area_limit[MagickFormatExtent],
921 disk_limit[MagickFormatExtent],
922 height_limit[MagickFormatExtent],
923 list_length_limit[MagickFormatExtent],
924 map_limit[MagickFormatExtent],
925 memory_limit[MagickFormatExtent],
926 time_limit[MagickFormatExtent],
927 width_limit[MagickFormatExtent];
929 magick_unreferenced(exception);
931 if (file == (
const FILE *) NULL)
933 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
934 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
935 LockSemaphoreInfo(resource_semaphore[FileResource]);
936 (void) FormatMagickSize(resource_info.width_limit,MagickFalse,
"P",
937 MagickFormatExtent,width_limit);
938 (void) FormatMagickSize(resource_info.height_limit,MagickFalse,
"P",
939 MagickFormatExtent,height_limit);
940 (void) FormatMagickSize(resource_info.area_limit,MagickFalse,
"P",
941 MagickFormatExtent,area_limit);
942 (void) CopyMagickString(list_length_limit,
"unlimited",MagickFormatExtent);
943 if (resource_info.list_length_limit != MagickResourceInfinity)
944 (void) FormatMagickSize(resource_info.list_length_limit,MagickTrue,
"B",
945 MagickFormatExtent,list_length_limit);
946 (void) FormatMagickSize(resource_info.memory_limit,MagickTrue,
"B",
947 MagickFormatExtent,memory_limit);
948 (void) FormatMagickSize(resource_info.map_limit,MagickTrue,
"B",
949 MagickFormatExtent,map_limit);
950 (void) CopyMagickString(disk_limit,
"unlimited",MagickFormatExtent);
951 if (resource_info.disk_limit != MagickResourceInfinity)
952 (void) FormatMagickSize(resource_info.disk_limit,MagickTrue,
"B",
953 MagickFormatExtent,disk_limit);
954 (void) CopyMagickString(time_limit,
"unlimited",MagickFormatExtent);
955 if (resource_info.time_limit != MagickResourceInfinity)
956 FormatTimeToLive(resource_info.time_limit,time_limit);
957 (void) FormatLocaleFile(file,
"Resource limits:\n");
958 (void) FormatLocaleFile(file,
" Width: %s\n",width_limit);
959 (void) FormatLocaleFile(file,
" Height: %s\n",height_limit);
960 (void) FormatLocaleFile(file,
" Area: %s\n",area_limit);
961 (void) FormatLocaleFile(file,
" List length: %s\n",list_length_limit);
962 (void) FormatLocaleFile(file,
" Memory: %s\n",memory_limit);
963 (void) FormatLocaleFile(file,
" Map: %s\n",map_limit);
964 (void) FormatLocaleFile(file,
" Disk: %s\n",disk_limit);
965 (void) FormatLocaleFile(file,
" File: %.20g\n",(
double) ((MagickOffsetType)
966 resource_info.file_limit));
967 (void) FormatLocaleFile(file,
" Thread: %.20g\n",(
double) ((MagickOffsetType)
968 resource_info.thread_limit));
969 (void) FormatLocaleFile(file,
" Throttle: %.20g\n",(
double)
970 ((MagickOffsetType) resource_info.throttle_limit));
971 (void) FormatLocaleFile(file,
" Time: %s\n",time_limit);
973 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
1002MagickExport
void RelinquishMagickResource(
const ResourceType type,
1003 const MagickSizeType size)
1020 case MemoryResource:
1024 ActivateSemaphoreInfo(&resource_semaphore[type]);
1025 LockSemaphoreInfo(resource_semaphore[type]);
1035 resource_info.disk-=(MagickOffsetType) size;
1036 current=(MagickSizeType) resource_info.disk;
1037 limit=resource_info.disk_limit;
1038 assert(resource_info.disk >= 0);
1043 resource_info.file-=(MagickOffsetType) size;
1044 current=(MagickSizeType) resource_info.file;
1045 limit=resource_info.file_limit;
1046 assert(resource_info.file >= 0);
1052 resource_info.map-=(MagickOffsetType) size;
1053 current=(MagickSizeType) resource_info.map;
1054 limit=resource_info.map_limit;
1055 assert(resource_info.map >= 0);
1058 case MemoryResource:
1061 resource_info.memory-=(MagickOffsetType) size;
1062 current=(MagickSizeType) resource_info.memory;
1063 limit=resource_info.memory_limit;
1064 assert(resource_info.memory >= 0);
1070 resource_info.time-=(MagickOffsetType) size;
1071 current=(MagickSizeType) resource_info.time;
1072 limit=resource_info.time_limit;
1073 assert(resource_info.time >= 0);
1087 case MemoryResource:
1090 UnlockSemaphoreInfo(resource_semaphore[type]);
1095 if ((GetLogEventMask() & ResourceEvent) != 0)
1098 resource_current[MagickFormatExtent],
1099 resource_limit[MagickFormatExtent],
1100 resource_request[MagickFormatExtent];
1102 (void) FormatMagickSize(size,bi,(bi != MagickFalse) ?
"B" :
1103 (
const char *) NULL,MagickFormatExtent,resource_request);
1104 (void) FormatMagickSize(current,bi,(bi != MagickFalse) ?
"B" :
1105 (
const char *) NULL,MagickFormatExtent,resource_current);
1106 (void) FormatMagickSize(limit,bi,(bi != MagickFalse) ?
"B" :
1107 (
const char *) NULL,MagickFormatExtent,resource_limit);
1108 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"%s: %s/%s/%s",
1109 CommandOptionToMnemonic(MagickResourceOptions,(ssize_t) type),
1110 resource_request,resource_current,resource_limit);
1136MagickExport MagickBooleanType RelinquishUniqueFileResource(
const char *path)
1139 cache_path[MagickPathExtent];
1144 assert(path != (
const char *) NULL);
1146 if ((GetLogEventMask() & ResourceEvent) != 0)
1147 (void) LogMagickEvent(ResourceEvent,GetMagickModule(),
"%s",path);
1148 if (resource_semaphore[FileResource] == (
SemaphoreInfo *) NULL)
1149 ActivateSemaphoreInfo(&resource_semaphore[FileResource]);
1150 LockSemaphoreInfo(resource_semaphore[FileResource]);
1151 if (temporary_resources != (SplayTreeInfo *) NULL)
1152 status=DeleteNodeFromSplayTree(temporary_resources,(
const void *) path);
1153 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
1154 (void) CopyMagickString(cache_path,path,MagickPathExtent);
1155 AppendImageFormat(
"cache",cache_path);
1156 if (access_utf8(cache_path,F_OK) == 0)
1158 status=ShredFile(cache_path);
1159 status|=(MagickStatusType) remove_utf8(cache_path);
1161 if (status == MagickFalse)
1163 status=ShredFile(path);
1164 status|=(MagickStatusType) remove_utf8(path);
1166 return(status == 0 ? MagickFalse : MagickTrue);
1188MagickPrivate MagickBooleanType ResourceComponentGenesis(
void)
1206 for (i=0; i < (ssize_t) NumberOfResourceTypes; i++)
1208 resource_semaphore[i]=AcquireSemaphoreInfo();
1209 (void) SetMagickResourceLimit(WidthResource,resource_info.width_limit);
1210 limit=GetEnvironmentValue(
"MAGICK_WIDTH_LIMIT");
1211 if (limit != (
char *) NULL)
1213 (void) SetMagickResourceLimit(WidthResource,StringToMagickSizeType(limit,
1215 limit=DestroyString(limit);
1217 (void) SetMagickResourceLimit(HeightResource,resource_info.height_limit);
1218 limit=GetEnvironmentValue(
"MAGICK_HEIGHT_LIMIT");
1219 if (limit != (
char *) NULL)
1221 (void) SetMagickResourceLimit(HeightResource,StringToMagickSizeType(
1223 limit=DestroyString(limit);
1225 pagesize=GetMagickPageSize();
1227#if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_PHYS_PAGES)
1228 pages=(ssize_t) sysconf(_SC_PHYS_PAGES);
1229#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1233 memory=(MagickSizeType) ((MagickOffsetType) pages*pagesize);
1234 if ((pagesize <= 0) || (pages <= 0))
1235 memory=2048UL*1024UL*1024UL;
1236#if defined(MAGICKCORE_PixelCacheThreshold)
1237 memory=StringToMagickSizeType(MAGICKCORE_PixelCacheThreshold,100.0);
1239 (void) SetMagickResourceLimit(AreaResource,4*memory);
1240 limit=GetEnvironmentValue(
"MAGICK_AREA_LIMIT");
1241 if (limit != (
char *) NULL)
1243 (void) SetMagickResourceLimit(AreaResource,StringToMagickSizeType(limit,
1245 limit=DestroyString(limit);
1247 (void) SetMagickResourceLimit(MemoryResource,memory);
1248 limit=GetEnvironmentValue(
"MAGICK_MEMORY_LIMIT");
1249 if (limit != (
char *) NULL)
1251 (void) SetMagickResourceLimit(MemoryResource,StringToMagickSizeType(
1253 limit=DestroyString(limit);
1255 (void) SetMagickResourceLimit(MapResource,2*memory);
1256 limit=GetEnvironmentValue(
"MAGICK_MAP_LIMIT");
1257 if (limit != (
char *) NULL)
1259 (void) SetMagickResourceLimit(MapResource,StringToMagickSizeType(limit,
1261 limit=DestroyString(limit);
1263 (void) SetMagickResourceLimit(DiskResource,MagickResourceInfinity);
1264 limit=GetEnvironmentValue(
"MAGICK_DISK_LIMIT");
1265 if (limit != (
char *) NULL)
1267 (void) SetMagickResourceLimit(DiskResource,StringToMagickSizeType(limit,
1269 limit=DestroyString(limit);
1272#if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_OPEN_MAX)
1273 files=(ssize_t) sysconf(_SC_OPEN_MAX);
1275#if defined(MAGICKCORE_HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)
1281 if (getrlimit(RLIMIT_NOFILE,&resources) != -1)
1282 files=(ssize_t) resources.rlim_cur;
1285#if defined(MAGICKCORE_HAVE_GETDTABLESIZE) && defined(MAGICKCORE_POSIX_SUPPORT)
1287 files=(ssize_t) getdtablesize();
1291 (void) SetMagickResourceLimit(FileResource,MagickMax((
size_t)
1293 limit=GetEnvironmentValue(
"MAGICK_FILE_LIMIT");
1294 if (limit != (
char *) NULL)
1296 (void) SetMagickResourceLimit(FileResource,StringToMagickSizeType(limit,
1298 limit=DestroyString(limit);
1300 number_threads=(ssize_t) GetOpenMPMaximumThreads();
1301 if (number_threads > 1)
1303 (void) SetMagickResourceLimit(ThreadResource,(
size_t) number_threads);
1304 limit=GetEnvironmentValue(
"MAGICK_THREAD_LIMIT");
1305 if (limit != (
char *) NULL)
1307 (void) SetMagickResourceLimit(ThreadResource,StringToMagickSizeType(
1309 limit=DestroyString(limit);
1311 (void) SetMagickResourceLimit(ThrottleResource,0);
1312 limit=GetEnvironmentValue(
"MAGICK_THROTTLE_LIMIT");
1313 if (limit != (
char *) NULL)
1315 (void) SetMagickResourceLimit(ThrottleResource,StringToMagickSizeType(
1317 limit=DestroyString(limit);
1319 (void) SetMagickResourceLimit(TimeResource,MagickResourceInfinity);
1320 limit=GetEnvironmentValue(
"MAGICK_TIME_LIMIT");
1321 if (limit != (
char *) NULL)
1323 (void) SetMagickResourceLimit(TimeResource,(MagickSizeType)
1324 ParseMagickTimeToLive(limit));
1325 limit=DestroyString(limit);
1327 (void) SetMagickResourceLimit(ListLengthResource,MagickResourceInfinity);
1328 limit=GetEnvironmentValue(
"MAGICK_LIST_LENGTH_LIMIT");
1329 if (limit != (
char *) NULL)
1331 (void) SetMagickResourceLimit(ListLengthResource,
1332 StringToMagickSizeType(limit,100.0));
1333 limit=DestroyString(limit);
1338#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
1359MagickExport
void ResetMagickResourceCounters(
void)
1361 resource_info.width=0;
1362 resource_info.height=0;
1363 resource_info.list_length=0;
1364 resource_info.area=0;
1365 resource_info.memory=0;
1366 resource_info.map=0;
1367 resource_info.disk=0;
1368 resource_info.file=0;
1369 resource_info.thread=0;
1370 resource_info.throttle=0;
1371 resource_info.time=0;
1393MagickPrivate
void ResourceComponentTerminus(
void)
1398 for (i=0; i < (ssize_t) NumberOfResourceTypes; i++)
1400 resource_semaphore[i]=AcquireSemaphoreInfo();
1401 LockSemaphoreInfo(resource_semaphore[FileResource]);
1402 if (temporary_resources != (SplayTreeInfo *) NULL)
1403 temporary_resources=DestroySplayTree(temporary_resources);
1404 if (random_info != (RandomInfo *) NULL)
1405 random_info=DestroyRandomInfo(random_info);
1406 UnlockSemaphoreInfo(resource_semaphore[FileResource]);
1407 for (i=0; i < (ssize_t) NumberOfResourceTypes; i++)
1408 RelinquishSemaphoreInfo(&resource_semaphore[i]);
1436MagickExport MagickBooleanType SetMagickResourceLimit(
const ResourceType type,
1437 const MagickSizeType limit)
1446 value=(
char *) NULL;
1452 case MemoryResource:
1456 ActivateSemaphoreInfo(&resource_semaphore[type]);
1457 LockSemaphoreInfo(resource_semaphore[type]);
1466 value=GetPolicyValue(
"resource:area");
1467 if (value == (
char *) NULL)
1468 resource_info.area_limit=limit;
1470 resource_info.area_limit=MagickMin(limit,StringToMagickSizeType(value,
1476 value=GetPolicyValue(
"resource:disk");
1477 if (value == (
char *) NULL)
1478 resource_info.disk_limit=limit;
1480 resource_info.disk_limit=MagickMin(limit,StringToMagickSizeType(value,
1486 value=GetPolicyValue(
"resource:file");
1487 if (value == (
char *) NULL)
1488 resource_info.file_limit=limit;
1490 resource_info.file_limit=MagickMin(limit,StringToMagickSizeType(value,
1494 case HeightResource:
1496 value=GetPolicyValue(
"resource:height");
1497 if (value == (
char *) NULL)
1498 resource_info.height_limit=limit;
1500 resource_info.height_limit=MagickMin(limit,StringToMagickSizeType(
1502 resource_info.height_limit=MagickMin(resource_info.height_limit,
1503 (MagickSizeType) MAGICK_SSIZE_MAX);
1506 case ListLengthResource:
1508 value=GetPolicyValue(
"resource:list-length");
1509 if (value == (
char *) NULL)
1510 resource_info.list_length_limit=limit;
1512 resource_info.list_length_limit=MagickMin(limit,
1513 StringToMagickSizeType(value,100.0));
1518 value=GetPolicyValue(
"resource:map");
1519 if (value == (
char *) NULL)
1520 resource_info.map_limit=limit;
1522 resource_info.map_limit=MagickMin(limit,StringToMagickSizeType(
1526 case MemoryResource:
1528 value=GetPolicyValue(
"resource:memory");
1529 if (value == (
char *) NULL)
1530 resource_info.memory_limit=limit;
1532 resource_info.memory_limit=MagickMin(limit,StringToMagickSizeType(
1536 case ThreadResource:
1538 value=GetPolicyValue(
"resource:thread");
1539 if (value == (
char *) NULL)
1540 resource_info.thread_limit=limit;
1542 resource_info.thread_limit=MagickMin(limit,StringToMagickSizeType(
1544 if (resource_info.thread_limit > GetOpenMPMaximumThreads())
1545 resource_info.thread_limit=GetOpenMPMaximumThreads();
1547 if (resource_info.thread_limit == 0)
1548 resource_info.thread_limit=1;
1551 case ThrottleResource:
1553 value=GetPolicyValue(
"resource:throttle");
1554 if (value == (
char *) NULL)
1555 resource_info.throttle_limit=limit;
1557 resource_info.throttle_limit=MagickMax(limit,StringToMagickSizeType(
1563 value=GetPolicyValue(
"resource:time");
1564 if (value == (
char *) NULL)
1565 resource_info.time_limit=limit;
1567 resource_info.time_limit=MagickMin(limit,(MagickSizeType)
1568 ParseMagickTimeToLive(value));
1573 value=GetPolicyValue(
"resource:width");
1574 if (value == (
char *) NULL)
1575 resource_info.width_limit=limit;
1577 resource_info.width_limit=MagickMin(limit,StringToMagickSizeType(value,
1579 resource_info.width_limit=MagickMin(resource_info.width_limit,
1580 (MagickSizeType) MAGICK_SSIZE_MAX);
1594 case MemoryResource:
1597 UnlockSemaphoreInfo(resource_semaphore[type]);
1602 if (value != (
char *) NULL)
1603 value=DestroyString(value);