Unverified Commit d6ec96f7 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

metalink: fix memory-leak and NULL pointer dereference

Reported by scan-build

Closes #2109
parent 979b012e
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -539,6 +539,7 @@ digest_context *Curl_digest_init(const digest_params *dparams)
  ctxt->digest_hash = dparams;

  if(dparams->digest_init(ctxt->digest_hashctx) != 1) {
    free(ctxt->digest_hashctx);
    free(ctxt);
    return NULL;
  }
@@ -557,6 +558,7 @@ int Curl_digest_update(digest_context *context,

int Curl_digest_final(digest_context *context, unsigned char *result)
{
  if(result)
    (*context->digest_hash->digest_final)(result, context->digest_hashctx);

  free(context->digest_hashctx);
@@ -622,6 +624,7 @@ static int check_hash(const char *filename,
  result = malloc(digest_def->dparams->digest_resultlen);
  if(!result) {
    close(fd);
    Curl_digest_final(dctx, NULL);
    return -1;
  }
  while(1) {
@@ -690,6 +693,8 @@ static metalink_checksum *new_metalink_checksum_from_hex_digest
    chksum->digest_def = digest_def;
    chksum->digest = digest;
  }
  else
    free(digest);
  return chksum;
}

@@ -781,9 +786,25 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
         curl_strequal((*p)->type, "ftp") ||
         curl_strequal((*p)->type, "ftps")) {
        res = new_metalink_resource((*p)->url);
        if(res) {
          tail->next = res;
          tail = res;
        }
        else {
          tail = root.next;

          /* clean up the linked list */
          while(tail) {
            res = tail->next;
            free(tail->url);
            free(tail);
            tail = res;
          }
          free(f->filename);
          free(f);
          return NULL;
        }
      }
    }
    f->resource = root.next;
  }