Print this page
NEX-9323 cfgadm FC plugin allocates insufficient memory for internal
buffers
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
@@ -18,16 +18,18 @@
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#include <libgen.h>
+#include <limits.h>
#include "cfga_fp.h"
/* The following are used by update_fabric_wwn_list() */
#define COPY_EXT ".cpy." /* Extn used in naming backup file */
#define TMP_EXT ".tmp." /* Extn used in naming temp file */
@@ -220,10 +222,11 @@
update_fabric_wwn_list(int cmd, const char *update_str, char **errstring)
{
int fd, copy_fd, tmp_fd, new_file_flag = 0;
int len, write_offset, bytes_left;
int sizeof_rep_hdr = strlen(HDR);
+ int pid_maxlen = snprintf(NULL, 0, "%d", PID_MAX) + 1;
char *repbuf, *c_repbuf, *t_repbuf;
char *copy_rep, *tmp_rep, *upd_str;
off_t filesize, size;
struct stat stbuf;
@@ -301,11 +304,11 @@
strcat(upd_str, "\n"); /* Append a new line char */
len = strlen(upd_str);
if (filesize > 0) {
if ((copy_rep = (char *)calloc(1, strlen(FAB_REPOSITORY) +
- sizeof (COPY_EXT) + sizeof (pid_t))) == NULL) {
+ sizeof (COPY_EXT) + pid_maxlen)) == NULL) {
cfga_err(errstring, errno, ERR_UPD_REP, 0);
CLEANUP_N_RET(FPCFGA_LIB_ERR);
}
(void) sprintf(copy_rep, "%s%s%ld", FAB_REPOSITORY, COPY_EXT,
@@ -428,11 +431,11 @@
CLEANUP_N_RET(FPCFGA_OK); /* SUCCESS */
}
/* construct temp file name using pid. */
if ((tmp_rep = (char *)calloc(1, strlen(FAB_REPOSITORY) +
- sizeof (TMP_EXT) + sizeof (pid_t))) == NULL) {
+ sizeof (TMP_EXT) + pid_maxlen)) == NULL) {
cfga_err(errstring, errno, ERR_UPD_REP, 0);
CLEANUP_N_RET(FPCFGA_LIB_ERR);
}
(void) sprintf(tmp_rep, "%s%s%ld", FAB_REPOSITORY,
@@ -523,11 +526,11 @@
CLEANUP_N_RET(FPCFGA_OK); /* SUCCESS */
}
/* construct temp file name using pid. */
if ((tmp_rep = (char *)calloc(1, strlen(FAB_REPOSITORY) +
- sizeof (TMP_EXT) + sizeof (pid_t))) == NULL) {
+ sizeof (TMP_EXT) + pid_maxlen)) == NULL) {
cfga_err(errstring, errno, ERR_UPD_REP, 0);
CLEANUP_N_RET(FPCFGA_LIB_ERR);
}
(void) sprintf(tmp_rep, "%s%s%ld", FAB_REPOSITORY,