···24242525static __be32 __init parse_srvaddr(char *start, char *end)2626{2727+ /* TODO: ipv6 support */2728 char addr[sizeof("aaa.bbb.ccc.ddd")];2829 int i = 0;2930···5150 if (!s || s[1] == '\0')5251 return 1;53525353+ /* make s point to ',' or '\0' at end of line */5454 s = strchrnul(s, ',');5555+ /* len is strlen(unc) + '\0' */5556 len = s - line + 1;5656- if (len <= sizeof(root_dev)) {5757- strlcpy(root_dev, line, len);5858- srvaddr = parse_srvaddr(&line[2], s);5959- if (*s) {6060- snprintf(root_opts, sizeof(root_opts), "%s,%s",5757+ if (len > sizeof(root_dev)) {5858+ printk(KERN_ERR "Root-CIFS: UNC path too long\n");5959+ return 1;6060+ }6161+ strlcpy(root_dev, line, len);6262+ srvaddr = parse_srvaddr(&line[2], s);6363+ if (*s) {6464+ int n = snprintf(root_opts,6565+ sizeof(root_opts), "%s,%s",6166 DEFAULT_MNT_OPTS, s + 1);6767+ if (n >= sizeof(root_opts)) {6868+ printk(KERN_ERR "Root-CIFS: mount options string too long\n");6969+ root_opts[sizeof(root_opts)-1] = '\0';7070+ return 1;6271 }6372 }6473 }