|
@@ -2567,6 +2567,65 @@ int proc_dointvec_minmax(struct ctl_table *table, int write,
|
|
|
do_proc_dointvec_minmax_conv, ¶m);
|
|
|
}
|
|
|
|
|
|
+struct do_proc_douintvec_minmax_conv_param {
|
|
|
+ unsigned int *min;
|
|
|
+ unsigned int *max;
|
|
|
+};
|
|
|
+
|
|
|
+static int do_proc_douintvec_minmax_conv(unsigned long *lvalp,
|
|
|
+ unsigned int *valp,
|
|
|
+ int write, void *data)
|
|
|
+{
|
|
|
+ struct do_proc_douintvec_minmax_conv_param *param = data;
|
|
|
+
|
|
|
+ if (write) {
|
|
|
+ unsigned int val = *lvalp;
|
|
|
+
|
|
|
+ if ((param->min && *param->min > val) ||
|
|
|
+ (param->max && *param->max < val))
|
|
|
+ return -ERANGE;
|
|
|
+
|
|
|
+ if (*lvalp > UINT_MAX)
|
|
|
+ return -EINVAL;
|
|
|
+ *valp = val;
|
|
|
+ } else {
|
|
|
+ unsigned int val = *valp;
|
|
|
+ *lvalp = (unsigned long) val;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * proc_douintvec_minmax - read a vector of unsigned ints with min/max values
|
|
|
+ * @table: the sysctl table
|
|
|
+ * @write: %TRUE if this is a write to the sysctl file
|
|
|
+ * @buffer: the user buffer
|
|
|
+ * @lenp: the size of the user buffer
|
|
|
+ * @ppos: file position
|
|
|
+ *
|
|
|
+ * Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer
|
|
|
+ * values from/to the user buffer, treated as an ASCII string. Negative
|
|
|
+ * strings are not allowed.
|
|
|
+ *
|
|
|
+ * This routine will ensure the values are within the range specified by
|
|
|
+ * table->extra1 (min) and table->extra2 (max). There is a final sanity
|
|
|
+ * check for UINT_MAX to avoid having to support wrap around uses from
|
|
|
+ * userspace.
|
|
|
+ *
|
|
|
+ * Returns 0 on success.
|
|
|
+ */
|
|
|
+int proc_douintvec_minmax(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+{
|
|
|
+ struct do_proc_douintvec_minmax_conv_param param = {
|
|
|
+ .min = (unsigned int *) table->extra1,
|
|
|
+ .max = (unsigned int *) table->extra2,
|
|
|
+ };
|
|
|
+ return do_proc_douintvec(table, write, buffer, lenp, ppos,
|
|
|
+ do_proc_douintvec_minmax_conv, ¶m);
|
|
|
+}
|
|
|
+
|
|
|
static void validate_coredump_safety(void)
|
|
|
{
|
|
|
#ifdef CONFIG_COREDUMP
|
|
@@ -3066,6 +3125,12 @@ int proc_dointvec_minmax(struct ctl_table *table, int write,
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
+int proc_douintvec_minmax(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+{
|
|
|
+ return -ENOSYS;
|
|
|
+}
|
|
|
+
|
|
|
int proc_dointvec_jiffies(struct ctl_table *table, int write,
|
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
@@ -3108,6 +3173,7 @@ EXPORT_SYMBOL(proc_dointvec);
|
|
|
EXPORT_SYMBOL(proc_douintvec);
|
|
|
EXPORT_SYMBOL(proc_dointvec_jiffies);
|
|
|
EXPORT_SYMBOL(proc_dointvec_minmax);
|
|
|
+EXPORT_SYMBOL_GPL(proc_douintvec_minmax);
|
|
|
EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
|
|
|
EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
|
|
|
EXPORT_SYMBOL(proc_dostring);
|