libpwdgrp: fix counting of commas in group list
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 3 Jan 2015 20:03:39 +0000 (21:03 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 3 Jan 2015 20:03:39 +0000 (21:03 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libpwdgrp/pwd_grp.c

index 4b61b61d2685339ae76fb3f4fd12f74c4e12dd57..01058d3a1b8a22d1b4d7c7b2feb147eba5d91c14 100644 (file)
@@ -203,22 +203,6 @@ static char *parse_common(FILE *fp, const char *filename,
                        bb_error_msg("bad record at %s:%u", filename, count);
                        goto free_and_next;
                }
-               S.string_size = S.tokenize_end - buf;
-
-/* Ugly hack: group db requires additional buffer space
- * for members[] array. If there is only one group, we need space
- * for 3 pointers: alignment padding, group name, NULL.
- * +1 for every additional group.
- */
-               if (n_fields == sizeof(GR_DEF)-1) { /* if we read group file */
-                       int cnt = 3;
-                       char *p = buf;
-                       while (*p)
-                               if (*p++ == ',')
-                                       cnt++;
-                       S.string_size += cnt * sizeof(char*);
-                       buf = xrealloc(buf, S.string_size);
-               }
 
                if (!key) {
                        /* no key specified: sequential read, return a record */
@@ -232,6 +216,24 @@ static char *parse_common(FILE *fp, const char *filename,
                free(buf);
        }
 
+       S.string_size = S.tokenize_end - buf;
+/*
+ * Ugly hack: group db requires additional buffer space
+ * for members[] array. If there is only one group, we need space
+ * for 3 pointers: alignment padding, group name, NULL.
+ * +1 for every additional group.
+ */
+       if (n_fields == sizeof(GR_DEF)-1) { /* if we read group file... */
+               int cnt = 3;
+               char *p = buf;
+               while (p < S.tokenize_end)
+                       if (*p++ == ',')
+                               cnt++;
+               S.string_size += cnt * sizeof(char*);
+//bb_error_msg("+%d words = %u key:%s buf:'%s'", cnt, S.string_size, key, buf);
+               buf = xrealloc(buf, S.string_size);
+       }
+
        return buf;
 }