[C con Clase] puntero a una funcion

Gonzalez Lazaro, Edgar edgar.gonzalezlazaro en eds.com
Lun Dic 29 22:58:38 CET 2008


1.- Por que declaras static la variable buf
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.
4.- buf nunca sera nulo.
5.- que pasa si yo pongo en val "asdf or 1=1 --" ;-)

________________________________

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


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


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