Print this page
574 Minor issues in usr/src/cmd/format/startup.c
@@ -17,10 +17,12 @@
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
+ * Copyright (c) 2012 Nexenta System Inc.
+ *
* Copyright (c) 2011 Gary Mills
*
* Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
*/
@@ -2960,32 +2962,27 @@
/*
* This Function checks if the non-conventional name is a a link to
* one of the conventional whole disk name.
*/
static int
-name_represents_wholedisk(name)
-char *name;
+name_represents_wholedisk(char *name)
{
char symname[MAXPATHLEN];
char localname[MAXPATHLEN];
char *nameptr;
+ ssize_t symname_size;
+ size_t disk_prefix_len = strlen(DISK_PREFIX);
+ if (strlcpy(localname, name, MAXPATHLEN) >= MAXPATHLEN)
+ return (1); /* buffer overflow, reject this name */
- (void) memset(symname, 0, MAXPATHLEN);
- (void) memset(localname, 0, MAXPATHLEN);
- (void) strcpy(localname, name);
-
- while (readlink(localname, symname, MAXPATHLEN) != -1) {
+ while ((symname_size = readlink(localname, symname, MAXPATHLEN - 1)) != -1) {
+ symname[symname_size] = '\0';
nameptr = symname;
- if (strncmp(symname, DISK_PREFIX, strlen(DISK_PREFIX)) == 0)
- nameptr += strlen(DISK_PREFIX);
- if (conventional_name(nameptr)) {
- if (whole_disk_name(nameptr))
- return (0);
- else
- return (1);
- }
+ if (strncmp(symname, DISK_PREFIX, disk_prefix_len) == 0)
+ nameptr += disk_prefix_len;
+ if (conventional_name(nameptr))
+ return (!whole_disk_name(nameptr));
(void) strcpy(localname, symname);
- (void) memset(symname, 0, MAXPATHLEN);
}
return (0);
}