/*
  zip_extra_field.c -- manipulate extra fields
  Copyright (C) 2012-2019 Dieter Baron and Thomas Klausner

  This file is part of libzip, a library to manipulate ZIP archives.
  The authors can be contacted at <libzip@nih.at>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:
  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.
  3. The names of the authors may not be used to endorse or promote
     products derived from this software without specific prior
     written permission.

  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <stdlib.h>
#include <string.h>

#include "zipint.h"


zip_extra_field_t *
_zip_ef_clone(const zip_extra_field_t *ef, zip_error_t *error) {
    zip_extra_field_t *head, *prev, *def;

    head = prev = NULL;

    while (ef) {
	if ((def = _zip_ef_new(ef->id, ef->size, ef->data, ef->flags)) == NULL) {
	    zip_error_set(error, ZIP_ER_MEMORY, 0);
	    _zip_ef_free(head);
	    return NULL;
	}

	if (head == NULL)
	    head = def;
	if (prev)
	    prev->next = def;
	prev = def;

	ef = ef->next;
    }

    return head;
}


zip_extra_field_t *
_zip_ef_delete_by_id(zip_extra_field_t *ef, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags) {
    zip_extra_field_t *head, *prev;
    int i;

    i = 0;
    head = ef;
    prev = NULL;
    for (; ef; ef = (prev ? prev->next : head)) {
	if ((ef->flags & flags & ZIP_EF_BOTH) && ((ef->id == id) || (id == ZIP_EXTRA_FIELD_ALL))) {
	    if (id_idx == ZIP_EXTRA_FIELD_ALL || i == id_idx) {
		ef->flags &= ~(flags & ZIP_EF_BOTH);
		if ((ef->flags & ZIP_EF_BOTH) == 0) {
		    if (prev)
			prev->next = ef->next;
		    else
			head = ef->next;
		    ef->next = NULL;
		    _zip_ef_free(ef);

		    if (id_idx == ZIP_EXTRA_FIELD_ALL)
			continue;
		}
	    }

	    i++;
	    if (i > id_idx)
		break;
	}
	prev = ef;
    }

    return head;
}


void
_zip_ef_free(zip_extra_field_t *ef) {
    zip_extra_field_t *ef2;

    while (ef) {
	ef2 = ef->next;
	free(ef->data);
	free(ef);
	ef = ef2;
    }
}


const zip_uint8_t *
_zip_ef_get_by_id(const zip_extra_field_t *ef, zip_uint16_t *lenp, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags, zip_error_t *error) {
    static const zip_uint8_t empty[1] = {'\0'};

    int i;

    i = 0;
    for (; ef; ef = ef->next) {
	if (ef->id == id && (ef->flags & flags & ZIP_EF_BOTH)) {
	    if (i < id_idx) {
		i++;
		continue;
	    }

	    if (lenp)
		*lenp = ef->size;
	    if (ef->size > 0)
		return ef->data;
	    else
		return empty;
	}
    }

    zip_error_set(error, ZIP_ER_NOENT, 0);
    return NULL;
}


zip_extra_field_t *
_zip_ef_merge(zip_extra_field_t *to, zip_extra_field_t *from) {
    zip_extra_field_t *ef2, *tt, *tail;
    int duplicate;

    if (to == NULL)
	return from;

    for (tail = to; tail->next; tail = tail->next)
	;

    for (; from; from = ef2) {
	ef2 = from->next;

	duplicate = 0;
	for (tt = to; tt; tt = tt->next) {
	    if (tt->id == from->id && tt->size == from->size && (tt->size == 0 || memcmp(tt->data, from->data, tt->size) == 0)) {
		tt->flags |= (from->flags & ZIP_EF_BOTH);
		duplicate = 1;
		break;
	    }
	}

	from->next = NULL;
	if (duplicate)
	    _zip_ef_free(from);
	else
	    tail = tail->next = from;
    }

    return to;
}


zip_extra_field_t *
_zip_ef_new(zip_uint16_t id, zip_uint16_t size, const zip_uint8_t *data, zip_flags_t flags) {
    zip_extra_field_t *ef;

    if ((ef = (zip_extra_field_t *)malloc(sizeof(*ef))) == NULL)
	return NULL;

    ef->next = NULL;
    ef->flags = flags;
    ef->id = id;
    ef->size = size;
    if (size > 0) {
	if ((ef->data = (zip_uint8_t *)_zip_memdup(data, size, NULL)) == NULL) {
	    free(ef);
	    return NULL;
	}
    }
    else
	ef->data = NULL;

    return ef;
}


bool
_zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, zip_extra_field_t **ef_head_p, zip_error_t *error) {
    zip_buffer_t *buffer;
    zip_extra_field_t *ef, *ef2, *ef_head;

    if ((buffer = _zip_buffer_new((zip_uint8_t *)data, len)) == NULL) {
	zip_error_set(error, ZIP_ER_MEMORY, 0);
	return false;
    }

    ef_head = ef = NULL;

    while (_zip_buffer_ok(buffer) && _zip_buffer_left(buffer) >= 4) {
	zip_uint16_t fid, flen;
	zip_uint8_t *ef_data;

	fid = _zip_buffer_get_16(buffer);
	flen = _zip_buffer_get_16(buffer);
	ef_data = _zip_buffer_get(buffer, flen);

	if (ef_data == NULL) {
	    zip_error_set(error, ZIP_ER_INCONS, 0);
	    _zip_buffer_free(buffer);
	    _zip_ef_free(ef_head);
	    return false;
	}

	if ((ef2 = _zip_ef_new(fid, flen, ef_data, flags)) == NULL) {
	    zip_error_set(error, ZIP_ER_MEMORY, 0);
	    _zip_buffer_free(buffer);
	    _zip_ef_free(ef_head);
	    return false;
	}

	if (ef_head) {
	    ef->next = ef2;
	    ef = ef2;
	}
	else
	    ef_head = ef = ef2;
    }

    if (!_zip_buffer_eof(buffer)) {
	/* Android APK files align stored file data with padding in extra fields; ignore. */
	/* see https://android.googlesource.com/platform/build/+/master/tools/zipalign/ZipAlign.cpp */
	size_t glen = _zip_buffer_left(buffer);
	zip_uint8_t *garbage;
	garbage = _zip_buffer_get(buffer, glen);
	if (glen >= 4 || garbage == NULL || memcmp(garbage, "\0\0\0", glen) != 0) {
	    zip_error_set(error, ZIP_ER_INCONS, 0);
	    _zip_buffer_free(buffer);
	    _zip_ef_free(ef_head);
	    return false;
	}
    }

    _zip_buffer_free(buffer);

    if (ef_head_p) {
	*ef_head_p = ef_head;
    }
    else {
	_zip_ef_free(ef_head);
    }

    return true;
}


