Quoting Christian Perrier ([EMAIL PROTECTED]): > Attached is the patch we applied to sarge regarding this bug. > > We have to check if it applies cleanly in woody.
The attached patch applies cleanly. I'm currently building a new version of the shadow package on a woody system to check if this fixes the DES/MD5 problem. PS : the build system of shadow in woody in incredibly better. All Debian specific patches were in debian/patches and there was a clean line between Debian specific patches and upstream sources, not the mess we currently have....:-(. This is exactly what I want to get back with the 4.0.3-32 release and the use of dpatch.
--- chpasswd.c.ori Wed Apr 6 09:07:01 2005 +++ chpasswd.c Wed Apr 6 08:59:47 2005 @@ -50,6 +50,7 @@ #include "defines.h" #include <pwd.h> #include <fcntl.h> +#include <getopt.h> #include "pwio.h" #ifdef SHADOWPWD #include "shadowio.h" @@ -57,6 +58,7 @@ static char *Prog; static int eflg = 0; +static int md5flg = 0; #ifdef SHADOWPWD static int is_shadow_pwd; #endif @@ -73,7 +75,7 @@ static void usage(void) { - fprintf(stderr, _("usage: %s [-e]\n"), Prog); + fprintf (stderr, _("usage: %s [--encrypted] [--md5]\n"), Prog); exit(1); } @@ -104,11 +106,32 @@ bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - /* XXX - use getopt() */ - if (!(argc == 1 || (argc == 2 && !strcmp(argv[1], "-e")))) - usage(); - if (argc == 2) - eflg = 1; + { + int option_index = 0; + int c; + static struct option long_options[] = { + { "encrypted", no_argument, &eflg, 1 }, + { "md5", no_argument, &md5flg, 1 }, + { 0 } + }; + + while ((c = getopt_long(argc,argv,"em",long_options,&option_index)) != -1) { + switch (c) { + case 'e': + eflg = 1; + break; + case 'm': + md5flg = 1; + break; + case 0: + /* long option */ + break; + default: + usage(); + break; + } + } + } /* * Lock the password file and open it for reading. This will @@ -182,8 +205,14 @@ continue; } newpwd = cp; - if (!eflg) - cp = pw_encrypt(newpwd, crypt_make_salt()); + if (!eflg) { + if (md5flg) { + char salt[12] = "$1$"; + strcat(salt,crypt_make_salt()); + cp = pw_encrypt (newpwd, salt); + } else + cp = pw_encrypt (newpwd, crypt_make_salt()); + } /* * Get the password file entry for this user. The user