{
        struct sock *sk = sock->sk;
        struct rose_sock *rose = rose_sk(sk);
-       int opt;
+       unsigned int opt;
 
        if (level != SOL_ROSE)
                return -ENOPROTOOPT;
 
-       if (optlen < sizeof(int))
+       if (optlen < sizeof(unsigned int))
                return -EINVAL;
 
-       if (copy_from_sockptr(&opt, optval, sizeof(int)))
+       if (copy_from_sockptr(&opt, optval, sizeof(unsigned int)))
                return -EFAULT;
 
        switch (optname) {
                return 0;
 
        case ROSE_T1:
-               if (opt < 1)
+               if (opt < 1 || opt > UINT_MAX / HZ)
                        return -EINVAL;
                rose->t1 = opt * HZ;
                return 0;
 
        case ROSE_T2:
-               if (opt < 1)
+               if (opt < 1 || opt > UINT_MAX / HZ)
                        return -EINVAL;
                rose->t2 = opt * HZ;
                return 0;
 
        case ROSE_T3:
-               if (opt < 1)
+               if (opt < 1 || opt > UINT_MAX / HZ)
                        return -EINVAL;
                rose->t3 = opt * HZ;
                return 0;
 
        case ROSE_HOLDBACK:
-               if (opt < 1)
+               if (opt < 1 || opt > UINT_MAX / HZ)
                        return -EINVAL;
                rose->hb = opt * HZ;
                return 0;
 
        case ROSE_IDLE:
-               if (opt < 0)
+               if (opt > UINT_MAX / (60 * HZ))
                        return -EINVAL;
                rose->idle = opt * 60 * HZ;
                return 0;