Comment 7 for bug 165074

Revision history for this message
In , Paul Donohue (s-launchpad-paulsd-com) wrote : checkinstall - chmod 700 cause

Package: checkinstall
Version: 1.5.3-3
Followup-For: Bug #342578

The problem is line 211 in the checkinstall script (version 1.5.3-3):
206 function restore_backup {
207 ls ${TMP_DIR}/backup/* &> /dev/null
208 if [ $? -eq 0 ]; then
209 echo -n "Restoring overwritten files from backup..."
210 cd ${TMP_DIR}/backup
211 tar -cpf - . | tar -f - -xvpC / &> /dev/null
212 okfail
213 echo
214 fi
215 }

Backups are by default enabled in checkinstall 1.5.3.

The $TMP_DIR/backup directory is created chmod 700 (it looks like it's created by installwatch):
ls -ld /var/tmp/GCZUQqPIlOGQmQcZCPbN/backup/
drwx------ 2 root root 48 2006-11-13 15:45 /var/tmp/GCZUQqPIlOGQmQcZCPbN/backup/

If ctrl-c is hit from inside checkinstall, the cleanup function is called.
The cleanup function then calls restore_backup.
If any files exist in $TMP_DIR/backup when restore_backup is called, it restores those files using the tar commands on line 211.

Line 211 tars up any files in $TMP_DIR/backup (including $TMP_DIR/backup itself), then restores those files and their permissions in /
Since $TMP_DIR/backup is chmod 700, after restoring the backup files, / will also be chmod 700

Perhaps line 211 should be changed to this?
tar -cpf - * | tar -f - -xvpC / &> /dev/null

-------------------

checkinstall 1.6.0 doesn't have this problem because translation is enabled by default:
function restore_backup {
 # If we have translation turned on then we didn't do a backup
 if [ "${TRANSLATE}" = "1" ]; then return 0; fi

 # Else, restore the backup if it exists

 rm -rf ${TMP_DIR}/BACKUP/no-backup &> /dev/null

 ls ${TMP_DIR}/BACKUP/* &> /dev/null
 if [ $? -eq 0 ]; then
    echogn "Restoring overwritten files from backup..."
    cd ${TMP_DIR}/BACKUP
       $TAR -cpf - . | $TAR -f - -xvpC / &> /dev/null
    okfail
    echo
 fi
}

However, if translation were to be disabled, the problem would resurface.

-------------------

Note that checkinstall 1.6.1 was recently released... (As far as this problem is concerned, checkinstall 1.6.1 and 1.6.0 behave the same)

-------------------

Two other unrelated bugs I came across while researching this one:

#1:
In checkinstall 1.6.0/1.6.1, due to the new translation feature, even if you tell checkinstall NOT to exclude files installed into `pwd`, it will exclude them.
The files in pwd need to be copied to the translation directory to be included in the package, but they aren't copied.
If translation is enabled, the files should be copied over (immediately after checking for files in pwd - around line 1525 in 1.6.0 - the user is given an opportunity to edit the list of files, and if the user adds any new files, those files are automatically copied if translation is enabled - but it doesn't happen unless '--inspect' is passed on the command line).

#2:
$TMP_DIR should begin with a '/' :
! [ "$BASE_TMP_DIR" ] && BASE_TMP_DIR=/var/tmp
TMP_DIR=${BASE_TMP_DIR}/`awk 'BEGIN { srand(); for (i=1;i<21;i++) { a=95; while (a > 90 && a < 97) { a=65+int(50*rand())}; printf("%c", a) } }'`

However, there are a number of places in the code where the variable is used as '/$TMP_DIR', so you end up with '//var/tmp/...'

Of course, it works just fine this way, but it can be a tad confusing and it is technically incorrect, so it is probably worth grepping the code for those cases and fixing them...