[lxc-devel] [PATCH lxcfs 5/5] cgfs: improve read_file and append_line

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Jan 7 11:59:55 UTC 2016


getline() returns the length which can be passed to
append_line to avoid a strlen() call.

Additionally with the length already known memcpy() can be
used instead of strcpy(). A +1 to the length will include
the terminating null byte as it is included in getline(3)'s
output.

Signed-off-by: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
 cgfs.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/cgfs.c b/cgfs.c
index 681a478..ec0f630 100644
--- a/cgfs.c
+++ b/cgfs.c
@@ -90,11 +90,11 @@ static void dorealloc(char **mem, size_t oldlen, size_t newlen)
 		*mem = tmp;
 	}
 }
-static void append_line(char **contents, char *line, size_t *len)
+static void append_line(char **contents, size_t *len, char *line, ssize_t linelen)
 {
-	size_t newlen = *len + strlen(line);
+	size_t newlen = *len + linelen;
 	dorealloc(contents, *len, newlen + 1);
-	strcpy(*contents + *len, line);
+	memcpy(*contents + *len, line, linelen+1);
 	*len = newlen;
 }
 
@@ -104,12 +104,13 @@ static char *read_file(const char *from)
 	char *contents = NULL;
 	FILE *f = fopen(from, "r");
 	size_t len = 0, fulllen = 0;
+	ssize_t linelen;
 
 	if (!f)
 		return NULL;
 
-	while (getline(&line, &len, f) != -1) {
-		append_line(&contents, line, &fulllen);
+	while ((linelen = getline(&line, &len, f)) != -1) {
+		append_line(&contents, &fulllen, line, linelen);
 	}
 	fclose(f);
 
-- 
2.1.4




More information about the lxc-devel mailing list