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); }
static MagickBooleanType GetPathTemplate(char *path) { char *directory; ExceptionInfo *exception; MagickBooleanType status; register char *p; struct stat attributes; (void) CopyMagickString(path,"magick-XXXXXXXX",MaxTextExtent); exception=AcquireExceptionInfo(); directory=(char *) GetImageRegistry(StringRegistryType,"temporary-path", exception); exception=DestroyExceptionInfo(exception); if (directory == (char *) NULL) directory=GetEnvironmentValue("MAGICK_TEMPORARY_PATH"); if (directory == (char *) NULL) directory=GetEnvironmentValue("MAGICK_TMPDIR"); if (directory == (char *) NULL) directory=GetPolicyValue("temporary-path"); if (directory == (char *) NULL) directory=GetEnvironmentValue("TMPDIR"); #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__) if (directory == (char *) NULL) directory=GetEnvironmentValue("TMP"); if (directory == (char *) NULL) directory=GetEnvironmentValue("TEMP"); #endif #if defined(__VMS) if (directory == (char *) NULL) directory=GetEnvironmentValue("MTMPDIR"); #endif #if defined(P_tmpdir) if (directory == (char *) NULL) directory=ConstantString(P_tmpdir); #endif if (directory == (char *) NULL) return(MagickTrue); if (strlen(directory) > (MaxTextExtent-15)) { directory=DestroyString(directory); return(MagickTrue); } status=GetPathAttributes(directory,&attributes); if ((status == MagickFalse) || !S_ISDIR(attributes.st_mode)) { directory=DestroyString(directory); return(MagickTrue); } if (directory[strlen(directory)-1] == *DirectorySeparator) (void) FormatLocaleString(path,MaxTextExtent,"%smagick-XXXXXXXX",directory); else (void) FormatLocaleString(path,MaxTextExtent,"%s%smagick-XXXXXXXX", directory,DirectorySeparator); directory=DestroyString(directory); if (*DirectorySeparator != '/') for (p=path; *p != '\0'; p++) if (*p == *DirectorySeparator) *p='/'; return(MagickTrue); }
MagickExport MagickBooleanType GetPathTemplate(char *path) { char *directory, *value; ExceptionInfo *exception; MagickBooleanType status; struct stat attributes; (void) FormatLocaleString(path,MagickPathExtent,"magick-%.20gXXXXXXXXXXXX", (double) getpid()); exception=AcquireExceptionInfo(); directory=(char *) GetImageRegistry(StringRegistryType,"temporary-path", exception); exception=DestroyExceptionInfo(exception); if (directory == (char *) NULL) directory=GetEnvironmentValue("MAGICK_TEMPORARY_PATH"); if (directory == (char *) NULL) directory=GetEnvironmentValue("MAGICK_TMPDIR"); if (directory == (char *) NULL) directory=GetEnvironmentValue("TMPDIR"); #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__) || defined(__CYGWIN__) if (directory == (char *) NULL) directory=GetEnvironmentValue("TMP"); if (directory == (char *) NULL) directory=GetEnvironmentValue("TEMP"); #endif #if defined(__VMS) if (directory == (char *) NULL) directory=GetEnvironmentValue("MTMPDIR"); #endif #if defined(P_tmpdir) if (directory == (char *) NULL) directory=ConstantString(P_tmpdir); #endif if (directory == (char *) NULL) return(MagickTrue); value=GetPolicyValue("temporary-path"); if (value != (char *) NULL) (void) CloneString(&directory,value); if (strlen(directory) > (MagickPathExtent-25)) { directory=DestroyString(directory); return(MagickFalse); } status=GetPathAttributes(directory,&attributes); if ((status == MagickFalse) || !S_ISDIR(attributes.st_mode)) { directory=DestroyString(directory); return(MagickFalse); } if (directory[strlen(directory)-1] == *DirectorySeparator) (void) FormatLocaleString(path,MagickPathExtent, "%smagick-%.20gXXXXXXXXXXXX",directory,(double) getpid()); else (void) FormatLocaleString(path,MagickPathExtent, "%s%smagick-%.20gXXXXXXXXXXXX",directory,DirectorySeparator,(double) getpid()); directory=DestroyString(directory); #if defined(MAGICKCORE_WINDOWS_SUPPORT) { register char *p; /* Ghostscript does not like backslashes so we need to replace them. The forward slash also works under Windows. */ for (p=(path[1] == *DirectorySeparator ? path+2 : path); *p != '\0'; p++) if (*p == *DirectorySeparator) *p='/'; } #endif return(MagickTrue); }
MagickExport MagickBooleanType SetMagickResourceLimit(const ResourceType type, const MagickSizeType limit) { char *value; if (resource_semaphore == (SemaphoreInfo *) NULL) AcquireSemaphoreInfo(&resource_semaphore); LockSemaphoreInfo(resource_semaphore); value=(char *) NULL; switch (type) { case AreaResource: { resource_info.area_limit=limit; value=GetPolicyValue("area"); if (value != (char *) NULL) resource_info.area_limit=MagickMin(limit,StringToSizeType(value,100.0)); break; } case MemoryResource: { resource_info.memory_limit=limit; value=GetPolicyValue("memory"); if (value != (char *) NULL) resource_info.memory_limit=MagickMin(limit,StringToSizeType(value, 100.0)); break; } case MapResource: { resource_info.map_limit=limit; value=GetPolicyValue("map"); if (value != (char *) NULL) resource_info.map_limit=MagickMin(limit,StringToSizeType(value,100.0)); break; } case DiskResource: { resource_info.disk_limit=limit; value=GetPolicyValue("disk"); if (value != (char *) NULL) resource_info.disk_limit=MagickMin(limit,StringToSizeType(value,100.0)); break; } case FileResource: { resource_info.file_limit=limit; value=GetPolicyValue("file"); if (value != (char *) NULL) resource_info.file_limit=MagickMin(limit,StringToSizeType(value,100.0)); break; } case ThreadResource: { resource_info.thread_limit=limit; value=GetPolicyValue("thread"); if (value != (char *) NULL) resource_info.thread_limit=MagickMin(limit,StringToSizeType(value, 100.0)); if (resource_info.thread_limit > GetOpenMPMaximumThreads()) resource_info.thread_limit=GetOpenMPMaximumThreads(); break; } case TimeResource: { resource_info.time_limit=limit; value=GetPolicyValue("time"); if (value != (char *) NULL) resource_info.time_limit=MagickMin(limit,StringToSizeType(value,100.0)); break; } default: break; } if (value != (char *) NULL) value=DestroyString(value); UnlockSemaphoreInfo(resource_semaphore); 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); }