mirror of
https://github.com/moparisthebest/pacman
synced 2025-03-11 07:31:04 -04:00
Release resources on error paths.
Some resources (memory or file descriptors) are not released on all error paths. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org> Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
1291c04961
commit
681509fd44
@ -466,7 +466,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prepare directory for database entries so permission are correct after
|
/* prepare directory for database entries so permissions are correct after
|
||||||
changelog/install script installation */
|
changelog/install script installation */
|
||||||
if(_alpm_local_db_prepare(db, newpkg)) {
|
if(_alpm_local_db_prepare(db, newpkg)) {
|
||||||
alpm_logaction(handle, ALPM_CALLER_PREFIX,
|
alpm_logaction(handle, ALPM_CALLER_PREFIX,
|
||||||
@ -503,6 +503,9 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
|
|||||||
_alpm_log(handle, ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"),
|
_alpm_log(handle, ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"),
|
||||||
handle->root, strerror(errno));
|
handle->root, strerror(errno));
|
||||||
_alpm_archive_read_free(archive);
|
_alpm_archive_read_free(archive);
|
||||||
|
if(cwdfd >= 0) {
|
||||||
|
close(cwdfd);
|
||||||
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -48,9 +48,10 @@ int _alpm_split_backup(const char *string, alpm_backup_t **backup)
|
|||||||
ptr++;
|
ptr++;
|
||||||
/* now str points to the filename and ptr points to the hash */
|
/* now str points to the filename and ptr points to the hash */
|
||||||
STRDUP((*backup)->name, str, FREE(str); return -1);
|
STRDUP((*backup)->name, str, FREE(str); return -1);
|
||||||
STRDUP((*backup)->hash, ptr, FREE(str); return -1);
|
STRDUP((*backup)->hash, ptr, FREE((*backup)->name); FREE(str); return -1);
|
||||||
FREE(str);
|
FREE(str);
|
||||||
return 0;}
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Look for a filename in a alpm_pkg_t.backup list. If we find it,
|
/* Look for a filename in a alpm_pkg_t.backup list. If we find it,
|
||||||
* then we return the full backup entry.
|
* then we return the full backup entry.
|
||||||
|
@ -800,18 +800,24 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
|
|||||||
(len = _alpm_strip_newline(line, 0))) {
|
(len = _alpm_strip_newline(line, 0))) {
|
||||||
if(!_alpm_greedy_grow((void **)&files, &files_size,
|
if(!_alpm_greedy_grow((void **)&files, &files_size,
|
||||||
(files_count ? (files_count + 1) * sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
|
(files_count ? (files_count + 1) * sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
|
||||||
goto error;
|
goto nomem;
|
||||||
}
|
}
|
||||||
/* since we know the length of the file string already,
|
/* since we know the length of the file string already,
|
||||||
* we can do malloc + memcpy rather than strdup */
|
* we can do malloc + memcpy rather than strdup */
|
||||||
len += 1;
|
len += 1;
|
||||||
MALLOC(files[files_count].name, len, goto error);
|
MALLOC(files[files_count].name, len, goto nomem);
|
||||||
memcpy(files[files_count].name, line, len);
|
memcpy(files[files_count].name, line, len);
|
||||||
files_count++;
|
files_count++;
|
||||||
}
|
}
|
||||||
/* attempt to hand back any memory we don't need */
|
/* attempt to hand back any memory we don't need */
|
||||||
if(files_count > 0) {
|
if(files_count > 0) {
|
||||||
files = realloc(files, sizeof(alpm_file_t) * files_count);
|
alpm_file_t *newfiles;
|
||||||
|
|
||||||
|
newfiles = realloc(files, sizeof(alpm_file_t) * files_count);
|
||||||
|
if(newfiles != NULL) {
|
||||||
|
files = newfiles;
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure the list is sorted */
|
/* make sure the list is sorted */
|
||||||
qsort(files, files_count, sizeof(alpm_file_t), _alpm_files_cmp);
|
qsort(files, files_count, sizeof(alpm_file_t), _alpm_files_cmp);
|
||||||
} else {
|
} else {
|
||||||
@ -819,6 +825,13 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
|
|||||||
}
|
}
|
||||||
info->files.count = files_count;
|
info->files.count = files_count;
|
||||||
info->files.files = files;
|
info->files.files = files;
|
||||||
|
continue;
|
||||||
|
nomem:
|
||||||
|
while(files_count > 0) {
|
||||||
|
FREE(files[--files_count].name);
|
||||||
|
}
|
||||||
|
FREE(files);
|
||||||
|
goto error;
|
||||||
} else if(strcmp(line, "%BACKUP%") == 0) {
|
} else if(strcmp(line, "%BACKUP%") == 0) {
|
||||||
while(safe_fgets(line, sizeof(line), fp) && _alpm_strip_newline(line, 0)) {
|
while(safe_fgets(line, sizeof(line), fp) && _alpm_strip_newline(line, 0)) {
|
||||||
alpm_backup_t *backup;
|
alpm_backup_t *backup;
|
||||||
|
@ -762,6 +762,7 @@ int SYMEXPORT alpm_pkg_load(alpm_handle_t *handle, const char *filename, int ful
|
|||||||
|
|
||||||
if(fail) {
|
if(fail) {
|
||||||
_alpm_log(handle, ALPM_LOG_ERROR, _("required key missing from keyring\n"));
|
_alpm_log(handle, ALPM_LOG_ERROR, _("required key missing from keyring\n"));
|
||||||
|
free(sigpath);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user