8377b8e913
- Increase size of temporary buffers to avoid unnecessary DNS lookups (#837695) - Fix gcc_asset failure in _Unwind_SetSpColumn() on ppc64. (#852445) - Don't free memory allocated by mempool allocator (#863453)
82 lines
3.0 KiB
Diff
82 lines
3.0 KiB
Diff
--- glibc-2.12-2-gc4ccff1/nscd/grpcache.c.lrgrpissue 2002-03-19 01:06:04.905969517 +0530
|
|
+++ glibc-2.12-2-gc4ccff1/nscd/grpcache.c 2002-03-19 01:09:46.495970850 +0530
|
|
@@ -207,10 +207,11 @@ cache_addgr (struct database_dyn *db, in
|
|
change. Allocate memory on the cache since it is likely
|
|
discarded anyway. If it turns out to be necessary to have a
|
|
new record we can still allocate real memory. */
|
|
- bool dataset_in_stack_or_freed = false;
|
|
+ bool dataset_temporary = false;
|
|
+ bool dataset_malloced = false;
|
|
dataset = NULL;
|
|
|
|
- if (he == NULL || ! __libc_use_alloca (alloca_used + total + n))
|
|
+ if (he == NULL)
|
|
dataset = (struct dataset *) mempool_alloc (db, total + n, 1);
|
|
|
|
if (dataset == NULL)
|
|
@@ -218,10 +219,16 @@ cache_addgr (struct database_dyn *db, in
|
|
/* We cannot permanently add the result in the moment. But
|
|
we can provide the result as is. Store the data in some
|
|
temporary memory. */
|
|
- dataset = (struct dataset *) alloca_account (total + n, alloca_used);
|
|
-
|
|
+ if (! __libc_use_alloca (alloca_used + total + n))
|
|
+ {
|
|
+ /* XXX What to do if malloc fails? */
|
|
+ dataset = (struct dataset *) malloc (total + n);
|
|
+ dataset_malloced = true;
|
|
+ }
|
|
+ else
|
|
+ dataset = (struct dataset *) alloca_account (total + n, alloca_used);
|
|
/* We cannot add this record to the permanent database. */
|
|
- dataset_in_stack_or_freed = true;
|
|
+ dataset_temporary = true;
|
|
}
|
|
|
|
dataset->head.allocsize = total + n;
|
|
@@ -276,13 +283,10 @@ cache_addgr (struct database_dyn *db, in
|
|
dh->timeout = dataset->head.timeout;
|
|
++dh->nreloads;
|
|
|
|
- /* If the new record was not allocated on the stack, then it must
|
|
- be freed. Note that it can no longer be used. */
|
|
- if (! dataset_in_stack_or_freed)
|
|
- {
|
|
- free (dataset);
|
|
- dataset_in_stack_or_freed = true;
|
|
- }
|
|
+ /* If the new record was allocated via malloc, then we
|
|
+ must free it here. */
|
|
+ if (dataset_malloced)
|
|
+ free (dataset);
|
|
}
|
|
else
|
|
{
|
|
@@ -298,7 +302,7 @@ cache_addgr (struct database_dyn *db, in
|
|
key_copy = (char *) newp + (key_copy - (char *) dataset);
|
|
|
|
dataset = memcpy (newp, dataset, total + n);
|
|
- dataset_in_stack_or_freed = false;
|
|
+ dataset_temporary = false;
|
|
}
|
|
|
|
/* Mark the old record as obsolete. */
|
|
@@ -313,7 +317,7 @@ cache_addgr (struct database_dyn *db, in
|
|
assert (fd != -1);
|
|
|
|
#ifdef HAVE_SENDFILE
|
|
- if (__builtin_expect (db->mmap_used, 1) && !dataset_in_stack_or_freed)
|
|
+ if (__builtin_expect (db->mmap_used, 1) && ! dataset_temporary)
|
|
{
|
|
assert (db->wr_fd != -1);
|
|
assert ((char *) &dataset->resp > (char *) db->data);
|
|
@@ -340,7 +344,7 @@ cache_addgr (struct database_dyn *db, in
|
|
|
|
/* Add the record to the database. But only if it has not been
|
|
stored on the stack. */
|
|
- if (! dataset_in_stack_or_freed)
|
|
+ if (! dataset_temporary)
|
|
{
|
|
/* If necessary, we also propagate the data to disk. */
|
|
if (db->persistent)
|