Newsgroup: it.comp.lang.c++
Titolo: modifica a vnc 3.3.7 [è necessaria la seconda chiamata a free()???]

Salve a tutti,
sto modificando i sorgenti di VNC 3.3.7 per poter impostare la lunghezza della password da un max di 8 car. a un max di 16 car.
Purtroppo la routine di criptazione della password è concepita esclusivamente per 8 car, quindi pensavo di criptarla in due
passaggi, cioè i primi 8 caratteri in un primo step e gli ultimi 8 caratteri in un secondo step.
Pur rispettando la logica della routine originale, mi esce l'errore di access violation.
Nella decriptazione la routine ha la riga:
unsigned char *passwd = (unsigned char *)malloc(9);
la variabile passwd, essendo un parametro di ritorno, viene deallocata dalla routine chiamante quando la classe (chiamante) viene
deistanziata, cioè c'è la riga:
free(plaintext);
Dato che la variabile passwd viene utilizzata due volte, e non più una sola volta, debbo deallocarla anche nella routine interna?
cioè:
char *vncDecryptPasswd(char *inouttext)
{
    unsigned char *passwd = (unsigned char *)malloc(9);
// tralascio il resto del codice (non ce l'ho a portata di mano)
// 1° utilizzo
    deskey(fixedkey, DE1);
    des(inouttext, passwd);
// -> passwd devo deallocarla qui?
// tralascio il resto del codice (non ce l'ho a portata di mano)
// 2° utilizzo
    deskey(fixedkey, DE1);
    des(inouttext, passwd);
    passwd[8] = 0;
// tralascio il resto del codice (non ce l'ho a portata di mano)
    return (char *)passwd;
}
Grazie per un qualsiasi vostro commento
--
bye by salclem2
________________________
100%  ALL  TEST  PASSED
http://salclem2.altervista.org/
http://freeware.freeweb.supereva.it/
http://www.netuser.1cis.com/
http://netuser.altervista.org/

 Dato che la variabile passwd viene utilizzata due volte, e non più una sola volta, debbo deallocarla anche nella routine interna?
devi deallocarla solamente alla fine del secondo utilizzo:
chiamata ad alloc()
chiamata funzione...
seconda chiamata funzione...
chiamata a free()
-- 
si prepara direttamente nel bicchiere basso detto "tumbler basso". Tre o 
quattro cubetti di ghiaccio, aggiungere il gin, il martini rosso, il 
bitter campari e mescolare. Guarnire con una fetta d'arancia.


ho seguito le tue istruzioni ma ottengo lo stesso un errore:
http://www.geo.unimib.it/images/Image1.gif
a che cosa può essere dovuto?
grazie per ogni delucidazione

 a che cosa può essere dovuto?
ad un errore di programmazione. Prova, se riesci, a postare un blocco di 
codice compilabile che riproduca il difetto.
-- 
bash: nuotare: command not found

 ha scritto nel messaggio
news:3d8risF...@individual.net...

ecco il codice in causa:
//=========================================
class vncPasswd;
#if (!defined(_WINVNC_VNCPASSWD))
#define _WINVNC_VNCPASSWD
#include "stdhdrs.h"
extern "C" {
#include "vncauth.h"
}
// Password handling helper class
class vncPasswd
{
public:
    // Password decryptor!
    class ToText
    {
    public:
 inline ToText(const char encrypted[MAXPWLENDUP])
 {
     vnclog.Print(LL_INTINFO, VNCLOG("PASSWD : ToText called\n"));
     plaintext = vncDecryptPasswd((char *)encrypted);
 } <----- ******************* il punto in cui avviene l'errore **********************************
......omissis
// funzione chiamata dalla classe suddetta
char *
vncDecryptPasswd(char *inouttext)
{
 char partpwd[MAXPWLEN];
 char dencpwd[MAXPWLENDUP];
 if (truelengthpasswd == MAXPWLENDUP) {
  unsigned char *passwd = (unsigned char *)malloc(MAXPWLEN+1);
  unsigned char *passwddup = (unsigned char *)malloc(MAXPWLENDUP+1);
  mystrcpy(partpwd, (const char *) inouttext, 1, MAXPWLEN);
  deskey(fixedkey, DE1);
  des(partpwd, passwd);
  mystrcpy(dencpwd, passwd, 1, MAXPWLEN);
  dencpwd[MAXPWLEN] = '\0';
  mystrcpy(partpwd, (const char *) inouttext, 9, strlen(inouttext)-MAXPWLEN);
  deskey(fixedkey, DE1);
  des(partpwd, passwd);
  strncat(dencpwd, (const char *) passwd, MAXPWLEN);
  dencpwd[MAXPWLENDUP] = '\0';
  free(passwddup);
  free(passwd);
  return dencpwd;
 }
 else {
  unsigned char *passwd = (unsigned char *)malloc(MAXPWLEN+1);
  mystrcpy(partpwd, (const char *) inouttext, 1, MAXPWLEN);
  deskey(fixedkey, DE1);
  des(partpwd, passwd);
  mystrcpy(dencpwd, passwd, 1, MAXPWLEN);
  dencpwd[MAXPWLEN] = '\0';
  free(passwd);
  return dencpwd;
 }
}

 ecco il codice in causa:
il tuo codice così com'è non è compilabile, quindi l'unico avviso che 
posso darti è quello di verificare che le stringhe non sforino i buffer, 
soprattutto per quelli allocati sullo stack (quindi partpwd e dencpwd).
