zos: return on realloc failure in scandir()
Fixes: https://github.com/libuv/libuv/issues/2692 PR-URL: https://github.com/libuv/libuv/pull/2693 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Richard Lau <riclau@uk.ibm.com>
This commit is contained in:
parent
af7143b6f2
commit
b5155dd2ac
@ -62,19 +62,15 @@ int scandir(const char* maindir, struct dirent*** namelist,
|
||||
if (!filter || filter(dirent)) {
|
||||
struct dirent* copy;
|
||||
copy = uv__malloc(sizeof(*copy));
|
||||
if (!copy) {
|
||||
while (count) {
|
||||
dirent = nl[--count];
|
||||
uv__free(dirent);
|
||||
}
|
||||
uv__free(nl);
|
||||
closedir(mdir);
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
if (!copy)
|
||||
goto error;
|
||||
memcpy(copy, dirent, sizeof(*copy));
|
||||
|
||||
nl = uv__realloc(nl, sizeof(*copy) * (count + 1));
|
||||
if (nl == NULL) {
|
||||
uv__free(copy);
|
||||
goto error;
|
||||
}
|
||||
nl[count++] = copy;
|
||||
}
|
||||
}
|
||||
@ -86,6 +82,16 @@ int scandir(const char* maindir, struct dirent*** namelist,
|
||||
|
||||
*namelist = nl;
|
||||
return count;
|
||||
|
||||
error:
|
||||
while (count > 0) {
|
||||
dirent = nl[--count];
|
||||
uv__free(dirent);
|
||||
}
|
||||
uv__free(nl);
|
||||
closedir(mdir);
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user