diff options
author | Kaleb S KEITHLEY <kkeithle@redhat.com> | 2016-03-06 08:32:52 -0500 |
---|---|---|
committer | Jeff Darcy <jdarcy@redhat.com> | 2016-03-07 05:18:29 -0800 |
commit | 9c3fc4344a11f2b6d0a7906d45bc7a684d756839 (patch) | |
tree | 48cff7e56c43f210d03c88b4979dc5bbd6cf75a5 /xlators/mgmt | |
parent | 6860968c3adaf2e8c3cb51124bbdfccef74beeb9 (diff) |
ganesha: coverity fix in glusterd-ganesha.c
CID 1351698
Allocating buffer of size stat.st_size) to read lines from the file
without an overrrun feels like a bit of a hack. While it's extremely
unlikely that the file would ever be more than a thousand bytes long,
a) we don't want to use bad patterns (and set bad examples or
precedents for elsewhere in the source), and b) what if somehow the
file did become "large." We just don't want to ever risk allocating
huge amounts of memory by accident.
And all the superfluous logic to copy the resulting string? We have
gf_strdup() for that.
And a clean coverity. See following gerrit review comments for the URL.
Change-Id: I5860d6995d0eed06667fd2369df6be53ccff6ceb
Signed-off-by: Kaleb S KEITHLEY <kkeithle@redhat.com>
Reviewed-on: http://review.gluster.org/13614
Smoke: Gluster Build System <jenkins@build.gluster.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Diffstat (limited to 'xlators/mgmt')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-ganesha.c | 35 |
1 files changed, 7 insertions, 28 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-ganesha.c b/xlators/mgmt/glusterd/src/glusterd-ganesha.c index de1c33df5bf..3f1b72c9262 100644 --- a/xlators/mgmt/glusterd/src/glusterd-ganesha.c +++ b/xlators/mgmt/glusterd/src/glusterd-ganesha.c @@ -38,7 +38,9 @@ typedef struct service_command { * return NULL if error or not found */ static char* parsing_ganesha_ha_conf(const char *key) { - char *line, *value = NULL, *pointer, *end_pointer; +#define MAX_LINE 1024 + char scratch[MAX_LINE * 2] = {0,}; + char *value = NULL, *pointer = NULL, *end_pointer = NULL; FILE *fp; struct stat st = {0,}; @@ -49,29 +51,15 @@ parsing_ganesha_ha_conf(const char *key) { GANESHA_HA_CONF); goto end_ret; } - if (sys_fstat (fileno (fp), &st)) { - gf_msg (THIS->name, GF_LOG_ERROR, errno, - GD_MSG_FILE_OP_FAILED, "stat on opened file %s failed", - GANESHA_HA_CONF); - goto end_close; - } - line = GF_CALLOC (sizeof (char), st.st_size + 1, gf_common_mt_char); - if (line == NULL) { - gf_msg (THIS->name, GF_LOG_ERROR, errno, - GD_MSG_NO_MEMORY, "alloc for reading file failed"); - goto end_close; - } - - while (fgets (line, st.st_size, fp) != NULL) { + while ((pointer = fgets (scratch, MAX_LINE, fp)) != NULL) { /* Read config file until we get matching "^[[:space:]]*key" */ - pointer = line; if (*pointer == '#') { continue; } while (isblank(*pointer)) { pointer++; } - if (strncmp (pointer, key, strlen(key))) { + if (strncmp (pointer, key, strlen (key))) { continue; } pointer += strlen (key); @@ -84,7 +72,7 @@ parsing_ganesha_ha_conf(const char *key) { GD_MSG_GET_CONFIG_INFO_FAILED, "Parsing %s failed at key %s", GANESHA_HA_CONF, key); - goto end_free; + goto end_close; } pointer++; /* jump the '=' */ @@ -101,19 +89,10 @@ parsing_ganesha_ha_conf(const char *key) { *end_pointer = '\0'; /* got it. copy it and return */ - value = GF_CALLOC (sizeof (char), strlen (pointer)+1, - gf_common_mt_char); - if (value == NULL) { - gf_msg (THIS->name, GF_LOG_ERROR, errno, - GD_MSG_NO_MEMORY, "alloc for value failed"); - goto end_free; - } - strcpy (value, pointer); + value = gf_strdup (pointer); break; } -end_free: - GF_FREE(line); end_close: fclose(fp); end_ret: |