|
@@ -136,8 +136,8 @@ static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params,
|
|
|
|
|
|
retval = kernel_read(file, params->hdr.e_phoff,
|
|
retval = kernel_read(file, params->hdr.e_phoff,
|
|
(char *) params->phdrs, size);
|
|
(char *) params->phdrs, size);
|
|
- if (retval < 0)
|
|
|
|
- return retval;
|
|
|
|
|
|
+ if (unlikely(retval != size))
|
|
|
|
+ return retval < 0 ? retval : -ENOEXEC;
|
|
|
|
|
|
/* determine stack size for this binary */
|
|
/* determine stack size for this binary */
|
|
phdr = params->phdrs;
|
|
phdr = params->phdrs;
|
|
@@ -218,8 +218,11 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm,
|
|
phdr->p_offset,
|
|
phdr->p_offset,
|
|
interpreter_name,
|
|
interpreter_name,
|
|
phdr->p_filesz);
|
|
phdr->p_filesz);
|
|
- if (retval < 0)
|
|
|
|
|
|
+ if (unlikely(retval != phdr->p_filesz)) {
|
|
|
|
+ if (retval >= 0)
|
|
|
|
+ retval = -ENOEXEC;
|
|
goto error;
|
|
goto error;
|
|
|
|
+ }
|
|
|
|
|
|
retval = -ENOENT;
|
|
retval = -ENOENT;
|
|
if (interpreter_name[phdr->p_filesz - 1] != '\0')
|
|
if (interpreter_name[phdr->p_filesz - 1] != '\0')
|
|
@@ -245,8 +248,11 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm,
|
|
|
|
|
|
retval = kernel_read(interpreter, 0, bprm->buf,
|
|
retval = kernel_read(interpreter, 0, bprm->buf,
|
|
BINPRM_BUF_SIZE);
|
|
BINPRM_BUF_SIZE);
|
|
- if (retval < 0)
|
|
|
|
|
|
+ if (unlikely(retval != BINPRM_BUF_SIZE)) {
|
|
|
|
+ if (retval >= 0)
|
|
|
|
+ retval = -ENOEXEC;
|
|
goto error;
|
|
goto error;
|
|
|
|
+ }
|
|
|
|
|
|
interp_params.hdr = *((struct elfhdr *) bprm->buf);
|
|
interp_params.hdr = *((struct elfhdr *) bprm->buf);
|
|
break;
|
|
break;
|