diff options
| author | Mark Wielaard <[email protected]> | 2015-05-19 12:40:30 +0200 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2015-05-27 23:04:31 +0200 |
| commit | 251f1459aa54c55e2fe51f5499709253984b99a5 (patch) | |
| tree | 30a1e7a5314e476896570db1ffdfc50b0b6dbd7f /libdwfl | |
| parent | 720f83a563fd3d550cdc7a14be9fb13269022b91 (diff) | |
libdwfl: Minimize stack usage in dwfl_linux_kernel_report_offline.
Don't stack allocate module name. Also fixes a latent bug (if the module
file didn't have a suffix - which is very unlikely) and an inefficiency.
We only need to substitue chars up to the suffix.
Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'libdwfl')
| -rw-r--r-- | libdwfl/ChangeLog | 5 | ||||
| -rw-r--r-- | libdwfl/linux-kernel-modules.c | 25 |
2 files changed, 22 insertions, 8 deletions
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 7fbb9142..d06d34df 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,8 @@ +2015-05-19 Mark Wielaard <[email protected]> + + * linux-kernel-modules.c (dwfl_linux_kernel_report_offline): Don't + stack allocate name. Only change chars up to suffix. + 2015-05-18 Mark Wielaard <[email protected]> * dwfl_module_getdwarf.c (find_prelink_address_sync): Allocate diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c index e4065d89..cb568680 100644 --- a/libdwfl/linux-kernel-modules.c +++ b/libdwfl/linux-kernel-modules.c @@ -1,5 +1,5 @@ /* Standard libdwfl callbacks for debugging the running Linux kernel. - Copyright (C) 2005-2011, 2013, 2014 Red Hat, Inc. + Copyright (C) 2005-2011, 2013, 2014, 2015 Red Hat, Inc. This file is part of elfutils. This file is free software; you can redistribute it and/or modify @@ -379,13 +379,16 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release, names. To handle that, we would have to look at the __this_module.name contents in the module's text. */ - char name[f->fts_namelen - suffix + 1]; - for (size_t i = 0; i < f->fts_namelen - 3U; ++i) - if (f->fts_name[i] == '-' || f->fts_name[i] == ',') + char *name = strndup (f->fts_name, f->fts_namelen - suffix); + if (unlikely (name == NULL)) + { + __libdwfl_seterrno (DWFL_E_NOMEM); + result = -1; + break; + } + for (size_t i = 0; i < f->fts_namelen - suffix; ++i) + if (name[i] == '-' || name[i] == ',') name[i] = '_'; - else - name[i] = f->fts_name[i]; - name[f->fts_namelen - suffix] = '\0'; if (predicate != NULL) { @@ -394,17 +397,23 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release, if (want < 0) { result = -1; + free (name); break; } if (!want) - continue; + { + free (name); + continue; + } } if (dwfl_report_offline (dwfl, name, f->fts_path, -1) == NULL) { + free (name); result = -1; break; } + free (name); } continue; |
