Browse Source

Merge branch 'for-linus-4.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml

Pull uml fixes from Richard Weinberger:
 "This contains various bug fixes, most of them are fall out from the
  merge window"

* 'for-linus-4.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml:
  um: fix returns without va_end
  um: Fix fpstate handling
  arch: um: fix error when linking vmlinux.
  um: Fix get_signal() usage
Linus Torvalds 9 years ago
parent
commit
aa53685549
5 changed files with 19 additions and 15 deletions
  1. 1 1
      arch/um/Makefile
  2. 6 4
      arch/um/drivers/net_user.c
  3. 1 1
      arch/um/kernel/signal.c
  4. 10 8
      arch/x86/um/signal.c
  5. 1 1
      scripts/link-vmlinux.sh

+ 1 - 1
arch/um/Makefile

@@ -131,7 +131,7 @@ export LDS_ELF_FORMAT := $(ELF_FORMAT)
 # The wrappers will select whether using "malloc" or the kernel allocator.
 # The wrappers will select whether using "malloc" or the kernel allocator.
 LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
 LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc
 
 
-LD_FLAGS_CMDLINE = $(foreach opt,$(LDFLAGS),-Wl,$(opt)) -lrt
+LD_FLAGS_CMDLINE = $(foreach opt,$(LDFLAGS),-Wl,$(opt))
 
 
 # Used by link-vmlinux.sh which has special support for um link
 # Used by link-vmlinux.sh which has special support for um link
 export CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE)
 export CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE)

+ 6 - 4
arch/um/drivers/net_user.c

@@ -249,21 +249,23 @@ void close_addr(unsigned char *addr, unsigned char *netmask, void *arg)
 
 
 char *split_if_spec(char *str, ...)
 char *split_if_spec(char *str, ...)
 {
 {
-	char **arg, *end;
+	char **arg, *end, *ret = NULL;
 	va_list ap;
 	va_list ap;
 
 
 	va_start(ap, str);
 	va_start(ap, str);
 	while ((arg = va_arg(ap, char **)) != NULL) {
 	while ((arg = va_arg(ap, char **)) != NULL) {
 		if (*str == '\0')
 		if (*str == '\0')
-			return NULL;
+			goto out;
 		end = strchr(str, ',');
 		end = strchr(str, ',');
 		if (end != str)
 		if (end != str)
 			*arg = str;
 			*arg = str;
 		if (end == NULL)
 		if (end == NULL)
-			return NULL;
+			goto out;
 		*end++ = '\0';
 		*end++ = '\0';
 		str = end;
 		str = end;
 	}
 	}
+	ret = str;
+out:
 	va_end(ap);
 	va_end(ap);
-	return str;
+	return ret;
 }
 }

+ 1 - 1
arch/um/kernel/signal.c

@@ -69,7 +69,7 @@ void do_signal(struct pt_regs *regs)
 	struct ksignal ksig;
 	struct ksignal ksig;
 	int handled_sig = 0;
 	int handled_sig = 0;
 
 
