2012-03-12 11 views
6

मैंने देखा है कि यह कई बार कहा गया है कि लुआ स्क्रिप्ट के मेमोरी उपयोग को सीमित करने का कोई तरीका नहीं है, जिसमें लूआ स्क्रिप्ट्स को फ़ंक्शंस और टेबल बनाने से रोकने के लिए हुप्स के माध्यम से कूदना शामिल है। लेकिन यह देखते हुए कि lua_newstate आपको एक कस्टम आवंटक पास करने की अनुमति देता है, क्या कोई स्मृति स्मृति खपत को सीमित करने के लिए इसका उपयोग नहीं कर सकता? सबसे बुरी स्थिति में, कोई क्षेत्र-आधारित आवंटक का उपयोग कर सकता है और विखंडन द्वारा उपयोग की जा सकने वाली स्मृति की मात्रा पर भी एक कठोर सीमा डाल सकता है।लुआ लिपि के स्मृति उपयोग को सीमित करना?

क्या मुझे यहां कुछ याद आ रही है?

+1

"मैंने इसे कई बार देखा है" दो शब्द: उद्धरण की आवश्यकता है। –

+0

सैंडबॉक्स पर लूआ विकी पेज संभावित मेमोरी के रूप में स्मृति का उपयोग करने का उल्लेख करता है लेकिन इसे सीमित करने के तरीकों का उल्लेख नहीं करता है: http://lua-users.org/wiki/SandBoxes। मुझे लगता है कि मैंने इस पृष्ठ को गलत तरीके से पढ़ा था जहां यह "लुआ" के बारे में बात नहीं कर रहा था: http://www.sk89q.com/2010/03/sandboxed-lua-via-php/ –

+1

"वे हमेशा कोशिश कर रहे हैं कार्यों या तालिकाओं के निर्माण को रोकें। " ऐसा इसलिए है क्योंकि वे नहीं चाहते हैं कि वे टेबल और फ़ंक्शंस बनाएं। वे वैश्विक दायरे को संरक्षित करना चाहते हैं। स्मृति का उपयोग करने से रोकने से यह एक अलग कार्य है। –

उत्तर

9
static void *l_alloc_restricted (void *ud, void *ptr, size_t osize, size_t nsize) 
{ 
    const int MAX_SIZE = 1024; /* set limit here */ 
    int *used = (int *)ud; 

    if(ptr == NULL) { 
    /* 
     * <http://www.lua.org/manual/5.2/manual.html#lua_Alloc>: 
     * When ptr is NULL, osize encodes the kind of object that Lua is 
     * allocating. 
     * 
     * Since we don’t care about that, just mark it as 0. 
     */ 
    osize = 0; 
    } 

    if (nsize == 0) 
    { 
    free(ptr); 
    *used -= osize; /* substract old size from used memory */ 
    return NULL; 
    } 
    else 
    { 
    if (*used + (nsize - osize) > MAX_SIZE) /* too much memory in use */ 
     return NULL; 
    ptr = realloc(ptr, nsize); 
    if (ptr) /* reallocation successful? */ 
     *used += (nsize - osize); 
    return ptr; 
    } 
} 

लुआ अपने संभाजक का उपयोग करने के लिए, आप उपयोग कर सकते

int *ud = malloc(sizeof(int)); *ud = 0; 
lua_State *L = lua_State *lua_newstate (l_alloc_restricted, ud); 

नोट: मैं स्रोत का परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए।

+0

धन्यवाद, हालांकि मैं किस बारे में सोच रहा था, यही कारण है कि मैंने कभी भी इस तकनीक का उपयोग नहीं किया है; वे हमेशा कार्यों या तालिकाओं के निर्माण को रोकने की कोशिश कर रहे हैं। –

+0

अब मैंने फिर से देखा है, ऐसा लगता है कि कारण यह है कि लोग लुआ के भीतर से सैंडबॉक्स कोड का प्रयास कर रहे हैं। –

+1

मुझे लगता है कि आप वास्तव में malloc –

संबंधित मुद्दे