aboutsummaryrefslogtreecommitdiffstats
path: root/ports/uids_generic/guts/getgrgid.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/uids_generic/guts/getgrgid.c')
-rw-r--r--ports/uids_generic/guts/getgrgid.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/ports/uids_generic/guts/getgrgid.c b/ports/uids_generic/guts/getgrgid.c
index c1824e7..0d3dafb 100644
--- a/ports/uids_generic/guts/getgrgid.c
+++ b/ports/uids_generic/guts/getgrgid.c
@@ -7,10 +7,30 @@
* struct group * rc = NULL;
*/
static struct group grp;
- static char grbuf[PSEUDO_PWD_MAX];
- int r_rc;
+ static size_t grbuflen = PSEUDO_PWD_MAX;
+ static char *grbuf = NULL;
+ int r_rc = ERANGE;
+
+ do {
+ char *new_grbuf = grbuf;
+
+ if (r_rc == ERANGE)
+ new_grbuf = realloc(grbuf, grbuflen);
+
+ if (!new_grbuf) {
+ r_rc = ENOMEM;
+ break;
+ }
+
+ grbuf = new_grbuf;
+
+ r_rc = wrap_getgrgid_r(gid, &grp, grbuf, grbuflen, &rc);
+
+ if (r_rc == ERANGE)
+ grbuflen = grbuflen << 1;
+
+ } while (r_rc == ERANGE);
- r_rc = wrap_getgrgid_r(gid, &grp, grbuf, PSEUDO_PWD_MAX, &rc);
/* different error return conventions */
if (r_rc != 0) {
errno = r_rc;