zip_extra_field_t *
_zip_ef_remove_internal(zip_extra_field_t *ef) {
    zip_extra_field_t *ef_head;
    zip_extra_field_t *prev, *next;

    ef_head = ef;
    prev = NULL;

    while (ef) {
	if (ZIP_EF_IS_INTERNAL(ef->id)) {
	    next = ef->next;
	    if (ef_head == ef)
		ef_head = next;
	    ef->next = NULL;
	    _zip_ef_free(ef);
	    if (prev)
		prev->next = next;
	    ef = next;
	}
	else {
	    prev = ef;
	    ef = ef->next;
	}
    }

    return ef_head;
}


zip_uint16_t
_zip_ef_size(const zip_extra_field_t *ef, zip_flags_t flags) {
    zip_uint16_t size;

    size = 0;
    for (; ef; ef = ef->next) {
	if (ef->flags & flags & ZIP_EF_BOTH)
	    size = (zip_uint16_t)(size + 4 + ef->size);
    }

    return size;
}


int
_zip_ef_write(zip_t *za, const zip_extra_field_t *ef, zip_flags_t flags) {
    zip_uint8_t b[4];
    zip_buffer_t *buffer = _zip_buffer_new(b, sizeof(b));

    if (buffer == NULL) {
	return -1;
    }

    for (; ef; ef = ef->next) {
	if (ef->flags & flags & ZIP_EF_BOTH) {
	    _zip_buffer_set_offset(buffer, 0);
	    _zip_buffer_put_16(buffer, ef->id);
	    _zip_buffer_put_16(buffer, ef->size);
	    if (!_zip_buffer_ok(buffer)) {
		zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
		_zip_buffer_free(buffer);
		return -1;
	    }
	    if (_zip_write(za, b, 4) < 0) {
		_zip_buffer_free(buffer);
		return -1;
	    }
	    if (ef->size > 0) {
		if (_zip_write(za, ef->data, ef->size) < 0) {
		    _zip_buffer_free(buffer);
		    return -1;
		}
	    }
	}
    }

    _zip_buffer_free(buffer);
    return 0;
}


int
_zip_read_local_ef(zip_t *za, zip_uint64_t idx) {
    zip_entry_t *e;
    unsigned char b[4];
    zip_buffer_t *buffer;
    zip_uint16_t fname_len, ef_len;

    if (idx >= za->nentry) {
	zip_error_set(&za->error, ZIP_ER_INVAL, 0);
	return -1;
    }

    e = za->entry + idx;

    if (e->orig == NULL || e->orig->local_extra_fields_read)
	return 0;

    if (e->orig->offset + 26 > ZIP_INT64_MAX) {
	zip_error_set(&za->error, ZIP_ER_SEEK, EFBIG);
	return -1;
    }

    if (zip_source_seek(za->src, (zip_int64_t)(e->orig->offset + 26), SEEK_SET) < 0) {
	_zip_error_set_from_source(&za->error, za->src);
	return -1;
    }

    if ((buffer = _zip_buffer_new_from_source(za->src, sizeof(b), b, &za->error)) == NULL) {
	return -1;
    }

    fname_len = _zip_buffer_get_16(buffer);
    ef_len = _zip_buffer_get_16(buffer);

    if (!_zip_buffer_eof(buffer)) {
	_zip_buffer_free(buffer);
	zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
	return -1;
    }

    _zip_buffer_free(buffer);

    if (ef_len > 0) {
	zip_extra_field_t *ef;
	zip_uint8_t *ef_raw;

	if (zip_source_seek(za->src, fname_len, SEEK_CUR) < 0) {
	    zip_error_set(&za->error, ZIP_ER_SEEK, errno);
	    return -1;
	}

	ef_raw = _zip_read_data(NULL, za->src, ef_len, 0, &za->error);

	if (ef_raw == NULL)
	    return -1;

	if (!_zip_ef_parse(ef_raw, ef_len, ZIP_EF_LOCAL, &ef, &za->error)) {
	    free(ef_raw);
	    return -1;
	}
	free(ef_raw);

	if (ef) {
	    ef = _zip_ef_remove_internal(ef);
	    e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef);
	}
    }

    e->orig->local_extra_fields_read = 1;

    if (e->changes && e->changes->local_extra_fields_read == 0) {
	e->changes->extra_fields = e->orig->extra_fields;
	e->changes->local_extra_fields_read = 1;
    }

    return 0;
}
