tunnels: fix netns vs proto registration ordering
[safe/jmp/linux-2.6] / lib / parser.c
index 703c8c1..fb34977 100644 (file)
@@ -56,13 +56,16 @@ static int match_one(char *s, const char *p, substring_t args[])
 
                args[argc].from = s;
                switch (*p++) {
-               case 's':
-                       if (strlen(s) == 0)
+               case 's': {
+                       size_t str_len = strlen(s);
+
+                       if (str_len == 0)
                                return 0;
-                       else if (len == -1 || len > strlen(s))
-                               len = strlen(s);
+                       if (len == -1 || len > str_len)
+                               len = str_len;
                        args[argc].to = s + len;
                        break;
+               }
                case 'd':
                        simple_strtol(s, &args[argc].to, 0);
                        goto num;
@@ -100,7 +103,7 @@ static int match_one(char *s, const char *p, substring_t args[])
  * format identifiers which will be taken into account when matching the
  * tokens, and whose locations will be returned in the @args array.
  */
-int match_token(char *s, match_table_t table, substring_t args[])
+int match_token(char *s, const match_table_t table, substring_t args[])
 {
        const struct match_token *p;
 
@@ -182,18 +185,25 @@ int match_hex(substring_t *s, int *result)
 }
 
 /**
- * match_strcpy: - copies the characters from a substring_t to a string
- * @to: string to copy characters to.
- * @s: &substring_t to copy
+ * match_strlcpy: - Copy the characters from a substring_t to a sized buffer
+ * @dest: where to copy to
+ * @src: &substring_t to copy
+ * @size: size of destination buffer
  *
- * Description: Copies the set of characters represented by the given
- * &substring_t @s to the c-style string @to. Caller guarantees that @to is
- * large enough to hold the characters of @s.
+ * Description: Copy the characters in &substring_t @src to the
+ * c-style string @dest.  Copy no more than @size - 1 characters, plus
+ * the terminating NUL.  Return length of @src.
  */
-void match_strcpy(char *to, const substring_t *s)
+size_t match_strlcpy(char *dest, const substring_t *src, size_t size)
 {
-       memcpy(to, s->from, s->to - s->from);
-       to[s->to - s->from] = '\0';
+       size_t ret = src->to - src->from;
+
+       if (size) {
+               size_t len = ret >= size ? size - 1 : ret;
+               memcpy(dest, src->from, len);
+               dest[len] = '\0';
+       }
+       return ret;
 }
 
 /**
@@ -206,9 +216,10 @@ void match_strcpy(char *to, const substring_t *s)
  */
 char *match_strdup(const substring_t *s)
 {
-       char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL);
+       size_t sz = s->to - s->from + 1;
+       char *p = kmalloc(sz, GFP_KERNEL);
        if (p)
-               match_strcpy(p, s);
+               match_strlcpy(p, s, sz);
        return p;
 }
 
@@ -216,5 +227,5 @@ EXPORT_SYMBOL(match_token);
 EXPORT_SYMBOL(match_int);
 EXPORT_SYMBOL(match_octal);
 EXPORT_SYMBOL(match_hex);
-EXPORT_SYMBOL(match_strcpy);
+EXPORT_SYMBOL(match_strlcpy);
 EXPORT_SYMBOL(match_strdup);