PCI: dwc: Fix inverted condition of DMA mask setup warning
[linux-2.6-microblaze.git] / net / netfilter / x_tables.c
index 9ad8f3f..af22dbe 100644 (file)
@@ -1028,34 +1028,34 @@ int xt_check_target(struct xt_tgchk_param *par,
 EXPORT_SYMBOL_GPL(xt_check_target);
 
 /**
- * xt_copy_counters_from_user - copy counters and metadata from userspace
+ * xt_copy_counters - copy counters and metadata from a sockptr_t
  *
- * @user: src pointer to userspace memory
+ * @arg: src sockptr
  * @len: alleged size of userspace memory
  * @info: where to store the xt_counters_info metadata
- * @compat: true if we setsockopt call is done by 32bit task on 64bit kernel
  *
  * Copies counter meta data from @user and stores it in @info.
  *
  * vmallocs memory to hold the counters, then copies the counter data
  * from @user to the new memory and returns a pointer to it.
  *
- * If @compat is true, @info gets converted automatically to the 64bit
- * representation.
+ * If called from a compat syscall, @info gets converted automatically to the
+ * 64bit representation.
  *
  * The metadata associated with the counters is stored in @info.
  *
  * Return: returns pointer that caller has to test via IS_ERR().
  * If IS_ERR is false, caller has to vfree the pointer.
  */
-void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
-                                struct xt_counters_info *info, bool compat)
+void *xt_copy_counters(sockptr_t arg, unsigned int len,
+                      struct xt_counters_info *info)
 {
+       size_t offset;
        void *mem;
        u64 size;
 
 #ifdef CONFIG_COMPAT
-       if (compat) {
+       if (in_compat_syscall()) {
                /* structures only differ in size due to alignment */
                struct compat_xt_counters_info compat_tmp;
 
@@ -1063,12 +1063,12 @@ void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
                        return ERR_PTR(-EINVAL);
 
                len -= sizeof(compat_tmp);
-               if (copy_from_user(&compat_tmp, user, sizeof(compat_tmp)) != 0)
+               if (copy_from_sockptr(&compat_tmp, arg, sizeof(compat_tmp)) != 0)
                        return ERR_PTR(-EFAULT);
 
                memcpy(info->name, compat_tmp.name, sizeof(info->name) - 1);
                info->num_counters = compat_tmp.num_counters;
-               user += sizeof(compat_tmp);
+               offset = sizeof(compat_tmp);
        } else
 #endif
        {
@@ -1076,10 +1076,10 @@ void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
                        return ERR_PTR(-EINVAL);
 
                len -= sizeof(*info);
-               if (copy_from_user(info, user, sizeof(*info)) != 0)
+               if (copy_from_sockptr(info, arg, sizeof(*info)) != 0)
                        return ERR_PTR(-EFAULT);
 
-               user += sizeof(*info);
+               offset = sizeof(*info);
        }
        info->name[sizeof(info->name) - 1] = '\0';
 
@@ -1093,13 +1093,13 @@ void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
        if (!mem)
                return ERR_PTR(-ENOMEM);
 
-       if (copy_from_user(mem, user, len) == 0)
+       if (copy_from_sockptr_offset(mem, arg, offset, len) == 0)
                return mem;
 
        vfree(mem);
        return ERR_PTR(-EFAULT);
 }
-EXPORT_SYMBOL_GPL(xt_copy_counters_from_user);
+EXPORT_SYMBOL_GPL(xt_copy_counters);
 
 #ifdef CONFIG_COMPAT
 int xt_compat_target_offset(const struct xt_target *target)
@@ -1572,7 +1572,7 @@ static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
                trav->curr = trav->curr->next;
                if (trav->curr != trav->head)
                        break;
-               /* fall through */
+               fallthrough;
        default:
                return NULL;
        }