From: Petr Vorel <pvorel@suse.cz>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v3 1/2] lib: Fix kernel module detection on BusyBox
Date: Wed, 20 Jan 2021 16:21:31 +0100 [thread overview]
Message-ID: <YAhKe84FcrNEYFcC@pevik> (raw)
In-Reply-To: <YAg6wTVc6AB28smR@yuki.lan>
Hi Cyril,
...
> > + while (fgets(buf, sizeof(buf), f)) {
> > + if (sscanf(buf, "%s", module) != 1)
> > + continue;
> What is the point in the sscanf() here?
> Why can't we just strstr(buf, search) here?
modules.dep has format:
module:[dependency [another-dependency ...]]
e.g.:
kernel/arch/x86/kernel/cpu/mce/mce-inject.ko.xz:
kernel/arch/x86/crypto/twofish-x86_64.ko.xz: kernel/crypto/twofish_common.ko.xz
kernel/arch/x86/crypto/aesni-intel.ko.xz: kernel/crypto/crypto_simd.ko.xz kernel/crypto/cryptd.ko.xz kernel/arch/x86/crypto/glue_helper.ko.xz
First reading "%s" reads only first module with ':' separator.
Searching without it could find first module which is as dependency (e.g.
"/twofish_common.ko.xz" instead of "/twofish-x86_64.ko.xz"). Although that
shouldn't be a problem, because it's very unlikely that module dependency is
missing. Do you want me to drop sscanf() or put some comment?
Also man modules.dep(5) warns about using text format as "their format is
subject to change in the future". Hopefully we can depend on it. Or should we
use binary format?
...
> > + if (!tst_check_driver_(driver))
> > + return 0;
> > +
> > + if (strrchr(driver, '-') || strrchr(driver, '_')) {
> > + char *driver2 = strdup(driver);
> > + char *ix = driver2;
> > + char find = '-', replace = '_';
> > +
> > + if (strrchr(driver, '_')) {
> > + find = '_';
> > + replace = '-';
> > + }
> > +
> > + while ((ix = strchr(ix, find)) != NULL) {
> > + *ix++ = replace;
> > + }
> Just:
> while ((ix = strchr(ix, find))
> *ix++ = replace;
> > + if (!tst_check_driver_(driver2))
> free(driver2) ?
Oops, you're right. + path and search path in tst_search_driver()
Below are new versions.
Kind regards,
Petr
static int tst_search_driver(const char *driver, const char *file)
{
struct stat st;
char *path = NULL, *search = NULL;
char buf[PATH_MAX], module[PATH_MAX];
FILE *f;
int ret = -1;
struct utsname uts;
if (uname(&uts)) {
tst_brkm(TBROK | TERRNO, NULL, "uname() failed");
return -1;
}
SAFE_ASPRINTF(NULL, &path, "/lib/modules/%s/%s", uts.release, file);
if (stat(path, &st) || !(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode))) {
tst_resm(TWARN, "expected file %s does not exist or not a file", path);
return -1;
}
if (access(path, R_OK)) {
tst_resm(TWARN, "file %s cannot be read", path);
return -1;
}
SAFE_ASPRINTF(NULL, &search, "/%s.ko", driver);
f = SAFE_FOPEN(NULL, path, "r");
while (fgets(buf, sizeof(buf), f)) {
if (sscanf(buf, "%s", module) != 1)
continue;
if (strstr(module, search) != NULL) {
ret = 0;
break;
}
}
SAFE_FCLOSE(NULL, f);
free(search);
free(path);
return ret;
}
static int tst_check_driver_(const char *driver)
{
if (!tst_search_driver(driver, "modules.dep") ||
!tst_search_driver(driver, "modules.builtin"))
return 0;
return 1;
}
int tst_check_driver(const char *driver)
{
#ifdef __ANDROID__
/*
* Android may not have properly installed modules.* files. We could
* search modules in /system/lib/modules, but to to determine built-in
* drivers we need modules.builtin. Therefore assume all drivers are
* available.
*/
return 0;
#endif
if (!tst_check_driver_(driver))
return 0;
int ret = 1;
if (strrchr(driver, '-') || strrchr(driver, '_')) {
char *driver2 = strdup(driver);
char *ix = driver2;
char find = '-', replace = '_';
if (strrchr(driver, '_')) {
find = '_';
replace = '-';
}
while ((ix = strchr(ix, find)))
*ix++ = replace;
ret = tst_check_driver_(driver2);
free(driver2);
}
return ret;
}
next prev parent reply other threads:[~2021-01-20 15:21 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-19 16:03 [LTP] [PATCH v3 0/2] kernel module detection (own implementation) Petr Vorel
2021-01-19 16:03 ` [LTP] [PATCH v3 1/2] lib: Fix kernel module detection on BusyBox Petr Vorel
2021-01-19 19:56 ` Sandeep Patil
2021-01-19 21:48 ` Petr Vorel
2021-01-20 12:16 ` Petr Vorel
2021-01-20 14:14 ` Cyril Hrubis
2021-01-20 15:21 ` Petr Vorel [this message]
2021-01-20 15:28 ` Cyril Hrubis
2021-01-20 19:27 ` Petr Vorel
2021-01-19 16:03 ` [LTP] [PATCH v3 2/2] zram: Fix " Petr Vorel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YAhKe84FcrNEYFcC@pevik \
--to=pvorel@suse.cz \
--cc=ltp@lists.linux.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.