@@ -123,19 +123,35 @@ bool fossil_bluecrab_cacheshell_set(const char *key, const char *value) {
123123
124124bool fossil_bluecrab_cacheshell_get (const char * key , char * out_value , size_t buffer_size ) {
125125 cache_entry_t * e = find_entry (key );
126- if (!e ) return false;
127- if (e -> value_size > buffer_size ) return false;
128- memcpy (out_value , e -> value , e -> value_size );
126+ if (!e || !e -> in_use ) return false;
127+ if (buffer_size == 0 ) return false;
128+ // Always copy at most buffer_size-1 bytes, and null-terminate
129+ size_t copy_len = e -> value_size ;
130+ if (copy_len > buffer_size - 1 ) copy_len = buffer_size - 1 ;
131+ memcpy (out_value , e -> value , copy_len );
132+ out_value [copy_len ] = '\0' ;
129133 return true;
130134}
131135
132136bool fossil_bluecrab_cacheshell_remove (const char * key ) {
133- cache_entry_t * e = find_entry (key );
134- if (!e ) return false;
135- free (e -> key );
136- free (e -> value );
137- e -> in_use = false;
138- return true;
137+ unsigned long h = cache_hash (key ) % CACHE_TABLE_SIZE ;
138+ for (size_t i = 0 ; i < CACHE_TABLE_SIZE ; i ++ ) {
139+ size_t idx = (h + i ) % CACHE_TABLE_SIZE ;
140+ if (!cache_table [idx ].in_use ) {
141+ return false;
142+ }
143+ if (strcmp (cache_table [idx ].key , key ) == 0 ) {
144+ free (cache_table [idx ].key );
145+ free (cache_table [idx ].value );
146+ cache_table [idx ].key = NULL ;
147+ cache_table [idx ].value = NULL ;
148+ cache_table [idx ].value_size = 0 ;
149+ cache_table [idx ].expire_at = 0 ;
150+ cache_table [idx ].in_use = false;
151+ return true;
152+ }
153+ }
154+ return false;
139155}
140156
141157bool fossil_bluecrab_cacheshell_set_with_ttl (const char * key , const char * value , unsigned int ttl_sec ) {
@@ -163,6 +179,10 @@ void fossil_bluecrab_cacheshell_clear(void) {
163179 if (cache_table [i ].in_use ) {
164180 free (cache_table [i ].key );
165181 free (cache_table [i ].value );
182+ cache_table [i ].key = NULL ;
183+ cache_table [i ].value = NULL ;
184+ cache_table [i ].value_size = 0 ;
185+ cache_table [i ].expire_at = 0 ;
166186 cache_table [i ].in_use = false;
167187 }
168188 }
@@ -183,15 +203,16 @@ size_t fossil_bluecrab_cacheshell_count(void) {
183203}
184204
185205bool fossil_bluecrab_cacheshell_exists (const char * key ) {
186- return find_entry (key ) != NULL ;
206+ cache_entry_t * e = find_entry (key );
207+ return (e != NULL && e -> in_use );
187208}
188209
189210bool fossil_bluecrab_cacheshell_set_binary (const char * key , const void * data , size_t size ) {
190211 cache_entry_t * e = find_entry (key );
191212 if (!e ) e = alloc_entry (key );
192213 if (!e ) return false;
193214
194- free (e -> value );
215+ if ( e -> value ) free (e -> value );
195216 e -> value = malloc (size );
196217 if (!e -> value ) return false;
197218 memcpy (e -> value , data , size );
@@ -202,9 +223,11 @@ bool fossil_bluecrab_cacheshell_set_binary(const char *key, const void *data, si
202223
203224bool fossil_bluecrab_cacheshell_get_binary (const char * key , void * out_buf , size_t buf_size , size_t * out_size ) {
204225 cache_entry_t * e = find_entry (key );
205- if (!e ) return false;
206- if (e -> value_size > buf_size ) return false;
207- memcpy (out_buf , e -> value , e -> value_size );
226+ if (!e || !e -> in_use ) return false;
208227 if (out_size ) * out_size = e -> value_size ;
228+ if (buf_size == 0 ) return false;
229+ size_t copy_len = e -> value_size ;
230+ if (copy_len > buf_size ) copy_len = buf_size ;
231+ memcpy (out_buf , e -> value , copy_len );
209232 return true;
210233}
0 commit comments