X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/121796f792c4d8fdc06fe664d675ec16791f6818..8bca8773b4e2542f9537b8403764867aa76273a5:/dict.c diff --git a/dict.c b/dict.c index 6e410b75..23f7933b 100644 --- a/dict.c +++ b/dict.c @@ -5,7 +5,7 @@ * tables of power of two in size are used, collisions are handled by * chaining. See the source code for more information... :) * - * Copyright (c) 2006-2009, Salvatore Sanfilippo + * Copyright (c) 2006-2010, Salvatore Sanfilippo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -232,7 +232,7 @@ int dictAdd(dict *ht, void *key, void *val) * operation. */ int dictReplace(dict *ht, void *key, void *val) { - dictEntry *entry; + dictEntry *entry, auxentry; /* Try to add the element. If the key * does not exists dictAdd will suceed. */ @@ -241,8 +241,14 @@ int dictReplace(dict *ht, void *key, void *val) /* It already exists, get the entry */ entry = dictFind(ht, key); /* Free the old value and set the new one */ - dictFreeEntryVal(ht, entry); + /* Set the new value and free the old one. Note that it is important + * to do that in this order, as the value may just be exactly the same + * as the previous one. In this context, think to reference counting, + * you want to increment (set), and then decrement (free), and not the + * reverse. */ + auxentry = *entry; dictSetHashVal(ht, entry, val); + dictFreeEntryVal(ht, &auxentry); return 0; }