svn commit: r345431 - head/contrib/elftoolchain/strings

Mariusz Zaborski oshogbo at FreeBSD.org
Sat Mar 23 02:17:09 UTC 2019


Author: oshogbo
Date: Sat Mar 23 02:17:07 2019
New Revision: 345431
URL: https://svnweb.freebsd.org/changeset/base/345431

Log:
  strings: return an error code and the char value separately
  
  If we returning 32 bits value it's hard to distinguish if the returned value
  is a valid one or if its an error (in case of EOF). For that reason separate
  exit code of the function from the returned character.
  
  Reported by:	cem, se

Modified:
  head/contrib/elftoolchain/strings/strings.c

Modified: head/contrib/elftoolchain/strings/strings.c
==============================================================================
--- head/contrib/elftoolchain/strings/strings.c	Sat Mar 23 01:07:51 2019	(r345430)
+++ head/contrib/elftoolchain/strings/strings.c	Sat Mar 23 02:17:07 2019	(r345431)
@@ -84,7 +84,7 @@ static struct option strings_longopts[] = {
 	{ NULL, 0, NULL, 0 }
 };
 
-long	getcharacter(FILE *);
+int	getcharacter(FILE *, long *);
 int	handle_file(const char *);
 int	handle_elf(const char *, FILE *);
 int	handle_binary(const char *, FILE *, size_t);
@@ -291,42 +291,43 @@ handle_elf(const char *name, FILE *pfile)
  * Retrieves a character from input stream based on the encoding
  * type requested.
  */
-long
-getcharacter(FILE *pfile)
+int
+getcharacter(FILE *pfile, long *rt)
 {
-	long rt;
 	int i, c;
 	char buf[4];
 
 	for(i = 0; i < encoding_size; i++) {
 		c = getc(pfile);
 		if (c == EOF)
-			return (EOF);
+			return (-1);
 		buf[i] = c;
 	}
 
-	rt = EOF;
 	switch (encoding) {
 	case ENCODING_7BIT:
 	case ENCODING_8BIT:
-		rt = buf[0];
+		*rt = buf[0];
 		break;
 	case ENCODING_16BIT_BIG:
-		rt = (buf[0] << 8) | buf[1];
+		*rt = (buf[0] << 8) | buf[1];
 		break;
 	case ENCODING_16BIT_LITTLE:
-		 rt = buf[0] | (buf[1] << 8);
-		 break;
+		*rt = buf[0] | (buf[1] << 8);
+		break;
 	case ENCODING_32BIT_BIG:
-		rt = ((long) buf[0] << 24) | ((long) buf[1] << 16) |
+		*rt = ((long) buf[0] << 24) | ((long) buf[1] << 16) |
 		    ((long) buf[2] << 8) | buf[3];
 		break;
 	case ENCODING_32BIT_LITTLE:
-		rt = buf[0] | ((long) buf[1] << 8) | ((long) buf[2] << 16) |
+		*rt = buf[0] | ((long) buf[1] << 8) | ((long) buf[2] << 16) |
 		    ((long) buf[3] << 24);
 		break;
+	default:
+		return (-1);
 	}
-	return (rt);
+
+	return (0);
 }
 
 /*
@@ -357,8 +358,7 @@ find_strings(const char *name, FILE *pfile, off_t offs
 		start_off = cur_off;
 		memset(obuf, 0, min_len + 1);
 		for(i = 0; i < min_len; i++) {
-			c = getcharacter(pfile);
-			if (c == EOF)
+			if (getcharacter(pfile, &c) < 0)
 				goto _exit1;
 			if (PRINTABLE(c)) {
 				obuf[i] = c;
@@ -400,15 +400,16 @@ find_strings(const char *name, FILE *pfile, off_t offs
 				if ((offset + size) &&
 				    (cur_off >= offset + size))
 					break;
-				c = getcharacter(pfile);
-				cur_off += encoding_size;
-				if (!PRINTABLE(c) || c == EOF)
+				if (getcharacter(pfile, &c) < 0)
 					break;
+				cur_off += encoding_size;
 				if (encoding == ENCODING_8BIT &&
 				    (uint8_t)c > 127) {
 					putchar(c);
 					continue;
 				}
+				if (!PRINTABLE(c))
+					break;
 				putchar(c);
 			}
 			putchar('\n');


More information about the svn-src-all mailing list