[PATCH] lsmmc: rework string trimming

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

 



gcc8 complains with:

lsmmc.c: In function 'read_file':
lsmmc.c:356:3: error: 'strncpy' accessing 4096 bytes at \
  offsets 0 and 1 overlaps 4095 bytes at offset 1 [-Werror=restrict]
   strncpy(&line[0], &line[1], sizeof(line));
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The man page for strncpy() does not clearly state whether it's safe to
use overlapping memory regions while copying; for the similar strcpy()
this is prohibited, so I would also assume this for strncpy().

So let's refactor this part.

Reported-by: Simon Tretter
Signed-off-by: Michael Heimpold <mhei@xxxxxxxxxxx>
---
 lsmmc.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/lsmmc.c b/lsmmc.c
index c4faa00..d352e74 100644
--- a/lsmmc.c
+++ b/lsmmc.c
@@ -316,8 +316,9 @@ int parse_ids(struct config *config)
 /* MMC/SD file parsing functions */
 char *read_file(char *name)
 {
-	char *preparsed;
+	char *start, *end;
 	char line[4096];
+	int len;
 	FILE *f;
 
 	f = fopen(name, "r");
@@ -326,8 +327,8 @@ char *read_file(char *name)
 		return NULL;
 	}
 
-	preparsed = fgets(line, sizeof(line), f);
-	if (!preparsed) {
+	start = fgets(line, sizeof(line), f);
+	if (!start) {
 		if (ferror(f))
 			fprintf(stderr, "Could not read MMC/SD file '%s'.\n",
 				name);
@@ -347,15 +348,19 @@ char *read_file(char *name)
 		return NULL;
 	}
 
-	line[sizeof(line) - 1] = '\0';
+	/* skip leading white-space */
+	while (isspace(*start))
+		start++;
 
-	while (isspace(line[strlen(line) - 1]))
-		line[strlen(line) - 1] = '\0';
-
-	while (isspace(line[0]))
-		strncpy(&line[0], &line[1], sizeof(line));
+	/* trim trailing white-space */
+	len = strlen(start);
+	if (len) {
+		end = &start[len - 1];
+		while (isspace(*end))
+			*end-- = '\0';
+	}
 
-	return strdup(line);
+	return strdup(start);
 }
 
 /* Hexadecimal string parsing functions */
-- 
2.17.1




[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux