package extract: Delay setting node permissions
In HandleEntry() create the file/directory with sufficient permissions for the user and set the archived permissions in HandleEntryDone(). This makes sure child attributes and entries can be created.
This commit is contained in:
@@ -116,7 +116,10 @@ struct PackageContentExtractHandler : BPackageContentHandler {
|
|||||||
if (S_ISREG(entry->Mode())) {
|
if (S_ISREG(entry->Mode())) {
|
||||||
// create the file
|
// create the file
|
||||||
fd = openat(parentFD, entry->Name(), O_RDWR | O_CREAT | O_EXCL,
|
fd = openat(parentFD, entry->Name(), O_RDWR | O_CREAT | O_EXCL,
|
||||||
entry->Mode() & ALLPERMS);
|
S_IRUSR | S_IWUSR);
|
||||||
|
// Note: We use read+write user permissions now -- so write
|
||||||
|
// operations (e.g. attributes) won't fail, but set them to the
|
||||||
|
// desired ones in HandleEntryDone().
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stderr, "Error: Failed to create file \"%s\": %s\n",
|
fprintf(stderr, "Error: Failed to create file \"%s\": %s\n",
|
||||||
entry->Name(), strerror(errno));
|
entry->Name(), strerror(errno));
|
||||||
@@ -148,8 +151,10 @@ struct PackageContentExtractHandler : BPackageContentHandler {
|
|||||||
} else if (S_ISDIR(entry->Mode())) {
|
} else if (S_ISDIR(entry->Mode())) {
|
||||||
// create the directory, if necessary
|
// create the directory, if necessary
|
||||||
if (!entryExists
|
if (!entryExists
|
||||||
&& mkdirat(parentFD, entry->Name(), entry->Mode() & ALLPERMS)
|
&& mkdirat(parentFD, entry->Name(), S_IRWXU) != 0) {
|
||||||
!= 0) {
|
// Note: We use read+write+exec user permissions now -- so write
|
||||||
|
// operations (e.g. attributes) won't fail, but set them to the
|
||||||
|
// desired ones in HandleEntryDone().
|
||||||
fprintf(stderr, "Error: Failed to create directory \"%s\": "
|
fprintf(stderr, "Error: Failed to create directory \"%s\": "
|
||||||
"%s\n", entry->Name(), strerror(errno));
|
"%s\n", entry->Name(), strerror(errno));
|
||||||
return errno;
|
return errno;
|
||||||
@@ -216,6 +221,20 @@ struct PackageContentExtractHandler : BPackageContentHandler {
|
|||||||
|
|
||||||
virtual status_t HandleEntryDone(BPackageEntry* entry)
|
virtual status_t HandleEntryDone(BPackageEntry* entry)
|
||||||
{
|
{
|
||||||
|
// set the node permissions for non-symlinks
|
||||||
|
if (!S_ISLNK(entry->Mode())) {
|
||||||
|
// get parent FD
|
||||||
|
int parentFD = AT_FDCWD;
|
||||||
|
if (entry->Parent() != NULL)
|
||||||
|
parentFD = ((Token*)entry->Parent()->UserToken())->fd;
|
||||||
|
|
||||||
|
if (fchmodat(parentFD, entry->Name(), entry->Mode() & ALLPERMS,
|
||||||
|
/*AT_SYMLINK_NOFOLLOW*/0) != 0) {
|
||||||
|
fprintf(stderr, "Warning: Failed to set permissions of file "
|
||||||
|
"\"%s\": %s\n", entry->Name(), strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (Token* token = (Token*)entry->UserToken()) {
|
if (Token* token = (Token*)entry->UserToken()) {
|
||||||
delete token;
|
delete token;
|
||||||
entry->SetUserToken(NULL);
|
entry->SetUserToken(NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user