parse.c (uuid_parse): Fix uuid parsing bug which didn't complain
	for certain types of invalid input text.  (Addresses
	Debian bug #152891).

tst_uuid.c: Add test cases for invalid text strings passed to
	uuid_parse.

diff --git a/lib/uuid/ChangeLog b/lib/uuid/ChangeLog
index 42b91d8..3030246 100644
--- a/lib/uuid/ChangeLog
+++ b/lib/uuid/ChangeLog
@@ -1,3 +1,12 @@
+2002-07-15  Theodore Ts'o  <tytso@mit.edu>
+
+	* parse.c (uuid_parse): Fix uuid parsing bug which didn't complain
+		for certain types of invalid input text.  (Addresses
+		Debian bug #152891).
+
+	* tst_uuid.c: Add test cases for invalid text strings passed to
+		uuid_parse.
+
 2002-03-08  Theodore Tso  <tytso@mit.edu>
 
 	* Release of E2fsprogs 1.27
diff --git a/lib/uuid/Makefile.in b/lib/uuid/Makefile.in
index 2c20e89..5f2d423 100644
--- a/lib/uuid/Makefile.in
+++ b/lib/uuid/Makefile.in
@@ -88,7 +88,7 @@
 	$(CC) $(ALL_CFLAGS) -c $(srcdir)/tst_uuid.c -o tst_uuid.o
 
 tst_uuid: tst_uuid.o $(DEPLIBUUID)
-	$(CC) $(ALL_LDFLAGS) -o tst_uuid tst_uuid.o $(LIBUUID)
+	$(CC) $(ALL_LDFLAGS) -o tst_uuid tst_uuid.o $(OBJS)
 
 uuid_time: $(srcdir)/uuid_time.c $(DEPLIBUUID)
 	$(CC) $(ALL_CFLAGS) -DDEBUG -o uuid_time $(srcdir)/uuid_time.c \
diff --git a/lib/uuid/parse.c b/lib/uuid/parse.c
index 13d5297..f97f13e 100644
--- a/lib/uuid/parse.c
+++ b/lib/uuid/parse.c
@@ -27,9 +27,12 @@
 		return -1;
 	for (i=0, cp = in; i <= 36; i++,cp++) {
 		if ((i == 8) || (i == 13) || (i == 18) ||
-		    (i == 23))
+		    (i == 23)) {
 			if (*cp == '-')
 				continue;
+			else
+				return -1;
+		}
 		if (i== 36)
 			if (*cp == 0)
 				continue;
diff --git a/lib/uuid/tst_uuid.c b/lib/uuid/tst_uuid.c
index 1785c88..f1f56f1 100644
--- a/lib/uuid/tst_uuid.c
+++ b/lib/uuid/tst_uuid.c
@@ -13,6 +13,23 @@
 
 #include "uuid.h"
 
+static int test_uuid(const char * uuid, int isValid)
+{
+	static const char * validStr[2] = {"invalid", "valid"};
+	uuid_t uuidBits;
+	int parsedOk;
+
+	parsedOk = uuid_parse(uuid, uuidBits) == 0;
+	
+	printf("%s is %s", uuid, validStr[isValid]);
+	if (parsedOk != isValid) {
+		printf(" but uuid_parse says %s\n", validStr[parsedOk]);
+		return 1;
+	}
+	printf(", OK\n");
+	return 0;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -107,6 +124,18 @@
 		printf("UUID copy and compare failed!\n");
 		failed++;
 	}
+	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981b", 1);
+	failed += test_uuid("84949CC5-4701-4A84-895B-354C584A981B", 1);
+	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981bc", 0);
+	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981", 0);
+	failed += test_uuid("84949cc5x4701-4a84-895b-354c584a981b", 0);
+	failed += test_uuid("84949cc504701-4a84-895b-354c584a981b", 0);
+	failed += test_uuid("84949cc5-470104a84-895b-354c584a981b", 0);
+	failed += test_uuid("84949cc5-4701-4a840895b-354c584a981b", 0);
+	failed += test_uuid("84949cc5-4701-4a84-895b0354c584a981b", 0);
+	failed += test_uuid("g4949cc5-4701-4a84-895b-354c584a981b", 0);
+	failed += test_uuid("84949cc5-4701-4a84-895b-354c584a981g", 0);
+	
 	if (failed) {
 		printf("%d failures.\n", failed);
 		exit(1);