Subject: [PATCH] use xmemdupz() to allocate copies of strings given by start and length

From: René Scharfe <[email-masked]>
Date: Sat, 19 Jul 2014 17:35:34 +0200

Use xmemdupz() to allocate the memory, copy the data and make sure to
NUL-terminate the result, all in one step.  The resulting code is
shorter, doesn't contain the constants 1 and '\0', and avoids
duplicating function parameters.

For blame, the last copied byte (o->file.ptr[o->file.size]) is always
set to NUL by fake_working_tree_commit() or read_sha1_file(), so no
information is lost by the conversion to using xmemdupz().

Signed-off-by: Rene Scharfe <[email-masked]>
---
 builtin/apply.c     | 4 +---
 builtin/blame.c     | 5 +----
 connect.c           | 4 +---
 http-backend.c      | 4 +---
 path.c              | 4 +---
 sh-i18n--envsubst.c | 4 +---
 6 files changed, 6 insertions(+), 19 deletions(-)

diff --git a/builtin/apply.c b/builtin/apply.c
index 5fd099e..9f8f5ba 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -2867,9 +2867,7 @@ static int apply_binary_fragment(struct image *img, struct patch *patch)
 	case BINARY_LITERAL_DEFLATED:
 		clear_image(img);
 		img->len = fragment->size;
-		img->buf = xmalloc(img->len+1);
-		memcpy(img->buf, fragment->patch, img->len);
-		img->buf[img->len] = '\0';
+		img->buf = xmemdupz(fragment->patch, img->len);
 		return 0;
 	}
 	return -1;
diff --git a/builtin/blame.c b/builtin/blame.c
index c59e702..32ce05f 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -2707,11 +2707,8 @@ parse_done:
 		die("revision walk setup failed");
 
 	if (is_null_sha1(sb.final->object.sha1)) {
-		char *buf;
 		o = sb.final->util;
-		buf = xmalloc(o->file.size + 1);
-		memcpy(buf, o->file.ptr, o->file.size + 1);
-		sb.final_buf = buf;
+		sb.final_buf = xmemdupz(o->file.ptr, o->file.size);
 		sb.final_buf_size = o->file.size;
 	}
 	else {
diff --git a/connect.c b/connect.c
index 37ff018..5047402 100644
--- a/connect.c
+++ b/connect.c
@@ -64,9 +64,7 @@ static void parse_one_symref_info(struct string_list *symref, const char *val, i
 	if (!len)
 		return; /* just "symref" */
 	/* e.g. "symref=HEAD:refs/heads/master" */
-	sym = xmalloc(len + 1);
-	memcpy(sym, val, len);
-	sym[len] = '\0';
+	sym = xmemdupz(val, len);
 	target = strchr(sym, ':');
 	if (!target)
 		/* just "symref=something" */
diff --git a/http-backend.c b/http-backend.c
index 57290d9..80790bb 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -610,9 +610,7 @@ int main(int argc, char **argv)
 
 			cmd = c;
 			n = out[0].rm_eo - out[0].rm_so;
-			cmd_arg = xmalloc(n);
-			memcpy(cmd_arg, dir + out[0].rm_so + 1, n-1);
-			cmd_arg[n-1] = '\0';
+			cmd_arg = xmemdupz(dir + out[0].rm_so + 1, n - 1);
 			dir[out[0].rm_so] = 0;
 			break;
 		}
diff --git a/path.c b/path.c
index bc804a3..25c3b8b 100644
--- a/path.c
+++ b/path.c
@@ -249,9 +249,7 @@ int validate_headref(const char *path)
 static struct passwd *getpw_str(const char *username, size_t len)
 {
 	struct passwd *pw;
-	char *username_z = xmalloc(len + 1);
-	memcpy(username_z, username, len);
-	username_z[len] = '\0';
+	char *username_z = xmemdupz(username, len);
 	pw = getpwnam(username_z);
 	free(username_z);
 	return pw;
diff --git a/sh-i18n--envsubst.c b/sh-i18n--envsubst.c
index 855d28c..6dd03a9 100644
--- a/sh-i18n--envsubst.c
+++ b/sh-i18n--envsubst.c
@@ -278,9 +278,7 @@ static string_list_ty variables_set;
 static void
 note_variable (const char *var_ptr, size_t var_len)
 {
-  char *string = xmalloc (var_len + 1);
-  memcpy (string, var_ptr, var_len);
-  string[var_len] = '\0';
+  char *string = xmemdupz (var_ptr, var_len);
 
   string_list_append (&variables_set, string);
 }
-- 
2.0.2