Skip to content

Commit

Permalink
binfmt_flat: make support for old format binaries optional
Browse files Browse the repository at this point in the history
No need to carry the extra code around, given that systems using flat
binaries are generally very resource constrained.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
  • Loading branch information
Christoph Hellwig authored and Greg Ungerer committed Jun 23, 2019
1 parent aef0f78 commit cf9a566
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
7 changes: 7 additions & 0 deletions fs/Kconfig.binfmt
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ config BINFMT_FLAT_ARGVP_ENVP_ON_STACK
config BINFMT_FLAT_OLD_ALWAYS_RAM
bool

config BINFMT_FLAT_OLD
bool "Enable support for very old legacy flat binaries"
depends on BINFMT_FLAT
help
Support decade old uClinux FLAT format binaries. Unless you know
you have some of those say N here.

config BINFMT_ZFLAT
bool "Enable ZFLAT support"
depends on BINFMT_FLAT
Expand Down
30 changes: 22 additions & 8 deletions fs/binfmt_flat.c
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ calc_reloc(unsigned long r, struct lib_info *p, int curid, int internalp)

/****************************************************************************/

#ifdef CONFIG_BINFMT_FLAT_OLD
static void old_reloc(unsigned long rl)
{
static const char *segment[] = { "TEXT", "DATA", "BSS", "*UNKNOWN*" };
Expand Down Expand Up @@ -411,6 +412,7 @@ static void old_reloc(unsigned long rl)

pr_debug("Relocation became %lx\n", val);
}
#endif /* CONFIG_BINFMT_FLAT_OLD */

/****************************************************************************/

Expand Down Expand Up @@ -461,6 +463,7 @@ static int load_flat_file(struct linux_binprm *bprm,
if (flags & FLAT_FLAG_KTRACE)
pr_info("Loading file: %s\n", bprm->filename);

#ifdef CONFIG_BINFMT_FLAT_OLD
if (rev != FLAT_VERSION && rev != OLD_FLAT_VERSION) {
pr_err("bad flat file version 0x%x (supported 0x%lx and 0x%lx)\n",
rev, FLAT_VERSION, OLD_FLAT_VERSION);
Expand All @@ -476,6 +479,23 @@ static int load_flat_file(struct linux_binprm *bprm,
goto err;
}

/*
* fix up the flags for the older format, there were all kinds
* of endian hacks, this only works for the simple cases
*/
if (rev == OLD_FLAT_VERSION &&
(flags || IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM)))
flags = FLAT_FLAG_RAM;

#else /* CONFIG_BINFMT_FLAT_OLD */
if (rev != FLAT_VERSION) {
pr_err("bad flat file version 0x%x (supported 0x%lx)\n",
rev, FLAT_VERSION);
ret = -ENOEXEC;
goto err;
}
#endif /* !CONFIG_BINFMT_FLAT_OLD */

/*
* Make sure the header params are sane.
* 28 bits (256 MB) is way more than reasonable in this case.
Expand All @@ -487,14 +507,6 @@ static int load_flat_file(struct linux_binprm *bprm,
goto err;
}

/*
* fix up the flags for the older format, there were all kinds
* of endian hacks, this only works for the simple cases
*/
if (rev == OLD_FLAT_VERSION &&
(flags || IS_ENABLED(CONFIG_BINFMT_FLAT_OLD_ALWAYS_RAM)))
flags = FLAT_FLAG_RAM;

#ifndef CONFIG_BINFMT_ZFLAT
if (flags & (FLAT_FLAG_GZIP|FLAT_FLAG_GZDATA)) {
pr_err("Support for ZFLAT executables is not enabled.\n");
Expand Down Expand Up @@ -833,13 +845,15 @@ static int load_flat_file(struct linux_binprm *bprm,
goto err;
}
}
#ifdef CONFIG_BINFMT_FLAT_OLD
} else {
for (i = 0; i < relocs; i++) {
__be32 relval;
if (get_user(relval, reloc + i))
return -EFAULT;
old_reloc(ntohl(relval));
}
#endif /* CONFIG_BINFMT_FLAT_OLD */
}

flush_icache_range(start_code, end_code);
Expand Down

0 comments on commit cf9a566

Please sign in to comment.