Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Jul 2020 14:55:12 +0000 (UTC)
From:      Allan Jude <allanjude@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r363096 - stable/12/sbin/md5
Message-ID:  <202007111455.06BEtCru016897@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: allanjude
Date: Sat Jul 11 14:55:11 2020
New Revision: 363096
URL: https://svnweb.freebsd.org/changeset/base/363096

Log:
  MFC r346369
    Close filedescriptors when done with them.
  
  MFC r362412
    fix -c flag to work with input on stdin
  
  PR:		247295
  Sponsored by:	Klara Inc.
  Event:	July 2020 Bugathon

Modified:
  stable/12/sbin/md5/md5.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sbin/md5/md5.c
==============================================================================
--- stable/12/sbin/md5/md5.c	Sat Jul 11 13:56:36 2020	(r363095)
+++ stable/12/sbin/md5/md5.c	Sat Jul 11 14:55:11 2020	(r363096)
@@ -52,11 +52,14 @@ __FBSDID("$FreeBSD$");
 #define TEST_BLOCK_COUNT 100000
 #define MDTESTCOUNT 8
 
+static int pflag;
 static int qflag;
 static int rflag;
 static int sflag;
+static int skip;
 static char* checkAgainst;
 static int checksFailed;
+static int failed;
 
 typedef void (DIGEST_Init)(void *);
 typedef void (DIGEST_Update)(void *, const unsigned char *, size_t);
@@ -86,10 +89,10 @@ typedef struct Algorithm_t {
 } Algorithm_t;
 
 static void MD5_Update(MD5_CTX *, const unsigned char *, size_t);
-static void MDString(const Algorithm_t *, const char *);
+static void MDOutput(const Algorithm_t *, char *, char **);
 static void MDTimeTrial(const Algorithm_t *);
 static void MDTestSuite(const Algorithm_t *);
-static void MDFilter(const Algorithm_t *, int);
+static char *MDFilter(const Algorithm_t *, char*, int);
 static void usage(const Algorithm_t *);
 
 typedef union {
@@ -170,9 +173,9 @@ main(int argc, char *argv[])
 	cap_rights_t	rights;
 #endif
 	int	ch, fd;
-	char   *p;
+	char   *p, *string;
 	char	buf[HEX_DIGEST_LENGTH];
-	int	failed;
+	size_t	len;
  	unsigned	digest;
  	const char*	progname;
 
@@ -191,13 +194,14 @@ main(int argc, char *argv[])
 	failed = 0;
 	checkAgainst = NULL;
 	checksFailed = 0;
+	skip = 0;
 	while ((ch = getopt(argc, argv, "c:pqrs:tx")) != -1)
 		switch (ch) {
 		case 'c':
 			checkAgainst = optarg;
 			break;
 		case 'p':
-			MDFilter(&Algorithm[digest], 1);
+			pflag = 1;
 			break;
 		case 'q':
 			qflag = 1;
@@ -207,13 +211,15 @@ main(int argc, char *argv[])
 			break;
 		case 's':
 			sflag = 1;
-			MDString(&Algorithm[digest], optarg);
+			string = optarg;
 			break;
 		case 't':
 			MDTimeTrial(&Algorithm[digest]);
+			skip = 1;
 			break;
 		case 'x':
 			MDTestSuite(&Algorithm[digest]);
+			skip = 1;
 			break;
 		default:
 			usage(&Algorithm[digest]);
@@ -247,32 +253,21 @@ main(int argc, char *argv[])
 					err(1, "capsicum");
 #endif
 			}
-			if ((p = Algorithm[digest].Fd(fd, buf)) == NULL) {
-				warn("%s", *argv);
-				failed++;
-			} else {
-				if (qflag)
-					printf("%s", p);
-				else if (rflag)
-					printf("%s %s", p, *argv);
-				else
-					printf("%s (%s) = %s",
-					    Algorithm[digest].name, *argv, p);
-				if (checkAgainst && strcasecmp(checkAgainst, p) != 0)
-				{
-					checksFailed++;
-					if (!qflag)
-						printf(" [ Failed ]");
-				}
-				printf("\n");
-			}
+			p = Algorithm[digest].Fd(fd, buf);
+			(void)close(fd);
+			MDOutput(&Algorithm[digest], p, argv);
 		} while (*++argv);
-	} else if (!sflag && (optind == 1 || qflag || rflag)) {
+	} else if (!sflag && !skip) {
 #ifdef HAVE_CAPSICUM
 		if (caph_limit_stdin() < 0 || caph_enter() < 0)
 			err(1, "capsicum");
 #endif
-		MDFilter(&Algorithm[digest], 0);
+		p = MDFilter(&Algorithm[digest], (char *)&buf, pflag);
+		MDOutput(&Algorithm[digest], p, NULL);
+	} else if (sflag) {
+		len = strlen(string);
+		p = Algorithm[digest].Data(string, len, buf);
+		MDOutput(&Algorithm[digest], p, &string);
 	}
 
 	if (failed != 0)
@@ -282,30 +277,38 @@ main(int argc, char *argv[])
 
 	return (0);
 }
+
 /*
- * Digests a string and prints the result.
+ * Common output handling
  */
 static void
-MDString(const Algorithm_t *alg, const char *string)
+MDOutput(const Algorithm_t *alg, char *p, char *argv[])
 {
-	size_t len = strlen(string);
-	char buf[HEX_DIGEST_LENGTH];
-
-	alg->Data(string,len,buf);
-	if (qflag)
-		printf("%s", buf);
-	else if (rflag)
-		printf("%s \"%s\"", buf, string);
-	else
-		printf("%s (\"%s\") = %s", alg->name, string, buf);
-	if (checkAgainst && strcasecmp(buf,checkAgainst) != 0)
-	{
-		checksFailed++;
-		if (!qflag)
-			printf(" [ failed ]");
+	if (p == NULL) {
+		warn("%s", *argv);
+		failed++;
+	} else {
+		/*
+		 * If argv is NULL we are reading from stdin, where the output
+		 * format has always been just the hash.
+		 */
+		if (qflag || argv == NULL)
+			printf("%s", p);
+		else if (rflag)
+			printf("%s %s", p, *argv);
+		else
+			printf("%s (%s) = %s",
+			    alg->name, *argv, p);
+		if (checkAgainst && strcasecmp(checkAgainst, p) != 0)
+		{
+			checksFailed++;
+			if (!qflag)
+				printf(" [ Failed ]");
+		}
+		printf("\n");
 	}
-	printf("\n");
 }
+
 /*
  * Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks.
  */
@@ -505,13 +508,13 @@ MDTestSuite(const Algorithm_t *alg)
 /*
  * Digests the standard input and prints the result.
  */
-static void
-MDFilter(const Algorithm_t *alg, int tee)
+static char *
+MDFilter(const Algorithm_t *alg, char *buf, int tee)
 {
 	DIGEST_CTX context;
 	unsigned int len;
 	unsigned char buffer[BUFSIZ];
-	char buf[HEX_DIGEST_LENGTH];
+	char *p;
 
 	alg->Init(&context);
 	while ((len = fread(buffer, 1, BUFSIZ, stdin))) {
@@ -519,7 +522,9 @@ MDFilter(const Algorithm_t *alg, int tee)
 			err(1, "stdout");
 		alg->Update(&context, buffer, len);
 	}
-	printf("%s\n", alg->End(&context, buf));
+	p = alg->End(&context, buf);
+
+	return (p);
 }
 
 static void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007111455.06BEtCru016897>