[C con Clase] puntero a una funcion

Gonzalez Lazaro, Edgar edgar.gonzalezlazaro en eds.com
Mar Dic 30 22:58:57 CET 2008


Recuerda que un apuntador no inicializado apunta a una dirección indefinida a menos que tu compilador
tenga un comportamiento diferente ya sea por defecto o porque tu así se lo hayas dicho.
Lo que estaría bien que revisaras son tus validaciones. Con respecto a "asdf OR 1 = 1" supón entonces 
que de alguna forma tu base de datos fue corrompida o que tu pila fue alterada de tal forma que se 
logra insertar esta cadena, entonces se actualizaran todos los registros de tu base de datos ¿no? Es una 
observación que no viene a colación con tu pregunta pero hay algunas deficiencias de seguridad
en ese código, que son ejemplos muy útiles para todos.
 
Seria bueno que si la variable val siempre tiene un entero positivo entonces ese argumento sea un entero positivo.
 
Un Saludo para todos.
 
 

________________________________

De: cconclase-bounces en listas.conclase.net en nombre de Jorge Medina
Enviado el: mar 30/12/2008 08:33
Para: Lista de correo sobre C y C++
Asunto: Re: [C con Clase] puntero a una funcion



On Mon, Dec 29, 2008 at 6:58 PM, Gonzalez Lazaro, Edgar
<edgar.gonzalezlazaro en eds.com> wrote:
> 1.- Por que declaras static la variable buf
solo por convencion no esta declarado asi en realdad es char * buff = NULL
> 2.- todo apuntador se debe inicializar a NULL.
> 3.- El entero len tiene un valor aleatorio y si sql == NULL y val == NULL
>     estaras iniciando un buffer de un tamaño aleatorio generalmente muy grande.
bueno ya puse que si un argumento viene NULL retorne NULL de inmediato;
 4.- buf nunca sera nulo.
mientras encuentre memoria no sera NULL pero si malloc falla es NULL
> 5.- que pasa si yo pongo en val "asdf or 1=1 --" ;-)
se caeria pero val siempre recibirar un campo numerico que esta en la
DB de lo contrario no habria registro ya que es el ID del registro.
>
> ________________________________
>
> De: cconclase-bounces en listas.conclase.net en nombre de Jorge Medina
> Enviado el: mar 23/12/2008 11:02
> Para: Lista de correo sobre C y C++
> Asunto: [C con Clase] puntero a una funcion
>
>
>
> hola lista
>
> Tengo un problemita con un puntero a una funcion, lo que sucede es que
> la funcion hace su trabajo pero el puntero donde espero el resultado a
> un blocke de memoria allocada no obtiene la referencia;
>
> la funcion es la siguiente:
>
> char *mdb_sql(char *sql,char *val)
> {
>    static char *buf;
>    int len;
>
>    if (sql != NULL && val != NULL)
>        len = strlen(sql)+strlen(val)+sizeof(char);
>    buf = (char *)malloc(len);
>    if(buf != NULL)
>        snprintf(buf,len,sql,val);
>    else
>        perror("mdb_strcat no memory");
>    return buf;
> }
>
> la llamada es la siguiente:
>
>            setNewState = mdb_sql("UPDATE empleado SET estado_id = 1
> WHERE empleado_id = %s",PQgetvalue(res,i,0));
>            if (setNewState == NULL)
>                continue;
>            if ( PQresultStatus(PQexec(c,setNewState)) !=
> PGRES_COMMAND_OK ) { // es aqui donde se me cae el programita y la
> variable setNewState esta completamente sin referencia
>                fprintf(stderr,"Failed Update user: %s",PQgetvalue(res, i, 1));
>            }
>
>
> eh aqui la traza:
>
> Breakpoint 1, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:49
> 49          if (cfgsql != NULL && val != NULL)
> (gdb) continue
> Continuing.
>
> Breakpoint 2, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:50
> 50              len = strlen(cfgsql)+strlen(val)+sizeof(char);
> (gdb) continue
> Continuing.
>
> Breakpoint 3, mdb_sql (cfgsql=0x8014288c5
> "gelatos.cl/istegmaier/Maildir", val=0x39 <Error reading address 0x39:
> Bad address>) at src/util.c:51
> 51          buf = (char *)malloc(len);
> (gdb) continue
> Continuing.
>
> Breakpoint 4, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:52
> 52          if(buf != NULL)
> (gdb) continue
> Continuing.
>
> Breakpoint 5, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:53
> 53              snprintf(buf,len,cfgsql,val);
> (gdb) continue
> Continuing.
>
> Breakpoint 8, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:57
> 57      }
> (gdb) p buf
> $8 = 0x801408040 "UPDATE empleado SET estado_id = 1 WHERE empleado_id = 2277"
> (gdb) continue
> Continuing.
>
> Breakpoint 9, findNewAcounts () at src/mdbuilder.c:118
> 118                 if ( PQresultStatus(PQexec(c,setNewState)) !=
> PGRES_COMMAND_OK ) {
> (gdb) continue
> Continuing.
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x000000080093f572 in strlen () from /lib/libc.so.7
>
>
> Cualquier sugerencia gracias;
>
> --
> Jorge Andrés Medina Oliva.
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



--
Jorge Andrés Medina Oliva.

_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: winmail.dat
Type: application/ms-tnef
Size: 9692 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20081230/3ac2391b/attachment.bin>


Más información sobre la lista de distribución Cconclase