Package: mount
Version: 2.12p-4
Severity: normal
Tags: patch

Hi,

I found a bug in the loopback device routine in lomount.c

xgetpass() can return more than 128 bytes when it reads a passphrase
from fd specified by -p.  With such a long passphrase, current
lomount.c can generate different hash value every time, so user can
never correctly encrypt or decrypt files.

Following patch will fix the problem.

--- util-linux-2.12p.orig/mount/lomount.c       2005-06-24 20:39:36.073263112 
+0900
+++ util-linux-2.12p/mount/lomount.c    2005-06-24 21:12:33.783174438 +0900
@@ -397,18 +397,21 @@
        case LO_CRYPT_RIJNDAEL:
            {
 #define HASHLENGTH 20
-#define PASSWDBUFFLEN 130 /* getpass returns only max. 128 bytes, see man 
getpass */
                char keybits[2*HASHLENGTH]; 
-               char passwdbuff[PASSWDBUFFLEN];
+               char *passwdbuff;
+               int passwdlen;
                int keylength;
                int i;
 
                pass = xgetpass(pfd, _("Password: "));
-               strncpy(passwdbuff+1,pass,PASSWDBUFFLEN-1);
-               passwdbuff[PASSWDBUFFLEN-1] = '\0';
+               passwdlen = strlen(pass);
+               passwdbuff = malloc(passwdlen+2);
+               strcpy(passwdbuff+1,pass);
                passwdbuff[0] = 'A';
-               rmd160_hash_buffer(keybits,pass,strlen(pass));
-               
rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,strlen(pass)+1);
+               rmd160_hash_buffer(keybits,pass,passwdlen);
+               rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,passwdlen+1);
+               memset(pass, 0, passwdlen);
+               free(passwdbuff);
                memcpy((char*)loopinfo64.lo_encrypt_key,keybits,2*HASHLENGTH);
                keylength=0;
                for(i=0; crypt_type_tbl[i].id != -1; i++){
@@ -423,15 +426,18 @@
        default:
                if (hash_password) {
                    char keybits[2*HASHLENGTH]; 
-                   char passwdbuff[PASSWDBUFFLEN];
+                   char *passwdbuff;
+                   int passwdlen;
 
                    pass = xgetpass(pfd, _("Password: "));
-                   strncpy(passwdbuff+1,pass,PASSWDBUFFLEN-1);
-                   passwdbuff[PASSWDBUFFLEN-1] = '\0';
+                   passwdlen = strlen(pass);
+                   passwdbuff = malloc(passwdlen+2);
+                   strcpy(passwdbuff+1,pass);
                    passwdbuff[0] = 'A';
-                   rmd160_hash_buffer(keybits,pass,strlen(pass));
-                   
rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,strlen(pass)+1);
-                   memset(pass, 0, strlen(pass));
+                   rmd160_hash_buffer(keybits,pass,passwdlen);
+                   
rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,passwdlen+1);
+                   memset(pass, 0, passwdlen);
+                   free(passwdbuff);
                    memcpy((char*)loopinfo64.lo_encrypt_key,keybits,keysz/8);
                    loopinfo64.lo_encrypt_key_size = keysz/8;
                } else {


-- System Information:
Debian Release: 3.1
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.10-1-k7
Locale: LANG=ja_JP.UTF-8, LC_CTYPE=ja_JP.UTF-8 (charmap=UTF-8)

Versions of packages mount depends on:
ii  libblkid1                   1.37-1       block device id library
ii  libc6                       2.3.2.ds1-21 GNU C Library: Shared libraries an
ii  libuuid1                    1.37-1       universally unique id library

-- no debconf information

--
YAEGASHI Takeshi <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> <[EMAIL PROTECTED]>


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to