From 4e68282e26b0c4569d25d076d54274f0da47a691 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Fri, 30 Mar 2012 19:35:51 +0100 Subject: [PATCH] venus: Make clang happy with strlcpy use clang now expects that strlcpy will always be used to prevent overflow of the destination string, and gives a warning if the size parameter is based solely on the length of the source string. Modify the BreakUpPath function so that it takes the size of the destination string as an argument, and uses this to limit the amount of data pasted into it. Change-Id: I86f68dd2013ca8bc4c88ade78d27c4d416a9ae94 Reviewed-on: http://gerrit.openafs.org/7086 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/venus/afsio.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/venus/afsio.c b/src/venus/afsio.c index eed6563..c19ca2e 100644 --- a/src/venus/afsio.c +++ b/src/venus/afsio.c @@ -80,7 +80,7 @@ static int CmdProlog(struct cmd_syndesc *, char **, char **, static int ScanFid(char *, struct AFSFid *); static afs_int32 GetVenusFidByFid(char *, char *, int, struct afscp_venusfid **); static afs_int32 GetVenusFidByPath(char *, char *, struct afscp_venusfid **); -static int BreakUpPath(char *, char *, char *); +static int BreakUpPath(char *, char *, char *, size_t); static char pnp[AFSPATHMAX]; /* filename of this program when called */ static int verbose = 0; /* Set if -verbose option given */ @@ -257,7 +257,7 @@ main(int argc, char **argv) char baseName[AFSNAMEMAX]; /* try to get only the base name of this executable for use in logs */ - if (BreakUpPath(argv[0], NULL, baseName) > 0) + if (BreakUpPath(argv[0], NULL, baseName, AFSNAMEMAX) > 0) strlcpy(pnp, baseName, AFSNAMEMAX); else strlcpy(pnp, argv[0], AFSPATHMAX); @@ -514,7 +514,7 @@ GetVenusFidByFid(char *fidString, char *cellName, int onlyRW, * 2 if both dirName and baseName were filled in */ static int -BreakUpPath(char *fullPath, char *dirName, char *baseName) +BreakUpPath(char *fullPath, char *dirName, char *baseName, size_t baseNameSize) { char *lastSlash; size_t dirNameLen = 0; @@ -541,18 +541,18 @@ BreakUpPath(char *fullPath, char *dirName, char *baseName) /* then lastSlash points to the last path separator in fullPath */ if (useDirName) { dirNameLen = strlen(fullPath) - strlen(lastSlash); - strlcpy(dirName, fullPath, dirNameLen + 1); + strlcpy(dirName, fullPath, min(dirNameLen + 1, baseNameSize)); code++; } if (useBaseName) { lastSlash++; - strlcpy(baseName, lastSlash, strlen(lastSlash) + 1); + strlcpy(baseName, lastSlash, min(strlen(lastSlash) + 1, baseNameSize)); code++; } } else { /* there are no path separators in fullPath -- it's just a baseName */ if (useBaseName) { - strlcpy(baseName, fullPath, strlen(fullPath) + 1); + strlcpy(baseName, fullPath, min(strlen(fullPath) + 1, baseNameSize)); code++; } } @@ -872,7 +872,7 @@ writeFile(struct cmd_syndesc *as, void *unused) } } if (!append && !overWrite) { /* must create a new file in this case */ - if ( BreakUpPath(fname, dirName, baseName) != 2 ) { + if ( BreakUpPath(fname, dirName, baseName, AFSNAMEMAX) != 2 ) { code = EINVAL; afs_com_err(pnp, code, "(must provide full AFS path)"); afscp_FreeFid(newvfp); -- 1.9.4