libalpm/add.c : safety check for fixing FS#9235.
Fixes FS#9235. We already had the following case in extract_single_file : /* cases 1,2,3: couldn't stat an existing file, skip all backup checks */ But we actually only did a lstat here. And if lstat worked, we did a stat without checking. When lstat works and stat fails, it means we have a broken symlink, like in FS#9235. We can actually treat this case like a non-existing file. The broken symlink will then be simply overwritten. Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
This commit is contained in:
parent
b29838c825
commit
0c2206f542
1 changed files with 4 additions and 6 deletions
|
@ -361,14 +361,12 @@ static int extract_single_file(struct archive *archive,
|
||||||
* links, etc.
|
* links, etc.
|
||||||
* 12- skip extraction, dir already exists.
|
* 12- skip extraction, dir already exists.
|
||||||
*/
|
*/
|
||||||
struct stat lsbuf;
|
|
||||||
if(_alpm_lstat(filename, &lsbuf) != 0) {
|
/* do both a lstat and a stat, so we can see what symlinks point to */
|
||||||
|
struct stat lsbuf, sbuf;
|
||||||
|
if(_alpm_lstat(filename, &lsbuf) != 0 || stat(filename, &sbuf) != 0) {
|
||||||
/* cases 1,2,3: couldn't stat an existing file, skip all backup checks */
|
/* cases 1,2,3: couldn't stat an existing file, skip all backup checks */
|
||||||
} else {
|
} else {
|
||||||
/* do a stat as well, so we can see what symlinks point to */
|
|
||||||
struct stat sbuf;
|
|
||||||
stat(filename, &sbuf);
|
|
||||||
|
|
||||||
if(S_ISDIR(lsbuf.st_mode) && S_ISDIR(entrymode)) {
|
if(S_ISDIR(lsbuf.st_mode) && S_ISDIR(entrymode)) {
|
||||||
/* case 12: existing dir, ignore it */
|
/* case 12: existing dir, ignore it */
|
||||||
if(lsbuf.st_mode != entrymode) {
|
if(lsbuf.st_mode != entrymode) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue