fix mishandling of ENOMEM return case in internal getgrent_a function
authorRich Felker <dalias@aerifal.cx>
Fri, 1 May 2015 16:25:01 +0000 (12:25 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 1 May 2015 16:25:01 +0000 (12:25 -0400)
due to an incorrect return statement in this error case, the
previously blocked cancellation state was not restored and no result
was stored. this could lead to invalid (read) accesses in the caller
resulting in crashes or nonsensical result data in the event of memory
exhaustion.

src/passwd/getgrent_a.c

index ecd2f2eaf9c72dcaec2afa91aa2831d71c7cb9da..7fc389d46332a9ef408d29c67d853978a5dc5082 100644 (file)
@@ -48,7 +48,8 @@ int __getgrent_a(FILE *f, struct group *gr, char **line, size_t *size, char ***m
                rv = errno;
                free(*line);
                *line = 0;
-               return 0;
+               gr = 0;
+               goto end;
        }
        if (*mems) {
                mem[0][0] = mems;