@@ -256,10 +256,8 @@ static const struct file_operations signalfd_fops = {
256
256
.llseek = noop_llseek ,
257
257
};
258
258
259
- static int do_signalfd4 (int ufd , sigset_t __user * user_mask , size_t sizemask ,
260
- int flags )
259
+ static int do_signalfd4 (int ufd , sigset_t * mask , int flags )
261
260
{
262
- sigset_t sigmask ;
263
261
struct signalfd_ctx * ctx ;
264
262
265
263
/* Check the SFD_* constants for consistency. */
@@ -269,18 +267,15 @@ static int do_signalfd4(int ufd, sigset_t __user *user_mask, size_t sizemask,
269
267
if (flags & ~(SFD_CLOEXEC | SFD_NONBLOCK ))
270
268
return - EINVAL ;
271
269
272
- if (sizemask != sizeof (sigset_t ) ||
273
- copy_from_user (& sigmask , user_mask , sizeof (sigmask )))
274
- return - EINVAL ;
275
- sigdelsetmask (& sigmask , sigmask (SIGKILL ) | sigmask (SIGSTOP ));
276
- signotset (& sigmask );
270
+ sigdelsetmask (mask , sigmask (SIGKILL ) | sigmask (SIGSTOP ));
271
+ signotset (mask );
277
272
278
273
if (ufd == -1 ) {
279
274
ctx = kmalloc (sizeof (* ctx ), GFP_KERNEL );
280
275
if (!ctx )
281
276
return - ENOMEM ;
282
277
283
- ctx -> sigmask = sigmask ;
278
+ ctx -> sigmask = * mask ;
284
279
285
280
/*
286
281
* When we call this, the initialization must be complete, since
@@ -300,7 +295,7 @@ static int do_signalfd4(int ufd, sigset_t __user *user_mask, size_t sizemask,
300
295
return - EINVAL ;
301
296
}
302
297
spin_lock_irq (& current -> sighand -> siglock );
303
- ctx -> sigmask = sigmask ;
298
+ ctx -> sigmask = * mask ;
304
299
spin_unlock_irq (& current -> sighand -> siglock );
305
300
306
301
wake_up (& current -> sighand -> signalfd_wqh );
@@ -313,46 +308,51 @@ static int do_signalfd4(int ufd, sigset_t __user *user_mask, size_t sizemask,
313
308
SYSCALL_DEFINE4 (signalfd4 , int , ufd , sigset_t __user * , user_mask ,
314
309
size_t , sizemask , int , flags )
315
310
{
316
- return do_signalfd4 (ufd , user_mask , sizemask , flags );
311
+ sigset_t mask ;
312
+
313
+ if (sizemask != sizeof (sigset_t ) ||
314
+ copy_from_user (& mask , user_mask , sizeof (mask )))
315
+ return - EINVAL ;
316
+ return do_signalfd4 (ufd , & mask , flags );
317
317
}
318
318
319
319
SYSCALL_DEFINE3 (signalfd , int , ufd , sigset_t __user * , user_mask ,
320
320
size_t , sizemask )
321
321
{
322
- return do_signalfd4 (ufd , user_mask , sizemask , 0 );
322
+ sigset_t mask ;
323
+
324
+ if (sizemask != sizeof (sigset_t ) ||
325
+ copy_from_user (& mask , user_mask , sizeof (mask )))
326
+ return - EINVAL ;
327
+ return do_signalfd4 (ufd , & mask , 0 );
323
328
}
324
329
325
330
#ifdef CONFIG_COMPAT
326
331
static long do_compat_signalfd4 (int ufd ,
327
- const compat_sigset_t __user * sigmask ,
332
+ const compat_sigset_t __user * user_mask ,
328
333
compat_size_t sigsetsize , int flags )
329
334
{
330
- sigset_t tmp ;
331
- sigset_t __user * ksigmask ;
335
+ sigset_t mask ;
332
336
333
337
if (sigsetsize != sizeof (compat_sigset_t ))
334
338
return - EINVAL ;
335
- if (get_compat_sigset (& tmp , sigmask ))
336
- return - EFAULT ;
337
- ksigmask = compat_alloc_user_space (sizeof (sigset_t ));
338
- if (copy_to_user (ksigmask , & tmp , sizeof (sigset_t )))
339
+ if (get_compat_sigset (& mask , user_mask ))
339
340
return - EFAULT ;
340
-
341
- return do_signalfd4 (ufd , ksigmask , sizeof (sigset_t ), flags );
341
+ return do_signalfd4 (ufd , & mask , flags );
342
342
}
343
343
344
344
COMPAT_SYSCALL_DEFINE4 (signalfd4 , int , ufd ,
345
- const compat_sigset_t __user * , sigmask ,
345
+ const compat_sigset_t __user * , user_mask ,
346
346
compat_size_t , sigsetsize ,
347
347
int , flags )
348
348
{
349
- return do_compat_signalfd4 (ufd , sigmask , sigsetsize , flags );
349
+ return do_compat_signalfd4 (ufd , user_mask , sigsetsize , flags );
350
350
}
351
351
352
352
COMPAT_SYSCALL_DEFINE3 (signalfd , int , ufd ,
353
- const compat_sigset_t __user * ,sigmask ,
353
+ const compat_sigset_t __user * , user_mask ,
354
354
compat_size_t , sigsetsize )
355
355
{
356
- return do_compat_signalfd4 (ufd , sigmask , sigsetsize , 0 );
356
+ return do_compat_signalfd4 (ufd , user_mask , sigsetsize , 0 );
357
357
}
358
358
#endif
0 commit comments