MagickPrivate MagickBooleanType ResourceComponentGenesis(void) { char *limit; MagickSizeType memory; ssize_t files, pages, pagesize; /* Set Magick resource limits. */ AcquireSemaphoreInfo(&resource_semaphore); pagesize=GetMagickPageSize(); pages=(-1); #if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) pages=(ssize_t) sysconf(_SC_PHYS_PAGES); #endif memory=(MagickSizeType) pages*pagesize; if ((pagesize <= 0) || (pages <= 0)) memory=2048UL*1024UL*1024UL; #if defined(PixelCacheThreshold) memory=PixelCacheThreshold; #endif (void) SetMagickResourceLimit(AreaResource,2*memory); (void) SetMagickResourceLimit(MemoryResource,memory); (void) SetMagickResourceLimit(MapResource,2*memory); limit=GetEnvironmentValue("MAGICK_AREA_LIMIT"); if (limit == (char *) NULL) limit=GetPolicyValue("area"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(AreaResource,StringToSizeType(limit,100.0)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_MEMORY_LIMIT"); if (limit == (char *) NULL) limit=GetPolicyValue("memory"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(MemoryResource, StringToSizeType(limit,100.0)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_MAP_LIMIT"); if (limit == (char *) NULL) limit=GetPolicyValue("map"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(MapResource,StringToSizeType(limit,100.0)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_DISK_LIMIT"); if (limit == (char *) NULL) limit=GetPolicyValue("disk"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(DiskResource,StringToSizeType(limit,100.0)); limit=DestroyString(limit); } files=(-1); #if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_OPEN_MAX) files=(ssize_t) sysconf(_SC_OPEN_MAX); #endif #if defined(MAGICKCORE_HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE) if (files < 0) { struct rlimit resources; if (getrlimit(RLIMIT_NOFILE,&resources) != -1) files=(ssize_t) resources.rlim_cur; } #endif #if defined(MAGICKCORE_HAVE_GETDTABLESIZE) && defined(MAGICKCORE_POSIX_SUPPORT) if (files < 0) files=(ssize_t) getdtablesize(); #endif if (files < 0) files=64; (void) SetMagickResourceLimit(FileResource,MagickMax((size_t) (3*files/4),64)); limit=GetEnvironmentValue("MAGICK_FILE_LIMIT"); if (limit == (char *) NULL) limit=GetPolicyValue("file"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(FileResource,StringToSizeType(limit, 100.0)); limit=DestroyString(limit); } (void) SetMagickResourceLimit(ThreadResource,GetOpenMPMaximumThreads()); limit=GetEnvironmentValue("MAGICK_THREAD_LIMIT"); if (limit == (char *) NULL) limit=GetPolicyValue("thread"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(ThreadResource,StringToSizeType(limit, 100.0)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_TIME_LIMIT"); if (limit == (char *) NULL) limit=GetPolicyValue("time"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(TimeResource,StringToSizeType(limit,100.0)); limit=DestroyString(limit); } return(MagickTrue); }
MagickExport MagickBooleanType SetMagickSecurityPolicyValue( const PolicyDomain domain,const char *name,const char *value, ExceptionInfo *exception) { char *current_value; magick_unreferenced(exception); assert(exception != (ExceptionInfo *) NULL); if ((name == (const char *) NULL) || (value == (const char *) NULL)) return(MagickFalse); switch(domain) { case CachePolicyDomain: { if (LocaleCompare(name,"memory-map") == 0) { if (LocaleCompare(value,"anonymous") != 0) return(MagickFalse); ResetCacheAnonymousMemory(); ResetStreamAnonymousMemory(); return(SetPolicyValue(domain,name,value)); } if (LocaleCompare(name,"synchronize") == 0) return(SetPolicyValue(domain,name,value)); break; } case ResourcePolicyDomain: { ssize_t type; if (LocaleCompare(name,"temporary-path") == 0) return(SetPolicyValue(domain,name,value)); type=ParseCommandOption(MagickResourceOptions,MagickFalse,name); if (type >= 0) { MagickSizeType limit; limit=MagickResourceInfinity; if (LocaleCompare("unlimited",value) != 0) limit=StringToMagickSizeType(value,100.0); return(SetMagickResourceLimit((ResourceType) type,limit)); } break; } case SystemPolicyDomain: { if (LocaleCompare(name,"max-memory-request") == 0) { current_value=GetPolicyValue("system:max-memory-request"); if ((current_value == (char *) NULL) || (StringToSizeType(value,100.0) < StringToSizeType(current_value,100.0))) { ResetMaxMemoryRequest(); return(SetPolicyValue(domain,name,value)); } } if (LocaleCompare(name,"memory-map") == 0) { if (LocaleCompare(value,"anonymous") != 0) return(MagickFalse); ResetVirtualAnonymousMemory(); return(SetPolicyValue(domain,name,value)); } if (LocaleCompare(name,"precision") == 0) { ResetMagickPrecision(); return(SetPolicyValue(domain,name,value)); } if (LocaleCompare(name,"shred") == 0) { current_value=GetPolicyValue("system:shred"); if ((current_value == (char *) NULL) || (StringToInteger(value) > StringToInteger(current_value))) return(SetPolicyValue(domain,name,value)); } break; } case CoderPolicyDomain: case DelegatePolicyDomain: case FilterPolicyDomain: case ModulePolicyDomain: case PathPolicyDomain: default: break; } return(MagickFalse); }
MagickExport void InitializeMagickResources(void) { char *limit; long files, pages, pagesize; unsigned long memory; /* Set Magick resource limits. */ pagesize=(-1); #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) pagesize=sysconf(_SC_PAGESIZE); #elif defined(HAVE_GETPAGESIZE) && defined(POSIX) pagesize=getpagesize(); #endif pages=(-1); #if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) pages=sysconf(_SC_PHYS_PAGES); #endif memory=(unsigned long) ((pages+512)/1024)*((pagesize+512)/1024); if ((pagesize <= 0) || (pages <= 0)) memory=2048UL; #if defined(PixelCacheThreshold) memory=PixelCacheThreshold; #endif (void) SetMagickResourceLimit(AreaResource,2*memory); (void) SetMagickResourceLimit(MemoryResource,3*memory/2); (void) SetMagickResourceLimit(MapResource,4*memory); limit=GetEnvironmentValue("MAGICK_AREA_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(AreaResource,(unsigned long) atol(limit)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_MEMORY_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(MemoryResource,(unsigned long) atol(limit)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_MAP_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(MapResource,(unsigned long) atol(limit)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_DISK_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(DiskResource,(unsigned long) atol(limit)); limit=DestroyString(limit); } files=(-1); #if defined(HAVE_SYSCONF) && defined(_SC_OPEN_MAX) files=sysconf(_SC_OPEN_MAX); #elif defined(HAVE_GETDTABLESIZE) && defined(POSIX) files=getdtablesize(); #endif (void) SetMagickResourceLimit(FileResource,(unsigned long) MagickMax(3L*files/4L,64L)); limit=GetEnvironmentValue("MAGICK_FILE_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(FileResource,(unsigned long) atol(limit)); limit=DestroyString(limit); } }
MagickExport void InitializeMagickResources(void) { char *limit; long files, pages, pagesize; MagickSizeType memory; /* Set Magick resource limits. */ pagesize=(-1); #if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_PAGESIZE) pagesize=sysconf(_SC_PAGESIZE); #elif defined(MAGICKCORE_HAVE_GETPAGESIZE) && defined(MAGICKCORE_POSIX_SUPPORT) pagesize=getpagesize(); #endif pages=(-1); #if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) pages=sysconf(_SC_PHYS_PAGES); #endif memory=(MagickSizeType) pages*pagesize; if ((pagesize <= 0) || (pages <= 0)) memory=2048UL*1024UL*1024UL; #if defined(PixelCacheThreshold) memory=PixelCacheThreshold; #endif (void) SetMagickResourceLimit(AreaResource,2UL*memory); (void) SetMagickResourceLimit(MemoryResource,3UL*memory/2UL); (void) SetMagickResourceLimit(MapResource,4UL*memory); limit=GetEnvironmentValue("MAGICK_AREA_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(AreaResource,(MagickSizeType) StringToDouble(limit,100.0)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_MEMORY_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(MemoryResource,(MagickSizeType) StringToDouble(limit,100.0)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_MAP_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(MapResource,(MagickSizeType) StringToDouble(limit,100.0)); limit=DestroyString(limit); } limit=GetEnvironmentValue("MAGICK_DISK_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(DiskResource,(MagickSizeType) StringToDouble(limit,100.0)); limit=DestroyString(limit); } files=(-1); #if defined(MAGICKCORE_HAVE_SYSCONF) && defined(_SC_OPEN_MAX) files=sysconf(_SC_OPEN_MAX); #elif defined(MAGICKCORE_HAVE_GETDTABLESIZE) && defined(MAGICKCORE_POSIX_SUPPORT) files=getdtablesize(); #endif (void) SetMagickResourceLimit(FileResource,MagickMax(3UL*files/4UL,64UL)); limit=GetEnvironmentValue("MAGICK_FILE_LIMIT"); if (limit != (char *) NULL) { (void) SetMagickResourceLimit(FileResource,(MagickSizeType) StringToDouble(limit,100.0)); limit=DestroyString(limit); } }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % + I n i t i a l i z e M a g i c k R e s o u r c e s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % InitializeMagickResources() initializes the resource environment. % % The format of the InitializeMagickResources() method is: % % InitializeMagickResources(void) % % */ MagickExport void InitializeMagickResources(void) { const char *p; long files, pages, pagesize; unsigned long memory; /* Set Magick resource limits. */ pagesize=(-1); #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) pagesize=sysconf(_SC_PAGESIZE); #elif defined(HAVE_GETPAGESIZE) && defined(POSIX) pagesize=getpagesize(); #endif if (pagesize <= 0) pagesize=4096; pages=(-1); #if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) pages=sysconf(_SC_PHYS_PAGES); #endif if (pages <= 0) pages=62500; memory=(unsigned long) ((pages+512)/1024)*((pagesize+512)/1024); #if defined(PixelCacheThreshold) memory=PixelCacheThreshold; #endif (void) SetMagickResourceLimit(AreaResource,memory/2); (void) SetMagickResourceLimit(MemoryResource,memory); (void) SetMagickResourceLimit(MapResource,2*memory); p=getenv("MAGICK_AREA_LIMIT"); if (p != (const char *) NULL) (void) SetMagickResourceLimit(AreaResource,(unsigned long) atol(p)); p=getenv("MAGICK_MEMORY_LIMIT"); if (p != (const char *) NULL) (void) SetMagickResourceLimit(MemoryResource,(unsigned long) atol(p)); p=getenv("MAGICK_MAP_LIMIT"); if (p != (const char *) NULL) (void) SetMagickResourceLimit(MapResource,(unsigned long) atol(p)); p=getenv("MAGICK_DISK_LIMIT"); if (p != (const char *) NULL) (void) SetMagickResourceLimit(DiskResource,(unsigned long) atol(p)); files=(-1); #if defined(HAVE_SYSCONF) && defined(_SC_OPEN_MAX) files=sysconf(_SC_OPEN_MAX); #elif defined(HAVE_GETDTABLESIZE) && defined(POSIX) files=getdtablesize(); #endif if (files <= 0) files=64; (void) SetMagickResourceLimit(FileResource,(unsigned long) Max(3*files/4,8)); p=getenv("MAGICK_FILES_LIMIT"); if (p != (const char *) NULL) (void) SetMagickResourceLimit(FileResource,(unsigned long) atol(p)); }