revert-sparc.patch 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. diff -Nur linux-4.6.4.orig/arch/sparc/kernel/signal_32.c linux-4.6.4/arch/sparc/kernel/signal_32.c
  2. --- linux-4.6.4.orig/arch/sparc/kernel/signal_32.c 2016-07-11 18:30:07.000000000 +0200
  3. +++ linux-4.6.4/arch/sparc/kernel/signal_32.c 2016-07-18 21:55:43.720763787 +0200
  4. @@ -60,22 +60,10 @@
  5. #define SF_ALIGNEDSZ (((sizeof(struct signal_frame) + 7) & (~7)))
  6. #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
  7. -/* Checks if the fp is valid. We always build signal frames which are
  8. - * 16-byte aligned, therefore we can always enforce that the restore
  9. - * frame has that property as well.
  10. - */
  11. -static inline bool invalid_frame_pointer(void __user *fp, int fplen)
  12. -{
  13. - if ((((unsigned long) fp) & 15) || !__access_ok((unsigned long)fp, fplen))
  14. - return true;
  15. -
  16. - return false;
  17. -}
  18. -
  19. asmlinkage void do_sigreturn(struct pt_regs *regs)
  20. {
  21. - unsigned long up_psr, pc, npc, ufp;
  22. struct signal_frame __user *sf;
  23. + unsigned long up_psr, pc, npc;
  24. sigset_t set;
  25. __siginfo_fpu_t __user *fpu_save;
  26. __siginfo_rwin_t __user *rwin_save;
  27. @@ -89,13 +77,10 @@
  28. sf = (struct signal_frame __user *) regs->u_regs[UREG_FP];
  29. /* 1. Make sure we are not getting garbage from the user */
  30. - if (!invalid_frame_pointer(sf, sizeof(*sf)))
  31. + if (!access_ok(VERIFY_READ, sf, sizeof(*sf)))
  32. goto segv_and_exit;
  33. - if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP]))
  34. - goto segv_and_exit;
  35. -
  36. - if (ufp & 0x7)
  37. + if (((unsigned long) sf) & 3)
  38. goto segv_and_exit;
  39. err = __get_user(pc, &sf->info.si_regs.pc);
  40. @@ -142,7 +127,7 @@
  41. asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
  42. {
  43. struct rt_signal_frame __user *sf;
  44. - unsigned int psr, pc, npc, ufp;
  45. + unsigned int psr, pc, npc;
  46. __siginfo_fpu_t __user *fpu_save;
  47. __siginfo_rwin_t __user *rwin_save;
  48. sigset_t set;
  49. @@ -150,13 +135,8 @@
  50. synchronize_user_stack();
  51. sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
  52. - if (!invalid_frame_pointer(sf, sizeof(*sf)))
  53. - goto segv;
  54. -
  55. - if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
  56. - goto segv;
  57. -
  58. - if (ufp & 0x7)
  59. + if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
  60. + (((unsigned long) sf) & 0x03))
  61. goto segv;
  62. err = __get_user(pc, &sf->regs.pc);
  63. @@ -198,6 +178,15 @@
  64. force_sig(SIGSEGV, current);
  65. }
  66. +/* Checks if the fp is valid */
  67. +static inline int invalid_frame_pointer(void __user *fp, int fplen)
  68. +{
  69. + if ((((unsigned long) fp) & 7) || !__access_ok((unsigned long)fp, fplen))
  70. + return 1;
  71. +
  72. + return 0;
  73. +}
  74. +
  75. static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
  76. {
  77. unsigned long sp = regs->u_regs[UREG_FP];
  78. diff -Nur linux-4.6.4.orig/arch/sparc/kernel/signal32.c linux-4.6.4/arch/sparc/kernel/signal32.c
  79. --- linux-4.6.4.orig/arch/sparc/kernel/signal32.c 2016-07-11 18:30:07.000000000 +0200
  80. +++ linux-4.6.4/arch/sparc/kernel/signal32.c 2016-07-18 21:56:41.807007836 +0200
  81. @@ -138,24 +138,12 @@
  82. return 0;
  83. }
  84. -/* Checks if the fp is valid. We always build signal frames which are
  85. - * 16-byte aligned, therefore we can always enforce that the restore
  86. - * frame has that property as well.
  87. - */
  88. -static bool invalid_frame_pointer(void __user *fp, int fplen)
  89. -{
  90. - if ((((unsigned long) fp) & 15) ||
  91. - ((unsigned long)fp) > 0x100000000ULL - fplen)
  92. - return true;
  93. - return false;
  94. -}
  95. -
  96. void do_sigreturn32(struct pt_regs *regs)
  97. {
  98. struct signal_frame32 __user *sf;
  99. compat_uptr_t fpu_save;
  100. compat_uptr_t rwin_save;
  101. - unsigned int psr, ufp;
  102. + unsigned int psr;
  103. unsigned int pc, npc;
  104. sigset_t set;
  105. compat_sigset_t seta;
  106. @@ -170,16 +158,11 @@
  107. sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP];
  108. /* 1. Make sure we are not getting garbage from the user */
  109. - if (invalid_frame_pointer(sf, sizeof(*sf)))
  110. - goto segv;
  111. -
  112. - if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP]))
  113. - goto segv;
  114. -
  115. - if (ufp & 0x7)
  116. + if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
  117. + (((unsigned long) sf) & 3))
  118. goto segv;
  119. - if (__get_user(pc, &sf->info.si_regs.pc) ||
  120. + if (get_user(pc, &sf->info.si_regs.pc) ||
  121. __get_user(npc, &sf->info.si_regs.npc))
  122. goto segv;
  123. @@ -244,7 +227,7 @@
  124. asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
  125. {
  126. struct rt_signal_frame32 __user *sf;
  127. - unsigned int psr, pc, npc, ufp;
  128. + unsigned int psr, pc, npc;
  129. compat_uptr_t fpu_save;
  130. compat_uptr_t rwin_save;
  131. sigset_t set;
  132. @@ -259,16 +242,11 @@
  133. sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
  134. /* 1. Make sure we are not getting garbage from the user */
  135. - if (invalid_frame_pointer(sf, sizeof(*sf)))
  136. + if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
  137. + (((unsigned long) sf) & 3))
  138. goto segv;
  139. - if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
  140. - goto segv;
  141. -
  142. - if (ufp & 0x7)
  143. - goto segv;
  144. -
  145. - if (__get_user(pc, &sf->regs.pc) ||
  146. + if (get_user(pc, &sf->regs.pc) ||
  147. __get_user(npc, &sf->regs.npc))
  148. goto segv;
  149. @@ -329,6 +307,14 @@
  150. force_sig(SIGSEGV, current);
  151. }
  152. +/* Checks if the fp is valid */
  153. +static int invalid_frame_pointer(void __user *fp, int fplen)
  154. +{
  155. + if ((((unsigned long) fp) & 7) || ((unsigned long)fp) > 0x100000000ULL - fplen)
  156. + return 1;
  157. + return 0;
  158. +}
  159. +
  160. static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
  161. {
  162. unsigned long sp;
  163. diff -Nur linux-4.6.4.orig/arch/sparc/kernel/signal_64.c linux-4.6.4/arch/sparc/kernel/signal_64.c
  164. --- linux-4.6.4.orig/arch/sparc/kernel/signal_64.c 2016-07-11 18:30:07.000000000 +0200
  165. +++ linux-4.6.4/arch/sparc/kernel/signal_64.c 2016-07-18 21:55:43.720763787 +0200
  166. @@ -234,17 +234,6 @@
  167. goto out;
  168. }
  169. -/* Checks if the fp is valid. We always build rt signal frames which
  170. - * are 16-byte aligned, therefore we can always enforce that the
  171. - * restore frame has that property as well.
  172. - */
  173. -static bool invalid_frame_pointer(void __user *fp)
  174. -{
  175. - if (((unsigned long) fp) & 15)
  176. - return true;
  177. - return false;
  178. -}
  179. -
  180. struct rt_signal_frame {
  181. struct sparc_stackf ss;
  182. siginfo_t info;
  183. @@ -257,8 +246,8 @@
  184. void do_rt_sigreturn(struct pt_regs *regs)
  185. {
  186. - unsigned long tpc, tnpc, tstate, ufp;
  187. struct rt_signal_frame __user *sf;
  188. + unsigned long tpc, tnpc, tstate;
  189. __siginfo_fpu_t __user *fpu_save;
  190. __siginfo_rwin_t __user *rwin_save;
  191. sigset_t set;
  192. @@ -272,16 +261,10 @@
  193. (regs->u_regs [UREG_FP] + STACK_BIAS);
  194. /* 1. Make sure we are not getting garbage from the user */
  195. - if (invalid_frame_pointer(sf))
  196. - goto segv;
  197. -
  198. - if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
  199. + if (((unsigned long) sf) & 3)
  200. goto segv;
  201. - if ((ufp + STACK_BIAS) & 0x7)
  202. - goto segv;
  203. -
  204. - err = __get_user(tpc, &sf->regs.tpc);
  205. + err = get_user(tpc, &sf->regs.tpc);
  206. err |= __get_user(tnpc, &sf->regs.tnpc);
  207. if (test_thread_flag(TIF_32BIT)) {
  208. tpc &= 0xffffffff;
  209. @@ -325,6 +308,14 @@
  210. force_sig(SIGSEGV, current);
  211. }
  212. +/* Checks if the fp is valid */
  213. +static int invalid_frame_pointer(void __user *fp)
  214. +{
  215. + if (((unsigned long) fp) & 15)
  216. + return 1;
  217. + return 0;
  218. +}
  219. +
  220. static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
  221. {
  222. unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS;
  223. diff -Nur linux-4.6.4.orig/arch/sparc/kernel/sigutil_32.c linux-4.6.4/arch/sparc/kernel/sigutil_32.c
  224. --- linux-4.6.4.orig/arch/sparc/kernel/sigutil_32.c 2016-07-11 18:30:07.000000000 +0200
  225. +++ linux-4.6.4/arch/sparc/kernel/sigutil_32.c 2016-07-18 21:55:43.720763787 +0200
  226. @@ -48,10 +48,6 @@
  227. int restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
  228. {
  229. int err;
  230. -
  231. - if (((unsigned long) fpu) & 3)
  232. - return -EFAULT;
  233. -
  234. #ifdef CONFIG_SMP
  235. if (test_tsk_thread_flag(current, TIF_USEDFPU))
  236. regs->psr &= ~PSR_EF;
  237. @@ -101,10 +97,7 @@
  238. struct thread_info *t = current_thread_info();
  239. int i, wsaved, err;
  240. - if (((unsigned long) rp) & 3)
  241. - return -EFAULT;
  242. -
  243. - get_user(wsaved, &rp->wsaved);
  244. + __get_user(wsaved, &rp->wsaved);
  245. if (wsaved > NSWINS)
  246. return -EFAULT;
  247. diff -Nur linux-4.6.4.orig/arch/sparc/kernel/sigutil_64.c linux-4.6.4/arch/sparc/kernel/sigutil_64.c
  248. --- linux-4.6.4.orig/arch/sparc/kernel/sigutil_64.c 2016-07-11 18:30:07.000000000 +0200
  249. +++ linux-4.6.4/arch/sparc/kernel/sigutil_64.c 2016-07-18 21:55:43.720763787 +0200
  250. @@ -37,10 +37,7 @@
  251. unsigned long fprs;
  252. int err;
  253. - if (((unsigned long) fpu) & 7)
  254. - return -EFAULT;
  255. -
  256. - err = get_user(fprs, &fpu->si_fprs);
  257. + err = __get_user(fprs, &fpu->si_fprs);
  258. fprs_write(0);
  259. regs->tstate &= ~TSTATE_PEF;
  260. if (fprs & FPRS_DL)
  261. @@ -75,10 +72,7 @@
  262. struct thread_info *t = current_thread_info();
  263. int i, wsaved, err;
  264. - if (((unsigned long) rp) & 7)
  265. - return -EFAULT;
  266. -
  267. - get_user(wsaved, &rp->wsaved);
  268. + __get_user(wsaved, &rp->wsaved);
  269. if (wsaved > NSWINS)
  270. return -EFAULT;