binfmt_misc: add comments & debug logs
[firefly-linux-kernel-4.4.55.git] / fs / binfmt_misc.c
1 /*
2  *  binfmt_misc.c
3  *
4  *  Copyright (C) 1997 Richard Günther
5  *
6  *  binfmt_misc detects binaries via a magic or filename extension and invokes
7  *  a specified wrapper. This should obsolete binfmt_java, binfmt_em86 and
8  *  binfmt_mz.
9  *
10  *  1997-04-25 first version
11  *  [...]
12  *  1997-05-19 cleanup
13  *  1997-06-26 hpa: pass the real filename rather than argv[0]
14  *  1997-06-30 minor cleanup
15  *  1997-08-09 removed extension stripping, locking cleanup
16  *  2001-02-28 AV: rewritten into something that resembles C. Original didn't.
17  */
18
19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20
21 #include <linux/module.h>
22 #include <linux/init.h>
23 #include <linux/sched.h>
24 #include <linux/magic.h>
25 #include <linux/binfmts.h>
26 #include <linux/slab.h>
27 #include <linux/ctype.h>
28 #include <linux/string_helpers.h>
29 #include <linux/file.h>
30 #include <linux/pagemap.h>
31 #include <linux/namei.h>
32 #include <linux/mount.h>
33 #include <linux/syscalls.h>
34 #include <linux/fs.h>
35 #include <linux/uaccess.h>
36
37 #ifdef DEBUG
38 # define USE_DEBUG 1
39 #else
40 # define USE_DEBUG 0
41 #endif
42
43 enum {
44         VERBOSE_STATUS = 1 /* make it zero to save 400 bytes kernel memory */
45 };
46
47 static LIST_HEAD(entries);
48 static int enabled = 1;
49
50 enum {Enabled, Magic};
51 #define MISC_FMT_PRESERVE_ARGV0 (1<<31)
52 #define MISC_FMT_OPEN_BINARY (1<<30)
53 #define MISC_FMT_CREDENTIALS (1<<29)
54
55 typedef struct {
56         struct list_head list;
57         unsigned long flags;            /* type, status, etc. */
58         int offset;                     /* offset of magic */
59         int size;                       /* size of magic/mask */
60         char *magic;                    /* magic or filename extension */
61         char *mask;                     /* mask, NULL for exact match */
62         char *interpreter;              /* filename of interpreter */
63         char *name;
64         struct dentry *dentry;
65 } Node;
66
67 static DEFINE_RWLOCK(entries_lock);
68 static struct file_system_type bm_fs_type;
69 static struct vfsmount *bm_mnt;
70 static int entry_count;
71
72 /*
73  * Max length of the register string.  Determined by:
74  *  - 7 delimiters
75  *  - name:   ~50 bytes
76  *  - type:   1 byte
77  *  - offset: 3 bytes (has to be smaller than BINPRM_BUF_SIZE)
78  *  - magic:  128 bytes (512 in escaped form)
79  *  - mask:   128 bytes (512 in escaped form)
80  *  - interp: ~50 bytes
81  *  - flags:  5 bytes
82  * Round that up a bit, and then back off to hold the internal data
83  * (like struct Node).
84  */
85 #define MAX_REGISTER_LENGTH 1920
86
87 /*
88  * Check if we support the binfmt
89  * if we do, return the node, else NULL
90  * locking is done in load_misc_binary
91  */
92 static Node *check_file(struct linux_binprm *bprm)
93 {
94         char *p = strrchr(bprm->interp, '.');
95         struct list_head *l;
96
97         /* Walk all the registered handlers. */
98         list_for_each(l, &entries) {
99                 Node *e = list_entry(l, Node, list);
100                 char *s;
101                 int j;
102
103                 /* Make sure this one is currently enabled. */
104                 if (!test_bit(Enabled, &e->flags))
105                         continue;
106
107                 /* Do matching based on extension if applicable. */
108                 if (!test_bit(Magic, &e->flags)) {
109                         if (p && !strcmp(e->magic, p + 1))
110                                 return e;
111                         continue;
112                 }
113
114                 /* Do matching based on magic & mask. */
115                 s = bprm->buf + e->offset;
116                 if (e->mask) {
117                         for (j = 0; j < e->size; j++)
118                                 if ((*s++ ^ e->magic[j]) & e->mask[j])
119                                         break;
120                 } else {
121                         for (j = 0; j < e->size; j++)
122                                 if ((*s++ ^ e->magic[j]))
123                                         break;
124                 }
125                 if (j == e->size)
126                         return e;
127         }
128         return NULL;
129 }
130
131 /*
132  * the loader itself
133  */
134 static int load_misc_binary(struct linux_binprm *bprm)
135 {
136         Node *fmt;
137         struct file * interp_file = NULL;
138         char iname[BINPRM_BUF_SIZE];
139         const char *iname_addr = iname;
140         int retval;
141         int fd_binary = -1;
142
143         retval = -ENOEXEC;
144         if (!enabled)
145                 goto _ret;
146
147         /* to keep locking time low, we copy the interpreter string */
148         read_lock(&entries_lock);
149         fmt = check_file(bprm);
150         if (fmt)
151                 strlcpy(iname, fmt->interpreter, BINPRM_BUF_SIZE);
152         read_unlock(&entries_lock);
153         if (!fmt)
154                 goto _ret;
155
156         if (!(fmt->flags & MISC_FMT_PRESERVE_ARGV0)) {
157                 retval = remove_arg_zero(bprm);
158                 if (retval)
159                         goto _ret;
160         }
161
162         if (fmt->flags & MISC_FMT_OPEN_BINARY) {
163
164                 /* if the binary should be opened on behalf of the
165                  * interpreter than keep it open and assign descriptor
166                  * to it */
167                 fd_binary = get_unused_fd_flags(0);
168                 if (fd_binary < 0) {
169                         retval = fd_binary;
170                         goto _ret;
171                 }
172                 fd_install(fd_binary, bprm->file);
173
174                 /* if the binary is not readable than enforce mm->dumpable=0
175                    regardless of the interpreter's permissions */
176                 would_dump(bprm, bprm->file);
177
178                 allow_write_access(bprm->file);
179                 bprm->file = NULL;
180
181                 /* mark the bprm that fd should be passed to interp */
182                 bprm->interp_flags |= BINPRM_FLAGS_EXECFD;
183                 bprm->interp_data = fd_binary;
184
185         } else {
186                 allow_write_access(bprm->file);
187                 fput(bprm->file);
188                 bprm->file = NULL;
189         }
190         /* make argv[1] be the path to the binary */
191         retval = copy_strings_kernel (1, &bprm->interp, bprm);
192         if (retval < 0)
193                 goto _error;
194         bprm->argc++;
195
196         /* add the interp as argv[0] */
197         retval = copy_strings_kernel (1, &iname_addr, bprm);
198         if (retval < 0)
199                 goto _error;
200         bprm->argc ++;
201
202         /* Update interp in case binfmt_script needs it. */
203         retval = bprm_change_interp(iname, bprm);
204         if (retval < 0)
205                 goto _error;
206
207         interp_file = open_exec (iname);
208         retval = PTR_ERR (interp_file);
209         if (IS_ERR (interp_file))
210                 goto _error;
211
212         bprm->file = interp_file;
213         if (fmt->flags & MISC_FMT_CREDENTIALS) {
214                 /*
215                  * No need to call prepare_binprm(), it's already been
216                  * done.  bprm->buf is stale, update from interp_file.
217                  */
218                 memset(bprm->buf, 0, BINPRM_BUF_SIZE);
219                 retval = kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE);
220         } else
221                 retval = prepare_binprm (bprm);
222
223         if (retval < 0)
224                 goto _error;
225
226         retval = search_binary_handler(bprm);
227         if (retval < 0)
228                 goto _error;
229
230 _ret:
231         return retval;
232 _error:
233         if (fd_binary > 0)
234                 sys_close(fd_binary);
235         bprm->interp_flags = 0;
236         bprm->interp_data = 0;
237         goto _ret;
238 }
239
240 /* Command parsers */
241
242 /*
243  * parses and copies one argument enclosed in del from *sp to *dp,
244  * recognising the \x special.
245  * returns pointer to the copied argument or NULL in case of an
246  * error (and sets err) or null argument length.
247  */
248 static char *scanarg(char *s, char del)
249 {
250         char c;
251
252         while ((c = *s++) != del) {
253                 if (c == '\\' && *s == 'x') {
254                         s++;
255                         if (!isxdigit(*s++))
256                                 return NULL;
257                         if (!isxdigit(*s++))
258                                 return NULL;
259                 }
260         }
261         return s;
262 }
263
264 static char * check_special_flags (char * sfs, Node * e)
265 {
266         char * p = sfs;
267         int cont = 1;
268
269         /* special flags */
270         while (cont) {
271                 switch (*p) {
272                         case 'P':
273                                 pr_debug("register: flag: P (preserve argv0)\n");
274                                 p++;
275                                 e->flags |= MISC_FMT_PRESERVE_ARGV0;
276                                 break;
277                         case 'O':
278                                 pr_debug("register: flag: O (open binary)\n");
279                                 p++;
280                                 e->flags |= MISC_FMT_OPEN_BINARY;
281                                 break;
282                         case 'C':
283                                 pr_debug("register: flag: C (preserve creds)\n");
284                                 p++;
285                                 /* this flags also implies the
286                                    open-binary flag */
287                                 e->flags |= (MISC_FMT_CREDENTIALS |
288                                                 MISC_FMT_OPEN_BINARY);
289                                 break;
290                         default:
291                                 cont = 0;
292                 }
293         }
294
295         return p;
296 }
297 /*
298  * This registers a new binary format, it recognises the syntax
299  * ':name:type:offset:magic:mask:interpreter:flags'
300  * where the ':' is the IFS, that can be chosen with the first char
301  */
302 static Node *create_entry(const char __user *buffer, size_t count)
303 {
304         Node *e;
305         int memsize, err;
306         char *buf, *p;
307         char del;
308
309         pr_debug("register: received %zu bytes\n", count);
310
311         /* some sanity checks */
312         err = -EINVAL;
313         if ((count < 11) || (count > MAX_REGISTER_LENGTH))
314                 goto out;
315
316         err = -ENOMEM;
317         memsize = sizeof(Node) + count + 8;
318         e = kmalloc(memsize, GFP_USER);
319         if (!e)
320                 goto out;
321
322         p = buf = (char *)e + sizeof(Node);
323
324         memset(e, 0, sizeof(Node));
325         if (copy_from_user(buf, buffer, count))
326                 goto Efault;
327
328         del = *p++;     /* delimeter */
329
330         pr_debug("register: delim: %#x {%c}\n", del, del);
331
332         /* Pad the buffer with the delim to simplify parsing below. */
333         memset(buf+count, del, 8);
334
335         /* Parse the 'name' field. */
336         e->name = p;
337         p = strchr(p, del);
338         if (!p)
339                 goto Einval;
340         *p++ = '\0';
341         if (!e->name[0] ||
342             !strcmp(e->name, ".") ||
343             !strcmp(e->name, "..") ||
344             strchr(e->name, '/'))
345                 goto Einval;
346
347         pr_debug("register: name: {%s}\n", e->name);
348
349         /* Parse the 'type' field. */
350         switch (*p++) {
351         case 'E':
352                 pr_debug("register: type: E (extension)\n");
353                 e->flags = 1 << Enabled;
354                 break;
355         case 'M':
356                 pr_debug("register: type: M (magic)\n");
357                 e->flags = (1 << Enabled) | (1 << Magic);
358                 break;
359         default:
360                 goto Einval;
361         }
362         if (*p++ != del)
363                 goto Einval;
364
365         if (test_bit(Magic, &e->flags)) {
366                 /* Handle the 'M' (magic) format. */
367                 char *s;
368
369                 /* Parse the 'offset' field. */
370                 s = strchr(p, del);
371                 if (!s)
372                         goto Einval;
373                 *s++ = '\0';
374                 e->offset = simple_strtoul(p, &p, 10);
375                 if (*p++)
376                         goto Einval;
377                 pr_debug("register: offset: %#x\n", e->offset);
378
379                 /* Parse the 'magic' field. */
380                 e->magic = p;
381                 p = scanarg(p, del);
382                 if (!p)
383                         goto Einval;
384                 p[-1] = '\0';
385                 if (p == e->magic)
386                         goto Einval;
387                 if (USE_DEBUG)
388                         print_hex_dump_bytes(
389                                 KBUILD_MODNAME ": register: magic[raw]: ",
390                                 DUMP_PREFIX_NONE, e->magic, p - e->magic);
391
392                 /* Parse the 'mask' field. */
393                 e->mask = p;
394                 p = scanarg(p, del);
395                 if (!p)
396                         goto Einval;
397                 p[-1] = '\0';
398                 if (p == e->mask) {
399                         e->mask = NULL;
400                         pr_debug("register:  mask[raw]: none\n");
401                 } else if (USE_DEBUG)
402                         print_hex_dump_bytes(
403                                 KBUILD_MODNAME ": register:  mask[raw]: ",
404                                 DUMP_PREFIX_NONE, e->mask, p - e->mask);
405
406                 /*
407                  * Decode the magic & mask fields.
408                  * Note: while we might have accepted embedded NUL bytes from
409                  * above, the unescape helpers here will stop at the first one
410                  * it encounters.
411                  */
412                 e->size = string_unescape_inplace(e->magic, UNESCAPE_HEX);
413                 if (e->mask &&
414                     string_unescape_inplace(e->mask, UNESCAPE_HEX) != e->size)
415                         goto Einval;
416                 if (e->size + e->offset > BINPRM_BUF_SIZE)
417                         goto Einval;
418                 pr_debug("register: magic/mask length: %i\n", e->size);
419                 if (USE_DEBUG) {
420                         print_hex_dump_bytes(
421                                 KBUILD_MODNAME ": register: magic[decoded]: ",
422                                 DUMP_PREFIX_NONE, e->magic, e->size);
423
424                         if (e->mask) {
425                                 int i;
426                                 char *masked = kmalloc(e->size, GFP_USER);
427
428                                 print_hex_dump_bytes(
429                                         KBUILD_MODNAME ": register:  mask[decoded]: ",
430                                         DUMP_PREFIX_NONE, e->mask, e->size);
431
432                                 if (masked) {
433                                         for (i = 0; i < e->size; ++i)
434                                                 masked[i] = e->magic[i] & e->mask[i];
435                                         print_hex_dump_bytes(
436                                                 KBUILD_MODNAME ": register:  magic[masked]: ",
437                                                 DUMP_PREFIX_NONE, masked, e->size);
438
439                                         kfree(masked);
440                                 }
441                         }
442                 }
443         } else {
444                 /* Handle the 'E' (extension) format. */
445
446                 /* Skip the 'offset' field. */
447                 p = strchr(p, del);
448                 if (!p)
449                         goto Einval;
450                 *p++ = '\0';
451
452                 /* Parse the 'magic' field. */
453                 e->magic = p;
454                 p = strchr(p, del);
455                 if (!p)
456                         goto Einval;
457                 *p++ = '\0';
458                 if (!e->magic[0] || strchr(e->magic, '/'))
459                         goto Einval;
460                 pr_debug("register: extension: {%s}\n", e->magic);
461
462                 /* Skip the 'mask' field. */
463                 p = strchr(p, del);
464                 if (!p)
465                         goto Einval;
466                 *p++ = '\0';
467         }
468
469         /* Parse the 'interpreter' field. */
470         e->interpreter = p;
471         p = strchr(p, del);
472         if (!p)
473                 goto Einval;
474         *p++ = '\0';
475         if (!e->interpreter[0])
476                 goto Einval;
477         pr_debug("register: interpreter: {%s}\n", e->interpreter);
478
479         /* Parse the 'flags' field. */
480         p = check_special_flags (p, e);
481         if (*p == '\n')
482                 p++;
483         if (p != buf + count)
484                 goto Einval;
485         return e;
486
487 out:
488         return ERR_PTR(err);
489
490 Efault:
491         kfree(e);
492         return ERR_PTR(-EFAULT);
493 Einval:
494         kfree(e);
495         return ERR_PTR(-EINVAL);
496 }
497
498 /*
499  * Set status of entry/binfmt_misc:
500  * '1' enables, '0' disables and '-1' clears entry/binfmt_misc
501  */
502 static int parse_command(const char __user *buffer, size_t count)
503 {
504         char s[4];
505
506         if (count > 3)
507                 return -EINVAL;
508         if (copy_from_user(s, buffer, count))
509                 return -EFAULT;
510         if (!count)
511                 return 0;
512         if (s[count-1] == '\n')
513                 count--;
514         if (count == 1 && s[0] == '0')
515                 return 1;
516         if (count == 1 && s[0] == '1')
517                 return 2;
518         if (count == 2 && s[0] == '-' && s[1] == '1')
519                 return 3;
520         return -EINVAL;
521 }
522
523 /* generic stuff */
524
525 static void entry_status(Node *e, char *page)
526 {
527         char *dp;
528         char *status = "disabled";
529         const char * flags = "flags: ";
530
531         if (test_bit(Enabled, &e->flags))
532                 status = "enabled";
533
534         if (!VERBOSE_STATUS) {
535                 sprintf(page, "%s\n", status);
536                 return;
537         }
538
539         sprintf(page, "%s\ninterpreter %s\n", status, e->interpreter);
540         dp = page + strlen(page);
541
542         /* print the special flags */
543         sprintf (dp, "%s", flags);
544         dp += strlen (flags);
545         if (e->flags & MISC_FMT_PRESERVE_ARGV0) {
546                 *dp ++ = 'P';
547         }
548         if (e->flags & MISC_FMT_OPEN_BINARY) {
549                 *dp ++ = 'O';
550         }
551         if (e->flags & MISC_FMT_CREDENTIALS) {
552                 *dp ++ = 'C';
553         }
554         *dp ++ = '\n';
555
556
557         if (!test_bit(Magic, &e->flags)) {
558                 sprintf(dp, "extension .%s\n", e->magic);
559         } else {
560                 int i;
561
562                 sprintf(dp, "offset %i\nmagic ", e->offset);
563                 dp = page + strlen(page);
564                 for (i = 0; i < e->size; i++) {
565                         sprintf(dp, "%02x", 0xff & (int) (e->magic[i]));
566                         dp += 2;
567                 }
568                 if (e->mask) {
569                         sprintf(dp, "\nmask ");
570                         dp += 6;
571                         for (i = 0; i < e->size; i++) {
572                                 sprintf(dp, "%02x", 0xff & (int) (e->mask[i]));
573                                 dp += 2;
574                         }
575                 }
576                 *dp++ = '\n';
577                 *dp = '\0';
578         }
579 }
580
581 static struct inode *bm_get_inode(struct super_block *sb, int mode)
582 {
583         struct inode * inode = new_inode(sb);
584
585         if (inode) {
586                 inode->i_ino = get_next_ino();
587                 inode->i_mode = mode;
588                 inode->i_atime = inode->i_mtime = inode->i_ctime =
589                         current_fs_time(inode->i_sb);
590         }
591         return inode;
592 }
593
594 static void bm_evict_inode(struct inode *inode)
595 {
596         clear_inode(inode);
597         kfree(inode->i_private);
598 }
599
600 static void kill_node(Node *e)
601 {
602         struct dentry *dentry;
603
604         write_lock(&entries_lock);
605         dentry = e->dentry;
606         if (dentry) {
607                 list_del_init(&e->list);
608                 e->dentry = NULL;
609         }
610         write_unlock(&entries_lock);
611
612         if (dentry) {
613                 drop_nlink(dentry->d_inode);
614                 d_drop(dentry);
615                 dput(dentry);
616                 simple_release_fs(&bm_mnt, &entry_count);
617         }
618 }
619
620 /* /<entry> */
621
622 static ssize_t
623 bm_entry_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos)
624 {
625         Node *e = file_inode(file)->i_private;
626         ssize_t res;
627         char *page;
628
629         if (!(page = (char*) __get_free_page(GFP_KERNEL)))
630                 return -ENOMEM;
631
632         entry_status(e, page);
633
634         res = simple_read_from_buffer(buf, nbytes, ppos, page, strlen(page));
635
636         free_page((unsigned long) page);
637         return res;
638 }
639
640 static ssize_t bm_entry_write(struct file *file, const char __user *buffer,
641                                 size_t count, loff_t *ppos)
642 {
643         struct dentry *root;
644         Node *e = file_inode(file)->i_private;
645         int res = parse_command(buffer, count);
646
647         switch (res) {
648                 case 1:
649                         /* Disable this handler. */
650                         clear_bit(Enabled, &e->flags);
651                         break;
652                 case 2:
653                         /* Enable this handler. */
654                         set_bit(Enabled, &e->flags);
655                         break;
656                 case 3:
657                         /* Delete this handler. */
658                         root = dget(file->f_path.dentry->d_sb->s_root);
659                         mutex_lock(&root->d_inode->i_mutex);
660
661                         kill_node(e);
662
663                         mutex_unlock(&root->d_inode->i_mutex);
664                         dput(root);
665                         break;
666                 default: return res;
667         }
668         return count;
669 }
670
671 static const struct file_operations bm_entry_operations = {
672         .read           = bm_entry_read,
673         .write          = bm_entry_write,
674         .llseek         = default_llseek,
675 };
676
677 /* /register */
678
679 static ssize_t bm_register_write(struct file *file, const char __user *buffer,
680                                size_t count, loff_t *ppos)
681 {
682         Node *e;
683         struct inode *inode;
684         struct dentry *root, *dentry;
685         struct super_block *sb = file->f_path.dentry->d_sb;
686         int err = 0;
687
688         e = create_entry(buffer, count);
689
690         if (IS_ERR(e))
691                 return PTR_ERR(e);
692
693         root = dget(sb->s_root);
694         mutex_lock(&root->d_inode->i_mutex);
695         dentry = lookup_one_len(e->name, root, strlen(e->name));
696         err = PTR_ERR(dentry);
697         if (IS_ERR(dentry))
698                 goto out;
699
700         err = -EEXIST;
701         if (dentry->d_inode)
702                 goto out2;
703
704         inode = bm_get_inode(sb, S_IFREG | 0644);
705
706         err = -ENOMEM;
707         if (!inode)
708                 goto out2;
709
710         err = simple_pin_fs(&bm_fs_type, &bm_mnt, &entry_count);
711         if (err) {
712                 iput(inode);
713                 inode = NULL;
714                 goto out2;
715         }
716
717         e->dentry = dget(dentry);
718         inode->i_private = e;
719         inode->i_fop = &bm_entry_operations;
720
721         d_instantiate(dentry, inode);
722         write_lock(&entries_lock);
723         list_add(&e->list, &entries);
724         write_unlock(&entries_lock);
725
726         err = 0;
727 out2:
728         dput(dentry);
729 out:
730         mutex_unlock(&root->d_inode->i_mutex);
731         dput(root);
732
733         if (err) {
734                 kfree(e);
735                 return -EINVAL;
736         }
737         return count;
738 }
739
740 static const struct file_operations bm_register_operations = {
741         .write          = bm_register_write,
742         .llseek         = noop_llseek,
743 };
744
745 /* /status */
746
747 static ssize_t
748 bm_status_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
749 {
750         char *s = enabled ? "enabled\n" : "disabled\n";
751
752         return simple_read_from_buffer(buf, nbytes, ppos, s, strlen(s));
753 }
754
755 static ssize_t bm_status_write(struct file * file, const char __user * buffer,
756                 size_t count, loff_t *ppos)
757 {
758         int res = parse_command(buffer, count);
759         struct dentry *root;
760
761         switch (res) {
762                 case 1:
763                         /* Disable all handlers. */
764                         enabled = 0;
765                         break;
766                 case 2:
767                         /* Enable all handlers. */
768                         enabled = 1;
769                         break;
770                 case 3:
771                         /* Delete all handlers. */
772                         root = dget(file->f_path.dentry->d_sb->s_root);
773                         mutex_lock(&root->d_inode->i_mutex);
774
775                         while (!list_empty(&entries))
776                                 kill_node(list_entry(entries.next, Node, list));
777
778                         mutex_unlock(&root->d_inode->i_mutex);
779                         dput(root);
780                         break;
781                 default: return res;
782         }
783         return count;
784 }
785
786 static const struct file_operations bm_status_operations = {
787         .read           = bm_status_read,
788         .write          = bm_status_write,
789         .llseek         = default_llseek,
790 };
791
792 /* Superblock handling */
793
794 static const struct super_operations s_ops = {
795         .statfs         = simple_statfs,
796         .evict_inode    = bm_evict_inode,
797 };
798
799 static int bm_fill_super(struct super_block * sb, void * data, int silent)
800 {
801         static struct tree_descr bm_files[] = {
802                 [2] = {"status", &bm_status_operations, S_IWUSR|S_IRUGO},
803                 [3] = {"register", &bm_register_operations, S_IWUSR},
804                 /* last one */ {""}
805         };
806         int err = simple_fill_super(sb, BINFMTFS_MAGIC, bm_files);
807         if (!err)
808                 sb->s_op = &s_ops;
809         return err;
810 }
811
812 static struct dentry *bm_mount(struct file_system_type *fs_type,
813         int flags, const char *dev_name, void *data)
814 {
815         return mount_single(fs_type, flags, data, bm_fill_super);
816 }
817
818 static struct linux_binfmt misc_format = {
819         .module = THIS_MODULE,
820         .load_binary = load_misc_binary,
821 };
822
823 static struct file_system_type bm_fs_type = {
824         .owner          = THIS_MODULE,
825         .name           = "binfmt_misc",
826         .mount          = bm_mount,
827         .kill_sb        = kill_litter_super,
828 };
829 MODULE_ALIAS_FS("binfmt_misc");
830
831 static int __init init_misc_binfmt(void)
832 {
833         int err = register_filesystem(&bm_fs_type);
834         if (!err)
835                 insert_binfmt(&misc_format);
836         return err;
837 }
838
839 static void __exit exit_misc_binfmt(void)
840 {
841         unregister_binfmt(&misc_format);
842         unregister_filesystem(&bm_fs_type);
843 }
844
845 core_initcall(init_misc_binfmt);
846 module_exit(exit_misc_binfmt);
847 MODULE_LICENSE("GPL");