-	while (get_signal(&ksig)) {
+	if (get_signal(&ksig)) {
 		handled_sig = 1;
 		handled_sig = 1;
 		/* Whee!  Actually deliver the signal.  */
 		/* Whee!  Actually deliver the signal.  */
 		handle_signal(&ksig, regs);
 		handle_signal(&ksig, regs);

+ 10 - 8
arch/x86/um/signal.c

@@ -211,7 +211,7 @@ static int copy_sc_from_user(struct pt_regs *regs,
 		if (err)
 		if (err)
 			return 1;
 			return 1;
 
 
-		err = convert_fxsr_from_user(&fpx, sc.fpstate);
+		err = convert_fxsr_from_user(&fpx, (void *)sc.fpstate);
 		if (err)
 		if (err)
 			return 1;
 			return 1;
 
 
@@ -227,7 +227,7 @@ static int copy_sc_from_user(struct pt_regs *regs,
 	{
 	{
 		struct user_i387_struct fp;
 		struct user_i387_struct fp;
 
 
-		err = copy_from_user(&fp, sc.fpstate,
+		err = copy_from_user(&fp, (void *)sc.fpstate,
 				     sizeof(struct user_i387_struct));
 				     sizeof(struct user_i387_struct));
 		if (err)
 		if (err)
 			return 1;
 			return 1;
@@ -291,7 +291,7 @@ static int copy_sc_to_user(struct sigcontext __user *to,
 #endif
 #endif
 #undef PUTREG
 #undef PUTREG
 	sc.oldmask = mask;
 	sc.oldmask = mask;
-	sc.fpstate = to_fp;
+	sc.fpstate = (unsigned long)to_fp;
 
 
 	err = copy_to_user(to, &sc, sizeof(struct sigcontext));
 	err = copy_to_user(to, &sc, sizeof(struct sigcontext));
 	if (err)
 	if (err)
@@ -468,12 +468,10 @@ long sys_sigreturn(void)
 	struct sigframe __user *frame = (struct sigframe __user *)(sp - 8);
 	struct sigframe __user *frame = (struct sigframe __user *)(sp - 8);
 	sigset_t set;
 	sigset_t set;
 	struct sigcontext __user *sc = &frame->sc;
 	struct sigcontext __user *sc = &frame->sc;
-	unsigned long __user *oldmask = &sc->oldmask;
-	unsigned long __user *extramask = frame->extramask;
 	int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long);
 	int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long);
 
 
-	if (copy_from_user(&set.sig[0], oldmask, sizeof(set.sig[0])) ||
-	    copy_from_user(&set.sig[1], extramask, sig_size))
+	if (copy_from_user(&set.sig[0], (void *)sc->oldmask, sizeof(set.sig[0])) ||
+	    copy_from_user(&set.sig[1], frame->extramask, sig_size))
 		goto segfault;
 		goto segfault;
 
 
 	set_current_blocked(&set);
 	set_current_blocked(&set);
@@ -505,6 +503,7 @@ int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
 {
 {
 	struct rt_sigframe __user *frame;
 	struct rt_sigframe __user *frame;
 	int err = 0, sig = ksig->sig;
 	int err = 0, sig = ksig->sig;
+	unsigned long fp_to;
 
 
 	frame = (struct rt_sigframe __user *)
 	frame = (struct rt_sigframe __user *)
 		round_down(stack_top - sizeof(struct rt_sigframe), 16);
 		round_down(stack_top - sizeof(struct rt_sigframe), 16);
@@ -526,7 +525,10 @@ int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
 	err |= __save_altstack(&frame->uc.uc_stack, PT_REGS_SP(regs));
 	err |= __save_altstack(&frame->uc.uc_stack, PT_REGS_SP(regs));
 	err |= copy_sc_to_user(&frame->uc.uc_mcontext, &frame->fpstate, regs,
 	err |= copy_sc_to_user(&frame->uc.uc_mcontext, &frame->fpstate, regs,
 			       set->sig[0]);
 			       set->sig[0]);
-	err |= __put_user(&frame->fpstate, &frame->uc.uc_mcontext.fpstate);
+
+	fp_to = (unsigned long)&frame->fpstate;
+
+	err |= __put_user(fp_to, &frame->uc.uc_mcontext.fpstate);
 	if (sizeof(*set) == 16) {
 	if (sizeof(*set) == 16) {
 		err |= __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]);
 		err |= __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]);
 		err |= __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]);
 		err |= __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]);

+ 1 - 1
scripts/link-vmlinux.sh

@@ -62,7 +62,7 @@ vmlinux_link()
 			-Wl,--start-group                                    \
 			-Wl,--start-group                                    \
 				 ${KBUILD_VMLINUX_MAIN}                      \
 				 ${KBUILD_VMLINUX_MAIN}                      \
 			-Wl,--end-group                                      \
 			-Wl,--end-group                                      \
-			-lutil ${1}
+			-lutil -lrt ${1}
 		rm -f linux
 		rm -f linux
 	fi
 	fi
 }
 }