Lines Matching +full:1 +full:e
34 # define USE_DEBUG 1
40 VERBOSE_STATUS = 1 /* make it zero to save 400 bytes kernel memory */
44 #define MISC_FMT_PRESERVE_ARGV0 (1UL << 31)
45 #define MISC_FMT_OPEN_BINARY (1UL << 30)
46 #define MISC_FMT_CREDENTIALS (1UL << 29)
47 #define MISC_FMT_OPEN_FILE (1UL << 28)
69 * - type: 1 byte
94 Node *e;
97 list_for_each_entry(e, &misc->entries, list) {
102 if (!test_bit(Enabled, &e->flags))
106 if (!test_bit(Magic, &e->flags)) {
107 if (p && !strcmp(e->magic, p + 1))
108 return e;
113 s = bprm->buf + e->offset;
114 if (e->mask) {
115 for (j = 0; j < e->size; j++)
116 if ((*s++ ^ e->magic[j]) & e->mask[j])
119 for (j = 0; j < e->size; j++)
120 if ((*s++ ^ e->magic[j]))
123 if (j == e->size)
124 return e;
143 Node *e;
146 e = search_binfmt_handler(misc, bprm);
147 if (e)
148 refcount_inc(&e->users);
150 return e;
155 * @e: node to put
161 static void put_binfmt_handler(Node *e)
163 if (refcount_dec_and_test(&e->users)) {
164 if (e->flags & MISC_FMT_OPEN_FILE)
165 filp_close(e->interp_file, NULL);
166 kfree(e);
231 bprm->have_execfd = 1;
233 /* make argv[1] be the path to the binary */
263 bprm->execfd_creds = 1;
301 s[-1] ='\0';
305 static char *check_special_flags(char *sfs, Node *e)
308 int cont = 1;
316 e->flags |= MISC_FMT_PRESERVE_ARGV0;
321 e->flags |= MISC_FMT_OPEN_BINARY;
328 e->flags |= (MISC_FMT_CREDENTIALS |
334 e->flags |= MISC_FMT_OPEN_FILE;
351 Node *e;
365 e = kmalloc(memsize, GFP_KERNEL_ACCOUNT);
366 if (!e)
369 p = buf = (char *)e + sizeof(Node);
371 memset(e, 0, sizeof(Node));
383 e->name = p;
388 if (!e->name[0] ||
389 !strcmp(e->name, ".") ||
390 !strcmp(e->name, "..") ||
391 strchr(e->name, '/'))
394 pr_debug("register: name: {%s}\n", e->name);
398 case 'E':
399 pr_debug("register: type: E (extension)\n");
400 e->flags = 1 << Enabled;
404 e->flags = (1 << Enabled) | (1 << Magic);
412 if (test_bit(Magic, &e->flags)) {
422 int r = kstrtoint(p, 10, &e->offset);
423 if (r != 0 || e->offset < 0)
429 pr_debug("register: offset: %#x\n", e->offset);
432 e->magic = p;
436 if (!e->magic[0])
441 DUMP_PREFIX_NONE, e->magic, p - e->magic);
444 e->mask = p;
448 if (!e->mask[0]) {
449 e->mask = NULL;
454 DUMP_PREFIX_NONE, e->mask, p - e->mask);
462 e->size = string_unescape_inplace(e->magic, UNESCAPE_HEX);
463 if (e->mask &&
464 string_unescape_inplace(e->mask, UNESCAPE_HEX) != e->size)
466 if (e->size > BINPRM_BUF_SIZE ||
467 BINPRM_BUF_SIZE - e->size < e->offset)
469 pr_debug("register: magic/mask length: %i\n", e->size);
473 DUMP_PREFIX_NONE, e->magic, e->size);
475 if (e->mask) {
477 char *masked = kmalloc(e->size, GFP_KERNEL_ACCOUNT);
481 DUMP_PREFIX_NONE, e->mask, e->size);
484 for (i = 0; i < e->size; ++i)
485 masked[i] = e->magic[i] & e->mask[i];
488 DUMP_PREFIX_NONE, masked, e->size);
495 /* Handle the 'E' (extension) format. */
504 e->magic = p;
509 if (!e->magic[0] || strchr(e->magic, '/'))
511 pr_debug("register: extension: {%s}\n", e->magic);
521 e->interpreter = p;
526 if (!e->interpreter[0])
528 pr_debug("register: interpreter: {%s}\n", e->interpreter);
531 p = check_special_flags(p, e);
537 return e;
543 kfree(e);
546 kfree(e);
552 * '1' enables, '0' disables and '-1' clears entry/binfmt_misc
564 if (s[count - 1] == '\n')
566 if (count == 1 && s[0] == '0')
567 return 1;
568 if (count == 1 && s[0] == '1')
570 if (count == 2 && s[0] == '-' && s[1] == '1')
577 static void entry_status(Node *e, char *page)
582 if (test_bit(Enabled, &e->flags))
590 dp += sprintf(dp, "%s\ninterpreter %s\n", status, e->interpreter);
594 if (e->flags & MISC_FMT_PRESERVE_ARGV0)
596 if (e->flags & MISC_FMT_OPEN_BINARY)
598 if (e->flags & MISC_FMT_CREDENTIALS)
600 if (e->flags & MISC_FMT_OPEN_FILE)
604 if (!test_bit(Magic, &e->flags)) {
605 sprintf(dp, "extension .%s\n", e->magic);
607 dp += sprintf(dp, "offset %i\nmagic ", e->offset);
608 dp = bin2hex(dp, e->magic, e->size);
609 if (e->mask) {
611 dp = bin2hex(dp, e->mask, e->size);
661 Node *e = inode->i_private;
665 if (e) {
670 if (!list_empty(&e->list))
671 list_del_init(&e->list);
673 put_binfmt_handler(e);
718 * @e: binary type handler to remove
727 static void remove_binfmt_handler(struct binfmt_misc *misc, Node *e)
730 list_del_init(&e->list);
732 unlink_binfmt_dentry(e->dentry);
740 Node *e = file_inode(file)->i_private;
748 entry_status(e, page);
760 Node *e = inode->i_private;
764 case 1:
766 clear_bit(Enabled, &e->flags);
770 set_bit(Enabled, &e->flags);
786 if (!list_empty(&e->list))
787 remove_binfmt_handler(i_binfmt_misc(inode), e);
809 Node *e;
817 e = create_entry(buffer, count);
819 if (IS_ERR(e))
820 return PTR_ERR(e);
822 if (e->flags & MISC_FMT_OPEN_FILE) {
833 f = open_exec(e->interpreter);
837 e->interpreter);
838 kfree(e);
841 e->interp_file = f;
845 dentry = lookup_noperm(&QSTR(e->name), root);
860 refcount_set(&e->users, 1);
861 e->dentry = dget(dentry);
862 inode->i_private = e;
868 list_add(&e->list, &misc->entries);
880 kfree(e);
909 Node *e, *next;
914 case 1:
936 list_for_each_entry_safe(e, next, &misc->entries, list)
937 remove_binfmt_handler(misc, e);
985 * Lazily allocate a new binfmt_misc instance for this namespace, i.e.