Package: dpkg
Version: 1.15.8.10
Severity: wishlist

Pascal Dupuis submitted us (privately) the attached patch with this request:
> I have access to a machine where I can develop, compile, install
> locally and run programs in my $HOME dir,  but not install packages.
> After fiddling a bit inside dpkg, I noticed the '--force-not-root'
> option, but this fails as some operations are required to have root
> access. I enclose a patch where the operations don't fail and exit
> dpkg in case the fc_nonroot variable is set. I tried basically to not
> change at all the original behaviour. I don't pretend the changes are
> the right way to do, but at least I succeeded in installing packages
> with this modified dpkg version. Could you please consider
> incorporating those patches into upcoming dpkg version ?

I replied the following:
> It's definitely not going to be included as is. First of all, if you want
> just to suppress error messages we have function "forcibleerr" that
> is better suited than your modification of the if test that checks the
> return calls of some functions.
> 
> Furthermore you really want to not fail only on EPERM. Other error
> cases should still result in a failure.
> 
> Maybe we need a "forciblesyserr" for this.


It's not a high priority change but it would be nice to be consistently
respecting this option. That's why I'm submitting this bug to not forget
about it.

Cheers,
-- 
Raphaël Hertzog ◈ Debian Developer

Follow my Debian News ▶ http://RaphaelHertzog.com (English)
                      ▶ http://RaphaelHertzog.fr (Français)
diff -bBu -r ./src/archives.c ../dpkg-1.15.8.10/src/archives.c
--- ./src/archives.c	2011-01-30 20:37:44.000000000 +0100
+++ ../dpkg-1.15.8.10/src/archives.c	2011-02-14 21:34:56.000000000 +0100
@@ -256,9 +256,9 @@
 {
   if (chown(path,
             statoverride ? statoverride->uid : ti->uid,
-            statoverride ? statoverride->gid : ti->gid))
+            statoverride ? statoverride->gid : ti->gid) && !fc_nonroot)
     ohshite(_("error setting ownership of `%.255s'"), ti->name);
-  if (chmod(path,(statoverride ? statoverride->mode : ti->mode) & ~S_IFMT))
+  if (chmod(path, (statoverride ? statoverride->mode : ti->mode) & ~S_IFMT))
     ohshite(_("error setting permissions of `%.255s'"), ti->name);
   newtarobject_utime(path,ti);
 }
@@ -709,7 +709,7 @@
                nifd->namenode->statoverride ?
                nifd->namenode->statoverride->uid : ti->uid,
                nifd->namenode->statoverride ?
-               nifd->namenode->statoverride->gid : ti->gid))
+               nifd->namenode->statoverride->gid : ti->gid) && !fc_nonroot)
       ohshite(_("error setting ownership of `%.255s'"), ti->name);
     am = (nifd->namenode->statoverride ?
           nifd->namenode->statoverride->mode : ti->mode) & ~S_IFMT;
@@ -765,7 +765,7 @@
                nifd->namenode->statoverride ?
                nifd->namenode->statoverride->uid : ti->uid,
                nifd->namenode->statoverride ?
-               nifd->namenode->statoverride->gid : ti->gid))
+               nifd->namenode->statoverride->gid : ti->gid) && !fc_nonroot)
       ohshite(_("error setting ownership of symlink `%.255s'"), ti->name);
     break;
   case tar_filetype_dir:
@@ -825,7 +825,7 @@
       varbufaddc(&symlinkfn, '\0');
       if (symlink(symlinkfn.buf,fnametmpvb.buf))
         ohshite(_("unable to make backup symlink for `%.255s'"), ti->name);
-      if (lchown(fnametmpvb.buf,stab.st_uid,stab.st_gid))
+      if (lchown(fnametmpvb.buf,stab.st_uid,stab.st_gid) && !fc_nonroot)
         ohshite(_("unable to chown backup symlink for `%.255s'"), ti->name);
       set_selinux_path_context(fnamevb.buf, fnametmpvb.buf, stab.st_mode);
     } else {
@@ -881,7 +881,7 @@
 
     setupfnamevbs(usename);
 
-    fd = open(fnamenewvb.buf, O_WRONLY);
+    fd = open(fnamenewvb.buf, fc_nonroot? O_EXCL : O_WRONLY);
     if (fd < 0)
       ohshite(_("unable to open '%.255s'"), fnamenewvb.buf);
     sync_file_range(fd, 0, 0, SYNC_FILE_RANGE_WAIT_BEFORE);
@@ -928,7 +928,7 @@
 
       debug(dbg_eachfiledetail, "deferred extract needs fsync");
 
-      fd = open(fnamenewvb.buf, O_WRONLY);
+      fd = open(fnamenewvb.buf, fc_nonroot ? O_EXCL : O_WRONLY);
       if (fd < 0)
         ohshite(_("unable to open '%.255s'"), fnamenewvb.buf);
       if (fsync(fd))
Only in ../dpkg-1.15.8.10/src: archives.c~
diff -bBu -r ./src/filesdb.c ../dpkg-1.15.8.10/src/filesdb.c
--- ./src/filesdb.c	2011-01-30 20:37:44.000000000 +0100
+++ ../dpkg-1.15.8.10/src/filesdb.c	2011-02-14 21:31:49.000000000 +0100
@@ -478,7 +478,8 @@
   
   file= fopen(newvb.buf,"w+");
   if (!file)
-    ohshite(_("unable to create updated files list file for package %s"),pkg->name);
+    ohshite(_("unable to create updated files list file in %s for package %s"),
+            newvb.buf, pkg->name);
   push_cleanup(cu_closefile, ehflag_bombout, NULL, 0, 1, (void *)file);
   while (list) {
     if (!(leaveout && (list->namenode->flags & fnnf_elide_other_lists))) {
diff -bBu -r ./src/help.c ../dpkg-1.15.8.10/src/help.c
--- ./src/help.c	2011-01-30 20:37:44.000000000 +0100
+++ ../dpkg-1.15.8.10/src/help.c	2011-02-14 19:35:32.000000000 +0100
@@ -184,9 +184,14 @@
   size_t instdirl;
 
   if (*instdir) {
+    if (!fc_nonroot) {
     if (chroot(instdir)) ohshite(_("failed to chroot to `%.250s'"),instdir);
     if (chdir("/"))
       ohshite(_("failed to chdir to `%.255s'"), "/");
+    } else {
+      if (chdir(instdir))
+        ohshite(_("failed to chdir to `%.255s'"), instdir);
+    }
   }
   if (f_debug & dbg_scripts) {
     struct varbuf args = VARBUF_INIT;

Reply via email to