Browse Source

libbb: fix fallout from nth_string() robustification, closes 14726

function                                             old     new   delta
parse_common                                         187     228     +41

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Denys Vlasenko 1 year ago
parent
commit
0cdd6f5792
1 changed files with 13 additions and 1 deletions
  1. 13 1
      libpwdgrp/pwd_grp.c

+ 13 - 1
libpwdgrp/pwd_grp.c

@@ -191,6 +191,9 @@ static char *parse_common(FILE *fp, struct passdb *db,
 	char *buf;
 
 	while ((buf = xmalloc_fgetline(fp)) != NULL) {
+		int n;
+		char *field;
+
 		/* Skip empty lines, comment lines */
 		if (buf[0] == '\0' || buf[0] == '#')
 			goto free_and_next;
@@ -204,7 +207,16 @@ static char *parse_common(FILE *fp, struct passdb *db,
 			/* no key specified: sequential read, return a record */
 			break;
 		}
-		if (strcmp(key, nth_string(buf, field_pos)) == 0) {
+		/* Can't use nth_string() here, it does not allow empty strings
+		 * ("\0\0" terminates the list), and a valid passwd entry
+		 * "user::UID:GID..." would be mishandled */
+		n = field_pos;
+		field = buf;
+		while (n) {
+			n--;
+			field += strlen(field) + 1;
+		}
+		if (strcmp(key, field) == 0) {
 			/* record found */
 			break;
 		}