fence: master - libfence: replace strcat
David Teigland
teigland at fedoraproject.org
Mon Oct 12 19:24:10 UTC 2009
Gitweb: http://git.fedorahosted.org/git/fence.git?p=fence.git;a=commitdiff;h=10fe5cff7b048244d2f362d8b890176e43916db3
Commit: 10fe5cff7b048244d2f362d8b890176e43916db3
Parent: d3d58caa28d779c76b6034a5d2abfe6d6ab368dd
Author: David Teigland <teigland at redhat.com>
AuthorDate: Mon Oct 12 14:19:23 2009 -0500
Committer: David Teigland <teigland at redhat.com>
CommitterDate: Mon Oct 12 14:23:58 2009 -0500
libfence: replace strcat
with snprintf which is just better and safer all around.
Signed-off-by: David Teigland <teigland at redhat.com>
---
fence/libfence/agent.c | 76 ++++++++++++++++++++++++++++++++++++-----------
1 files changed, 58 insertions(+), 18 deletions(-)
diff --git a/fence/libfence/agent.c b/fence/libfence/agent.c
index adf12b1..deb378f 100644
--- a/fence/libfence/agent.c
+++ b/fence/libfence/agent.c
@@ -115,15 +115,19 @@ static int run_agent(char *agent, char *args, int *agent_result)
static int make_args(int cd, char *victim, char *method, int d,
char *device, char **args_out)
{
- char path[PATH_MAX], arg[PATH_MAX];
+ char path[PATH_MAX];
char *args, *str;
- int error, cnt = 0;
+ int error, ret, cnt = 0;
+ size_t len, pos;
args = malloc(FENCE_AGENT_ARGS_MAX);
if (!args)
return -ENOMEM;
memset(args, 0, FENCE_AGENT_ARGS_MAX);
+ len = FENCE_AGENT_ARGS_MAX - 1;
+ pos = 0;
+
/* node-specific args for victim */
memset(path, 0, PATH_MAX);
@@ -140,17 +144,26 @@ static int make_args(int cd, char *victim, char *method, int d,
continue;
}
- strcat(args, str);
- strcat(args, "\n");
+ ret = snprintf(args + pos, len - pos, "%s\n", str);
+
free(str);
+
+ if (ret >= len - pos) {
+ error = -E2BIG;
+ goto out;
+ }
+ pos += ret;
}
/* add nodename of victim to args */
if (!strstr(args, "nodename=")) {
- memset(arg, 0, PATH_MAX);
- snprintf(arg, PATH_MAX, "nodename=%s\n", victim);
- strcat(args, arg);
+ ret = snprintf(args + pos, len - pos, "nodename=%s\n", victim);
+ if (ret >= len - pos) {
+ error = -E2BIG;
+ goto out;
+ }
+ pos += ret;
}
/* device-specific args */
@@ -169,13 +182,20 @@ static int make_args(int cd, char *victim, char *method, int d,
continue;
}
- strcat(args, str);
- strcat(args, "\n");
+ ret = snprintf(args + pos, len - pos, "%s\n", str);
+
free(str);
+
+ if (ret >= len - pos) {
+ error = -E2BIG;
+ goto out;
+ }
+ pos += ret;
}
if (cnt)
error = 0;
+ out:
if (error) {
free(args);
args = NULL;
@@ -414,15 +434,19 @@ int fence_node(char *victim, struct fence_log *log, int log_size,
static int make_args_unfence(int cd, char *victim, int d,
char *device, char **args_out)
{
- char path[PATH_MAX], arg[PATH_MAX];
+ char path[PATH_MAX];
char *args, *str;
- int error, cnt = 0;
+ int error, ret, cnt = 0;
+ size_t len, pos;
args = malloc(FENCE_AGENT_ARGS_MAX);
if (!args)
return -ENOMEM;
memset(args, 0, FENCE_AGENT_ARGS_MAX);
+ len = FENCE_AGENT_ARGS_MAX - 1;
+ pos = 0;
+
/* node-specific args for victim */
memset(path, 0, PATH_MAX);
@@ -439,17 +463,26 @@ static int make_args_unfence(int cd, char *victim, int d,
continue;
}
- strcat(args, str);
- strcat(args, "\n");
+ ret = snprintf(args + pos, len - pos, "%s\n", str);
+
free(str);
+
+ if (ret >= len - pos) {
+ error = -E2BIG;
+ goto out;
+ }
+ pos += ret;
}
/* add nodename of victim to args */
if (!strstr(args, "nodename=")) {
- memset(arg, 0, PATH_MAX);
- snprintf(arg, PATH_MAX, "nodename=%s\n", victim);
- strcat(args, arg);
+ ret = snprintf(args + pos, len - pos, "nodename=%s\n", victim);
+ if (ret >= len - pos) {
+ error = -E2BIG;
+ goto out;
+ }
+ pos += ret;
}
/* device-specific args */
@@ -468,13 +501,20 @@ static int make_args_unfence(int cd, char *victim, int d,
continue;
}
- strcat(args, str);
- strcat(args, "\n");
+ ret = snprintf(args + pos, len - pos, "%s\n", str);
+
free(str);
+
+ if (ret >= len - pos) {
+ error = -E2BIG;
+ goto out;
+ }
+ pos += ret;
}
if (cnt)
error = 0;
+ out:
if (error) {
free(args);
args = NULL;
More information about the cluster-commits
mailing list