diff options
author | Akira TAGOH <akira@tagoh.org> | 2006-08-02 18:23:41 +0000 |
---|---|---|
committer | Akira TAGOH <akira@tagoh.org> | 2006-08-02 18:23:41 +0000 |
commit | d84324923d1c58509040ac05a638f6a1071976d7 (patch) | |
tree | fd44867140daef4c5c0f57113c3d09573fe57f23 | |
parent | f72c5c98ee62462f425cadc47c40c354c45b65b8 (diff) |
2006-08-03 Akira TAGOH <at@gclab.org>
* hieroglyph/operator.c (_hg_operator_op_exec): check executeonly flag.
(_hg_operator_op_executeonly): implemented.
(_hg_operator_op_noaccess): use hg_object_inaccessible.
* hieroglyph/vm.c (hg_vm_main): set the same flags from string to file.
* hieroglyph/hgmem.h (hg_object_inexecutable): renamed from
hg_object_unexecutable.
(hg_object_executeonly): new macro.
(hg_object_is_executeonly): new macro.
(hg_object_inaccessible): new macro.
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | hieroglyph/hgmem.h | 5 | ||||
-rw-r--r-- | hieroglyph/hgtypes.h | 1 | ||||
-rw-r--r-- | hieroglyph/operator.c | 42 | ||||
-rw-r--r-- | hieroglyph/scanner.c | 2 | ||||
-rw-r--r-- | hieroglyph/version.h.in | 2 | ||||
-rw-r--r-- | hieroglyph/vm.c | 2 |
7 files changed, 58 insertions, 10 deletions
@@ -1,3 +1,17 @@ +2006-08-03 Akira TAGOH <at@gclab.org> + + * hieroglyph/operator.c (_hg_operator_op_exec): check executeonly flag. + (_hg_operator_op_executeonly): implemented. + (_hg_operator_op_noaccess): use hg_object_inaccessible. + + * hieroglyph/vm.c (hg_vm_main): set the same flags from string to file. + + * hieroglyph/hgmem.h (hg_object_inexecutable): renamed from + hg_object_unexecutable. + (hg_object_executeonly): new macro. + (hg_object_is_executeonly): new macro. + (hg_object_inaccessible): new macro. + 2006-08-02 Akira TAGOH <at@gclab.org> * plugins/debug/Makefile.am (LIBS): removed the unnecessary dependency. diff --git a/hieroglyph/hgmem.h b/hieroglyph/hgmem.h index 10f74dd..6c6206b 100644 --- a/hieroglyph/hgmem.h +++ b/hieroglyph/hgmem.h @@ -183,8 +183,11 @@ void hg_mem_pool_use_garbage_collection(HgMemPool *pool, #define hg_object_is_writable(obj) hg_object_is_state(obj, HG_ST_WRITABLE) #define hg_object_unwritable(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~HG_ST_WRITABLE) #define hg_object_executable(obj) hg_object_add_state(obj, HG_ST_EXECUTABLE) -#define hg_object_unexecutable(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~HG_ST_EXECUTABLE) +#define hg_object_inexecutable(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~HG_ST_EXECUTABLE) #define hg_object_is_executable(obj) hg_object_is_state(obj, HG_ST_EXECUTABLE) +#define hg_object_executeonly(obj) hg_object_set_state(obj, (hg_object_get_state(obj) & ~(HG_ST_READABLE | HG_ST_WRITABLE)) | HG_ST_EXECUTEONLY) +#define hg_object_is_executeonly(obj) hg_object_is_state(obj, HG_ST_EXECUTEONLY) +#define hg_object_inaccessible(obj) hg_object_set_state(obj, hg_object_get_state(obj) & ~(HG_ST_READABLE | HG_ST_WRITABLE | HG_ST_EXECUTABLE | HG_ST_EXECUTEONLY)) guint hg_object_get_state (HgObject *object); void hg_object_set_state (HgObject *object, diff --git a/hieroglyph/hgtypes.h b/hieroglyph/hgtypes.h index 4d47df7..7f9a1c3 100644 --- a/hieroglyph/hgtypes.h +++ b/hieroglyph/hgtypes.h @@ -118,6 +118,7 @@ typedef enum { HG_ST_READABLE = 1 << 0, HG_ST_WRITABLE = 1 << 1, HG_ST_EXECUTABLE = 1 << 2, + HG_ST_EXECUTEONLY = 1 << 3, HG_ST_RESERVED1 = 1 << 16, /* reserved for object-specific data */ HG_ST_RESERVED2 = 1 << 17, /* reserved for object-specific data */ HG_ST_RESERVED3 = 1 << 18, /* reserved for object-specific data */ diff --git a/hieroglyph/operator.c b/hieroglyph/operator.c index 8fb284f..341e26e 100644 --- a/hieroglyph/operator.c +++ b/hieroglyph/operator.c @@ -2163,7 +2163,7 @@ G_STMT_START break; } node = hg_stack_index(ostack, 0); - hg_object_unexecutable((HgObject *)node); + hg_object_inexecutable((HgObject *)node); retval = TRUE; break; } @@ -2738,7 +2738,8 @@ G_STMT_START } node = hg_stack_index(ostack, 0); if (hg_object_is_executable((HgObject *)node)) { - if (!hg_object_is_readable((HgObject *)node)) { + if (!hg_object_is_executeonly((HgObject *)node) && + !hg_object_is_readable((HgObject *)node)) { _hg_operator_set_error(vm, op, VM_e_invalidaccess); break; } @@ -2819,7 +2820,36 @@ G_STMT_START } G_STMT_END; DEFUNC_OP_END -DEFUNC_UNIMPLEMENTED_OP (executeonly); +DEFUNC_OP (executeonly) +G_STMT_START +{ + HgStack *ostack = hg_vm_get_ostack(vm); + guint depth = hg_stack_depth(ostack); + HgValueNode *node; + + while (1) { + if (depth < 1) { + _hg_operator_set_error(vm, op, VM_e_stackunderflow); + break; + } + node = hg_stack_index(ostack, 0); + if (!HG_IS_VALUE_ARRAY (node) && + !HG_IS_VALUE_FILE (node) && + !HG_IS_VALUE_STRING (node)) { + _hg_operator_set_error(vm, op, VM_e_typecheck); + break; + } + if (!hg_object_is_executeonly((HgObject *)node) && + !hg_object_is_readable((HgObject *)node)) { + _hg_operator_set_error(vm, op, VM_e_invalidaccess); + break; + } + hg_object_executeonly((HgObject *)node); + retval = TRUE; + break; + } +} G_STMT_END; +DEFUNC_OP_END DEFUNC_OP (exit) G_STMT_START @@ -4508,11 +4538,9 @@ G_STMT_START _hg_operator_set_error(vm, op, VM_e_invalidaccess); break; } - hg_object_set_state((HgObject *)dict, - hg_object_get_state((HgObject *)dict) & ~(HG_ST_READABLE | HG_ST_WRITABLE)); + hg_object_inaccessible((HgObject *)dict); } - hg_object_set_state((HgObject *)node, - hg_object_get_state((HgObject *)node) & ~(HG_ST_READABLE | HG_ST_WRITABLE)); + hg_object_inaccessible((HgObject *)node); retval = TRUE; break; } diff --git a/hieroglyph/scanner.c b/hieroglyph/scanner.c index 3ebc5ac..fbdffdd 100644 --- a/hieroglyph/scanner.c +++ b/hieroglyph/scanner.c @@ -546,7 +546,7 @@ _hg_scanner_get_object(HgVM *vm, switch (token_type) { case HG_SCAN_TOKEN_LITERAL: retval = hg_vm_get_name_node(vm, hg_string_get_string(string)); - hg_object_unexecutable((HgObject *)retval); + hg_object_inexecutable((HgObject *)retval); hg_mem_free(string); break; case HG_SCAN_TOKEN_EVAL_NAME: diff --git a/hieroglyph/version.h.in b/hieroglyph/version.h.in index b853125..34e766e 100644 --- a/hieroglyph/version.h.in +++ b/hieroglyph/version.h.in @@ -29,7 +29,7 @@ G_BEGIN_DECLS #define HIEROGLYPH_VERSION "@VERSION@" -#define HIEROGLYPH_UUID "a6eaa222-c395-4009-a7fa-4c99f03e1dba" +#define HIEROGLYPH_UUID "315eae6c-15f0-4048-a505-02636f2124cd" const char *__hg_rcsid G_GNUC_UNUSED = "$Rev$"; diff --git a/hieroglyph/vm.c b/hieroglyph/vm.c index 55cac54..39b7d33 100644 --- a/hieroglyph/vm.c +++ b/hieroglyph/vm.c @@ -1159,6 +1159,7 @@ hg_vm_main(HgVM *vm) case HG_TYPE_VALUE_STRING: if (hg_object_is_executable((HgObject *)node)) { HgString *hs = HG_VALUE_GET_STRING (node); + guint state = hg_object_get_state((HgObject *)node); file = hg_file_object_new(hg_vm_get_current_pool(vm), HG_FILE_TYPE_BUFFER, @@ -1168,6 +1169,7 @@ hg_vm_main(HgVM *vm) hg_string_maxlength(hs)); hg_stack_pop(vm->estack); HG_VALUE_MAKE_FILE (node, file); + hg_object_set_state((HgObject *)node, state); retval = hg_stack_push(vm->estack, node); } else { g_warning("[BUG] %s: an object (node type %d) which isn't actually executable, was pushed into the estack.", |