[PATCH 2/5] cifs.upcall: clean up key description decoding routine

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



...and switch the code to using strndup. Check for allocation errors as
well, and fix some off-by-one bugs in the ones that decode strings.

Signed-off-by: Jeff Layton <jlayton@xxxxxxxxx>
---
 cifs.upcall.c |   30 ++++++++++++++++--------------
 1 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/cifs.upcall.c b/cifs.upcall.c
index 33b7e4c..d83dddf 100644
--- a/cifs.upcall.c
+++ b/cifs.upcall.c
@@ -473,10 +473,13 @@ decode_key_description(const char *desc, struct decoded_args *arg)
 			else
 				len = pos - tkn;
 
-			len -= 4;
+			len -= 5;
 			SAFE_FREE(arg->hostname);
-			arg->hostname = calloc(sizeof(char), len);
-			strlcpy(arg->hostname, tkn + 5, len);
+			arg->hostname = strndup(tkn + 5, len);
+			if (arg->hostname == NULL) {
+				syslog(LOG_ERR, "Unable to allocate memory");
+				return 1;
+			}
 			retval |= DKD_HAVE_HOSTNAME;
 		} else if (!strncmp(tkn, "ip4=", 4) || !strncmp(tkn, "ip6=", 4)) {
 			if (pos == NULL)
@@ -484,10 +487,13 @@ decode_key_description(const char *desc, struct decoded_args *arg)
 			else
 				len = pos - tkn;
 
-			len -= 3;
+			len -= 4;
 			SAFE_FREE(arg->ip);
-			arg->ip = calloc(sizeof(char), len);
-			strlcpy(arg->ip, tkn + 4, len);
+			arg->ip = strndup(tkn + 4, len);
+			if (arg->ip == NULL) {
+				syslog(LOG_ERR, "Unable to allocate memory");
+				return 1;
+			}
 			retval |= DKD_HAVE_IP;
 		} else if (strncmp(tkn, "pid=", 4) == 0) {
 			errno = 0;
@@ -496,9 +502,8 @@ decode_key_description(const char *desc, struct decoded_args *arg)
 				syslog(LOG_ERR, "Invalid pid format: %s",
 				       strerror(errno));
 				return 1;
-			} else {
-				retval |= DKD_HAVE_PID;
 			}
+			retval |= DKD_HAVE_PID;
 		} else if (strncmp(tkn, "sec=", 4) == 0) {
 			if (strncmp(tkn + 4, "krb5", 4) == 0) {
 				retval |= DKD_HAVE_SEC;
@@ -514,9 +519,8 @@ decode_key_description(const char *desc, struct decoded_args *arg)
 				syslog(LOG_ERR, "Invalid uid format: %s",
 				       strerror(errno));
 				return 1;
-			} else {
-				retval |= DKD_HAVE_UID;
 			}
+			retval |= DKD_HAVE_UID;
 		} else if (strncmp(tkn, "creduid=", 8) == 0) {
 			errno = 0;
 			arg->creduid = strtol(tkn + 8, NULL, 16);
@@ -524,9 +528,8 @@ decode_key_description(const char *desc, struct decoded_args *arg)
 				syslog(LOG_ERR, "Invalid creduid format: %s",
 				       strerror(errno));
 				return 1;
-			} else {
-				retval |= DKD_HAVE_CREDUID;
 			}
+			retval |= DKD_HAVE_CREDUID;
 		} else if (strncmp(tkn, "ver=", 4) == 0) {	/* if version */
 			errno = 0;
 			arg->ver = strtol(tkn + 4, NULL, 16);
@@ -534,9 +537,8 @@ decode_key_description(const char *desc, struct decoded_args *arg)
 				syslog(LOG_ERR, "Invalid version format: %s",
 				       strerror(errno));
 				return 1;
-			} else {
-				retval |= DKD_HAVE_VERSION;
 			}
+			retval |= DKD_HAVE_VERSION;
 		}
 		if (pos == NULL)
 			break;
-- 
1.7.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux