Skip to content

Commit

Permalink
LibC: Some calloc() and realloc() improvements (SerenityOS#3108)
Browse files Browse the repository at this point in the history
If the space cannot be allocated, the original memory block shall remain
unchanged and the function should return nullptr.

Also add a function attribute and some null checks.
  • Loading branch information
tryfinally authored and awesomekling committed Aug 13, 2020
1 parent dcfc54d commit 11b9e8b
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 4 deletions.
12 changes: 9 additions & 3 deletions Libraries/LibC/malloc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,8 @@ void* calloc(size_t count, size_t size)
{
size_t new_size = count * size;
auto* ptr = malloc(new_size);
memset(ptr, 0, new_size);
if (ptr)
memset(ptr, 0, new_size);
return ptr;
}

Expand All @@ -418,13 +419,18 @@ void* realloc(void* ptr, size_t size)
{
if (!ptr)
return malloc(size);
if (!size)
return nullptr;

LOCKER(malloc_lock());
auto existing_allocation_size = malloc_size(ptr);
if (size <= existing_allocation_size)
return ptr;
auto* new_ptr = malloc(size);
memcpy(new_ptr, ptr, min(existing_allocation_size, size));
free(ptr);
if (new_ptr) {
memcpy(new_ptr, ptr, min(existing_allocation_size, size));
free(ptr);
}
return new_ptr;
}

Expand Down
2 changes: 1 addition & 1 deletion Libraries/LibC/stdlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ __attribute__((malloc)) __attribute__((alloc_size(1))) void* malloc(size_t);
__attribute__((malloc)) __attribute__((alloc_size(1, 2))) void* calloc(size_t nmemb, size_t);
size_t malloc_size(void*);
void free(void*);
void* realloc(void* ptr, size_t);
__attribute__((alloc_size(2))) void* realloc(void* ptr, size_t);
char* getenv(const char* name);
int putenv(char*);
int unsetenv(const char*);
Expand Down

0 comments on commit 11b9e8b

Please sign in to comment.