Hi Lianbo,
-----Original Message-----
This reminds me, if parse_line() or dump_struct_member() fails, is
there a potential risk of memory leaks
in the dump_struct_members()?
file: sbitmap.c
432 static void dump_struct_members(const char *s, ulong addr, unsigned radix)
433 {
434 int i, argc;
435 char *p1, *p2;
436 char *structname, *members;
437 char *arglist[MAXARGS];
438
439 structname = GETBUF(strlen(s) + 1);
440 members = GETBUF(strlen(s) + 1);
441
442 strcpy(structname, s);
443 p1 = strstr(structname, ".") + 1;
444
445 p2 = strstr(s, ".") + 1;
446 strcpy(members, p2);
447 replace_string(members, ",", ' ');
448 argc = parse_line(members, arglist);
449
450 for (i = 0; i < argc; i++) {
451 *p1 = NULLCHAR;
452 strcat(structname, arglist[i]);
453 dump_struct_member(structname, addr, radix);
454 }
455
456 FREEBUF(structname);
457 FREEBUF(members);
458 }
I noticed that the parse_line() has a return value, but the dump_struct_member() has no
return value, is
there a good way to avoid the potential risks? Or leave it there?
BTW: I saw the similar issues in tools.c
um, the fact is, all buffers that GETBUF() allocates will be freed automatically
after the last command execution in free_all_bufs():
main_loop
while (TRUE) {
process_command_line
restore_sanity
free_all_bufs <<--
exec_command
}
so to free all buffers is better coding practice and has several pros if you can,
but it's not necessary to work too hard for it.
Thanks,
Kazu
Thanks.
Lianbo
@@ -272,7 +272,7 @@ static void __sbitmap_for_each_set(const struct sbitmap_context
*sc,
if (nr >= depth)
break;
if (!fn((index << sc->shift) + nr, data))
- return;
+ goto exit;
nr++;
}
@@ -282,6 +282,7 @@ next:
index = 0;
}
+exit:
FREEBUF(sbitmap_word_buf);
}
--
2.25.1