diff options
-rw-r--r-- | meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch | 96 | ||||
-rw-r--r-- | meta/recipes-devtools/rpm/rpm_5.4.14.bb | 1 |
2 files changed, 97 insertions, 0 deletions
diff --git a/meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch b/meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch new file mode 100644 index 0000000000..3986030667 --- /dev/null +++ b/meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch | |||
@@ -0,0 +1,96 @@ | |||
1 | rpm: check if the argument(rootpath) exists or be writable | ||
2 | |||
3 | When user execute the command "rpm -qai --root=$dir",if $dir doesn't | ||
4 | exist or is unwritable as result of making a typo in rootpath,then | ||
5 | it will create dirent $dir and subdirectory. | ||
6 | So we should add the check function to fix it before creating relational | ||
7 | subdirectory,and warn the incorrect rootpath to user. It just checks the | ||
8 | rootpath reasonableness when the user input the argument(--root=/-r=). | ||
9 | |||
10 | Upstream-Status: Pending | ||
11 | |||
12 | Signed-off-by: Zhixiong Chi <zchi@windriver.com> | ||
13 | --- | ||
14 | rpmqv.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ | ||
15 | 1 file changed, 45 insertions(+) | ||
16 | |||
17 | diff --git a/rpmqv.c b/rpmqv.c | ||
18 | index 40c42bd..88d85ab 100644 | ||
19 | --- a/rpmqv.c | ||
20 | +++ b/rpmqv.c | ||
21 | @@ -206,6 +206,8 @@ static struct poptOption optionsTable[] = { | ||
22 | POPT_TABLEEND | ||
23 | }; | ||
24 | |||
25 | +static int _rpmqv_rootpath_state = 0; | ||
26 | + | ||
27 | #ifdef __MINT__ | ||
28 | /* MiNT cannot dynamically increase the stack. */ | ||
29 | long _stksize = 64 * 1024L; | ||
30 | @@ -427,6 +429,41 @@ static void integrity_check(const char *progname, enum modes progmode_num) | ||
31 | } | ||
32 | #endif | ||
33 | |||
34 | +/*check if the rootdir is writable or exists */ | ||
35 | +int access_file(const char *rootdir) | ||
36 | +{ | ||
37 | + int ret,rootdir_len; | ||
38 | + | ||
39 | + if(rootdir == NULL) { | ||
40 | + return; | ||
41 | + } | ||
42 | + | ||
43 | + rootdir_len = strlen(rootdir); | ||
44 | + /*make sure that dirent argument trailing is "/" */ | ||
45 | + if(!(rootdir_len && rootdir[rootdir_len - 1] == '/')){ | ||
46 | + char *t = (char *)malloc(rootdir_len + 2); | ||
47 | + *t = '\0'; | ||
48 | + (void)stpcpy(stpcpy(t,rootdir),"/"); | ||
49 | + ret = access(t,F_OK|W_OK); | ||
50 | + free(t); | ||
51 | + }else{ | ||
52 | + ret = access(rootdir,F_OK|W_OK); | ||
53 | + } | ||
54 | + return ret; | ||
55 | +} | ||
56 | + | ||
57 | +/*check if input the argument "--root/-r" */ | ||
58 | +void check_argument_root(int argc,char * const argv[]) | ||
59 | +{ | ||
60 | + int i; | ||
61 | + for (i = 0; i < argc; i++) { | ||
62 | + if(strncmp(argv[i],"--root=",7) == 0 || strncmp(argv[i],"-r=",3) == 0) { | ||
63 | + _rpmqv_rootpath_state = 1; | ||
64 | + break; | ||
65 | + } | ||
66 | + } | ||
67 | +} | ||
68 | + | ||
69 | /*@-bounds@*/ /* LCL: segfault */ | ||
70 | /*@-mods@*/ /* FIX: shrug */ | ||
71 | #if !defined(__GLIBC__) && !defined(__LCLINT__) | ||
72 | @@ -476,6 +513,8 @@ int main(int argc, const char ** argv) | ||
73 | int xx; | ||
74 | #endif | ||
75 | |||
76 | + check_argument_root(argc,(char *const *)argv); | ||
77 | + | ||
78 | #if !defined(__GLIBC__) && !defined(__LCLINT__) | ||
79 | environ = envp; | ||
80 | #else | ||
81 | @@ -715,6 +754,12 @@ int main(int argc, const char ** argv) | ||
82 | argerror(_("arguments to --root (-r) must begin with a /")); | ||
83 | break; | ||
84 | } | ||
85 | + if (_rpmqv_rootpath_state) { | ||
86 | + if (access_file(rpmioRootDir)) { | ||
87 | + fprintf(stderr, _("Invalid directory:%s, ensure it exists or be writable\n"),rpmioRootDir); | ||
88 | + exit(EXIT_FAILURE); | ||
89 | + } | ||
90 | + } | ||
91 | } | ||
92 | |||
93 | #if defined(RPM_VENDOR_OPENPKG) /* integrity-checking */ | ||
94 | -- | ||
95 | 1.9.1 | ||
96 | |||
diff --git a/meta/recipes-devtools/rpm/rpm_5.4.14.bb b/meta/recipes-devtools/rpm/rpm_5.4.14.bb index fb81f12a1f..2e17a91137 100644 --- a/meta/recipes-devtools/rpm/rpm_5.4.14.bb +++ b/meta/recipes-devtools/rpm/rpm_5.4.14.bb | |||
@@ -93,6 +93,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.14-0.20131024.src.rpm;e | |||
93 | file://0001-using-poptParseArgvString-to-parse-the-_gpg_check_pa.patch \ | 93 | file://0001-using-poptParseArgvString-to-parse-the-_gpg_check_pa.patch \ |
94 | file://no-ldflags-in-pkgconfig.patch \ | 94 | file://no-ldflags-in-pkgconfig.patch \ |
95 | file://rpm-lua-fix-print.patch \ | 95 | file://rpm-lua-fix-print.patch \ |
96 | file://rpm-check-rootpath-reasonableness.patch \ | ||
96 | " | 97 | " |
97 | 98 | ||
98 | # Uncomment the following line to enable platform score debugging | 99 | # Uncomment the following line to enable platform score debugging |