@@ -311,6 +311,13 @@ void mallctl_int(client *c, robj **argv, int argc) {
311
311
size_t sz = sizeof (old );
312
312
while (sz > 0 ) {
313
313
if ((ret = je_mallctl (argv [0 ]-> ptr , & old , & sz , argc > 1 ? & val : NULL , argc > 1 ?sz : 0 ))) {
314
+ if (ret == EPERM && argc > 1 ) {
315
+ /* if this option is write only, try just writing to it. */
316
+ if (!(ret = je_mallctl (argv [0 ]-> ptr , NULL , 0 , & val , sz ))) {
317
+ addReply (c , shared .ok );
318
+ return ;
319
+ }
320
+ }
314
321
if (ret == EINVAL ) {
315
322
/* size might be wrong, try a smaller one */
316
323
sz /= 2 ;
@@ -333,17 +340,30 @@ void mallctl_int(client *c, robj **argv, int argc) {
333
340
}
334
341
335
342
void mallctl_string (client * c , robj * * argv , int argc ) {
336
- int ret ;
343
+ int rret , wret ;
337
344
char * old ;
338
345
size_t sz = sizeof (old );
339
346
/* for strings, it seems we need to first get the old value, before overriding it. */
340
- if ((ret = je_mallctl (argv [0 ]-> ptr , & old , & sz , NULL , 0 ))) {
341
- addReplyErrorFormat (c ,"%s" , strerror (ret ));
342
- return ;
347
+ if ((rret = je_mallctl (argv [0 ]-> ptr , & old , & sz , NULL , 0 ))) {
348
+ /* return error unless this option is write only. */
349
+ if (!(rret == EPERM && argc > 1 )) {
350
+ addReplyErrorFormat (c ,"%s" , strerror (rret ));
351
+ return ;
352
+ }
353
+ }
354
+ if (argc > 1 ) {
355
+ char * val = argv [1 ]-> ptr ;
356
+ char * * valref = & val ;
357
+ if ((!strcmp (val ,"VOID" )))
358
+ valref = NULL , sz = 0 ;
359
+ wret = je_mallctl (argv [0 ]-> ptr , NULL , 0 , valref , sz );
343
360
}
344
- addReplyBulkCString (c , old );
345
- if (argc > 1 )
346
- je_mallctl (argv [0 ]-> ptr , NULL , 0 , & argv [1 ]-> ptr , sizeof (char * ));
361
+ if (!rret )
362
+ addReplyBulkCString (c , old );
363
+ else if (wret )
364
+ addReplyErrorFormat (c ,"%s" , strerror (wret ));
365
+ else
366
+ addReply (c , shared .ok );
347
367
}
348
368
#endif
349
369
0 commit comments