manu-projects / manu-cproject

1 stars 0 forks source link

Solucion a memory leak en for de paquete de servidor.c #68

Open AlejoGol opened 2 years ago

AlejoGol commented 2 years ago

Agregar dentro de deserializar al final del for: mensajes[index + 1] = NULL; De esta forma en el for de paquete de servidor.c no queda basura al final de mensajes y se cierra

Antes:

void** deserializar_paquete(t_paquete* paquete_serializado) {
  int offset, size_mensaje;

  // lo tratamos como un arreglo de mensajes
  void** mensajes = NULL; // TODO: need free()

  offset = 0;

  // tamaño de cada mensaje dentro del paquete, varía según el contenido de cada
  // mensaje
  size_mensaje = 0;
  for (int index = 0, n = 1; offset < paquete_serializado->buffer->size;
       n++, index++) {
    mensajes = realloc(mensajes, sizeof(t_buffer) * n);

    t_buffer* mensaje = empty_buffer();

    size_mensaje = (int)(paquete_serializado->buffer->stream + offset);
    mensaje->size = size_mensaje;

    // nos desplazamos 4 bytes, para no pisar el `buffer->size` que escribimos
    // con el anterior memcpy
    offset += sizeof(int);
    mensaje->stream = malloc(size_mensaje); // TODO: need free()
    memcpy(mensaje->stream,
           paquete_serializado->buffer->stream + offset,
           size_mensaje);

    // agregamos el mensaje como un elemento de un arreglo
    mensajes[index] = (t_buffer*)mensaje;

    // nos desplazamos buffer->size es decir el tamaño de buffer->stream
    // asi en la sig. iteración obtenemos el siguiente mensaje
    offset += size_mensaje;
  }
  // mensajes[paquete_serializado->buffer->size] = NULL;
  return mensajes;
}

Despues:

void** deserializar_paquete(t_paquete* paquete_serializado) {
  int offset, size_mensaje;

  // lo tratamos como un arreglo de mensajes
  void** mensajes = NULL; // TODO: need free()

  offset = 0;

  // tamaño de cada mensaje dentro del paquete, varía según el contenido de cada
  // mensaje
  size_mensaje = 0;
  for (int index = 0, n = 1; offset < paquete_serializado->buffer->size;
       n++, index++) {
    mensajes = realloc(mensajes, sizeof(t_buffer) * n);

    t_buffer* mensaje = empty_buffer();

    size_mensaje = (int)(paquete_serializado->buffer->stream + offset);
    mensaje->size = size_mensaje;

    // nos desplazamos 4 bytes, para no pisar el `buffer->size` que escribimos
    // con el anterior memcpy
    offset += sizeof(int);
    mensaje->stream = malloc(size_mensaje); // TODO: need free()
    memcpy(mensaje->stream,
           paquete_serializado->buffer->stream + offset,
           size_mensaje);

    // agregamos el mensaje como un elemento de un arreglo
    mensajes[index] = (t_buffer*)mensaje;

    // nos desplazamos buffer->size es decir el tamaño de buffer->stream
    // asi en la sig. iteración obtenemos el siguiente mensaje
    offset += size_mensaje;

    // ponemos NULL al final de los mensajes para poder facilmente identificar el final y que no haya basura 
    mensajes[index + 1] = NULL;
  }
  // mensajes[paquete_serializado->buffer->size] = NULL;
  return mensajes;
}
AlejoGol commented 2 years ago

Ignorar la linea // mensajes[paquete_serializado->buffer->size] = NULL;

neverkas commented 2 years ago

Hay que volver a chequear porque no se resolvió.