libalpm: clean up of md5sum functions.
test_delta_md5sum and test_pkg_md5sum were simple wrappers to test_md5sum, and only used once, so not very useful. I removed them. Also, test_md5sum and alpm_pkg_checkmd5sum functions were a bit duplicated, so I refactored them with a new _alpm_test_md5sum function in libalpm/util.c Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
This commit is contained in:
parent
c2dbbd60bc
commit
d734ebdde2
|
@ -458,10 +458,9 @@ enum _pmerrno_t {
|
||||||
PM_ERR_PKG_CANT_FRESH,
|
PM_ERR_PKG_CANT_FRESH,
|
||||||
PM_ERR_PKG_CANT_REMOVE,
|
PM_ERR_PKG_CANT_REMOVE,
|
||||||
PM_ERR_PKG_INVALID_NAME,
|
PM_ERR_PKG_INVALID_NAME,
|
||||||
PM_ERR_PKG_CORRUPTED,
|
|
||||||
PM_ERR_PKG_REPO_NOT_FOUND,
|
PM_ERR_PKG_REPO_NOT_FOUND,
|
||||||
/* Deltas */
|
/* Deltas */
|
||||||
PM_ERR_DLT_CORRUPTED,
|
PM_ERR_DLT_INVALID,
|
||||||
PM_ERR_DLT_PATCHFAILED,
|
PM_ERR_DLT_PATCHFAILED,
|
||||||
/* Groups */
|
/* Groups */
|
||||||
PM_ERR_GRP_NOT_FOUND,
|
PM_ERR_GRP_NOT_FOUND,
|
||||||
|
|
|
@ -117,13 +117,11 @@ const char SYMEXPORT *alpm_strerror(int err)
|
||||||
return _("cannot remove all files for package");
|
return _("cannot remove all files for package");
|
||||||
case PM_ERR_PKG_INVALID_NAME:
|
case PM_ERR_PKG_INVALID_NAME:
|
||||||
return _("package name is not valid");
|
return _("package name is not valid");
|
||||||
case PM_ERR_PKG_CORRUPTED:
|
|
||||||
return _("corrupted package");
|
|
||||||
case PM_ERR_PKG_REPO_NOT_FOUND:
|
case PM_ERR_PKG_REPO_NOT_FOUND:
|
||||||
return _("no such repository");
|
return _("no such repository");
|
||||||
/* Deltas */
|
/* Deltas */
|
||||||
case PM_ERR_DLT_CORRUPTED:
|
case PM_ERR_DLT_INVALID:
|
||||||
return _("corrupted delta");
|
return _("invalid or corrupted delta");
|
||||||
case PM_ERR_DLT_PATCHFAILED:
|
case PM_ERR_DLT_PATCHFAILED:
|
||||||
return _("delta patch failed");
|
return _("delta patch failed");
|
||||||
/* Groups */
|
/* Groups */
|
||||||
|
|
|
@ -105,8 +105,7 @@ int SYMEXPORT alpm_pkg_free(pmpkg_t *pkg)
|
||||||
int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
|
int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
|
||||||
{
|
{
|
||||||
char *fpath;
|
char *fpath;
|
||||||
char *md5sum = NULL;
|
int retval;
|
||||||
int retval = 0;
|
|
||||||
|
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
|
||||||
|
@ -116,28 +115,16 @@ int SYMEXPORT alpm_pkg_checkmd5sum(pmpkg_t *pkg)
|
||||||
ASSERT(pkg->origin_data.db != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
ASSERT(pkg->origin_data.db != handle->db_local, RET_ERR(PM_ERR_PKG_INVALID, -1));
|
||||||
|
|
||||||
fpath = _alpm_filecache_find(alpm_pkg_get_filename(pkg));
|
fpath = _alpm_filecache_find(alpm_pkg_get_filename(pkg));
|
||||||
md5sum = alpm_get_md5sum(fpath);
|
|
||||||
|
|
||||||
if(md5sum == NULL) {
|
retval = _alpm_test_md5sum(fpath, alpm_pkg_get_md5sum(pkg));
|
||||||
_alpm_log(PM_LOG_ERROR, _("could not get md5sum for package %s-%s\n"),
|
|
||||||
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
|
if(retval == 0) {
|
||||||
pm_errno = PM_ERR_NOT_A_FILE;
|
return(0);
|
||||||
|
} else if (retval == 1) {
|
||||||
|
pm_errno = PM_ERR_PKG_INVALID;
|
||||||
retval = -1;
|
retval = -1;
|
||||||
} else {
|
|
||||||
if(strcmp(md5sum, alpm_pkg_get_md5sum(pkg)) == 0) {
|
|
||||||
_alpm_log(PM_LOG_DEBUG, "md5sums for package %s-%s match\n",
|
|
||||||
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
|
|
||||||
} else {
|
|
||||||
_alpm_log(PM_LOG_ERROR, _("md5sums do not match for package %s-%s\n"),
|
|
||||||
alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
|
|
||||||
pm_errno = PM_ERR_PKG_INVALID;
|
|
||||||
retval = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE(fpath);
|
|
||||||
FREE(md5sum);
|
|
||||||
|
|
||||||
return(retval);
|
return(retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -798,107 +798,29 @@ static int apply_deltas(pmtrans_t *trans, alpm_list_t *patches)
|
||||||
* @param trans the transaction
|
* @param trans the transaction
|
||||||
* @param filename the filename of the file to test
|
* @param filename the filename of the file to test
|
||||||
* @param md5sum the expected md5sum of the file
|
* @param md5sum the expected md5sum of the file
|
||||||
* @param data data to write the error messages to
|
|
||||||
*
|
*
|
||||||
* @return 0 if the md5sum matched, 1 otherwise
|
* @return 0 if the md5sum matched, 1 if not, -1 in case of errors
|
||||||
*/
|
*/
|
||||||
static int test_md5sum(pmtrans_t *trans, const char *filename,
|
static int test_md5sum(pmtrans_t *trans, const char *filename,
|
||||||
const char *md5sum, alpm_list_t **data)
|
const char *md5sum)
|
||||||
{
|
{
|
||||||
char *filepath;
|
char *filepath;
|
||||||
char *md5sum2;
|
int ret;
|
||||||
char *errormsg = NULL;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
filepath = _alpm_filecache_find(filename);
|
filepath = _alpm_filecache_find(filename);
|
||||||
md5sum2 = alpm_get_md5sum(filepath);
|
|
||||||
|
|
||||||
if(md5sum == NULL) {
|
ret = _alpm_test_md5sum(filepath, md5sum);
|
||||||
if(data) {
|
|
||||||
/* TODO wtf is this? malloc'd strings for error messages? */
|
if(ret == 1) {
|
||||||
if((errormsg = calloc(512, sizeof(char))) == NULL) {
|
|
||||||
RET_ERR(PM_ERR_MEMORY, -1);
|
|
||||||
}
|
|
||||||
snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"),
|
|
||||||
filename);
|
|
||||||
*data = alpm_list_add(*data, errormsg);
|
|
||||||
}
|
|
||||||
ret = 1;
|
|
||||||
} else if(md5sum2 == NULL) {
|
|
||||||
if(data) {
|
|
||||||
if((errormsg = calloc(512, sizeof(char))) == NULL) {
|
|
||||||
RET_ERR(PM_ERR_MEMORY, -1);
|
|
||||||
}
|
|
||||||
snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"),
|
|
||||||
filename);
|
|
||||||
*data = alpm_list_add(*data, errormsg);
|
|
||||||
}
|
|
||||||
ret = 1;
|
|
||||||
} else if(strcmp(md5sum, md5sum2) != 0) {
|
|
||||||
int doremove = 0;
|
int doremove = 0;
|
||||||
QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, (char *)filename,
|
QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, (char *)filename,
|
||||||
NULL, NULL, &doremove);
|
NULL, NULL, &doremove);
|
||||||
if(doremove) {
|
if(doremove) {
|
||||||
unlink(filepath);
|
unlink(filepath);
|
||||||
}
|
}
|
||||||
if(data) {
|
|
||||||
if((errormsg = calloc(512, sizeof(char))) == NULL) {
|
|
||||||
RET_ERR(PM_ERR_MEMORY, -1);
|
|
||||||
}
|
|
||||||
snprintf(errormsg, 512, _("file %s was corrupted (bad MD5 checksum)\n"),
|
|
||||||
filename);
|
|
||||||
*data = alpm_list_add(*data, errormsg);
|
|
||||||
}
|
|
||||||
ret = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE(filepath);
|
FREE(filepath);
|
||||||
FREE(md5sum2);
|
|
||||||
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Compares the md5sum of a delta to the expected value.
|
|
||||||
*
|
|
||||||
* @param trans the transaction
|
|
||||||
* @param delta the delta to test
|
|
||||||
* @param data data to write the error messages to
|
|
||||||
*
|
|
||||||
* @return 0 if the md5sum matched, 1 otherwise
|
|
||||||
*/
|
|
||||||
static int test_delta_md5sum(pmtrans_t *trans, pmdelta_t *delta,
|
|
||||||
alpm_list_t **data)
|
|
||||||
{
|
|
||||||
const char *filename;
|
|
||||||
const char *md5sum;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
filename = alpm_delta_get_filename(delta);
|
|
||||||
md5sum = alpm_delta_get_md5sum(delta);
|
|
||||||
|
|
||||||
ret = test_md5sum(trans, filename, md5sum, data);
|
|
||||||
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Compares the md5sum of a package to the expected value.
|
|
||||||
*
|
|
||||||
* @param trans the transaction
|
|
||||||
* @param pkg the package to test
|
|
||||||
* @param data data to write the error messages to
|
|
||||||
*
|
|
||||||
* @return 0 if the md5sum matched, 1 otherwise
|
|
||||||
*/
|
|
||||||
static int test_pkg_md5sum(pmtrans_t *trans, pmpkg_t *pkg, alpm_list_t **data)
|
|
||||||
{
|
|
||||||
const char *filename;
|
|
||||||
const char *md5sum;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
filename = alpm_pkg_get_filename(pkg);
|
|
||||||
md5sum = alpm_pkg_get_md5sum(pkg);
|
|
||||||
|
|
||||||
ret = test_md5sum(trans, filename, md5sum, data);
|
|
||||||
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
@ -908,7 +830,8 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
alpm_list_t *i, *j, *files = NULL;
|
alpm_list_t *i, *j, *files = NULL;
|
||||||
alpm_list_t *patches = NULL, *deltas = NULL;
|
alpm_list_t *patches = NULL, *deltas = NULL;
|
||||||
pmtrans_t *tr = NULL;
|
pmtrans_t *tr = NULL;
|
||||||
int replaces = 0, retval = 0;
|
int replaces = 0;
|
||||||
|
int errors = 0;
|
||||||
const char *cachedir = NULL;
|
const char *cachedir = NULL;
|
||||||
|
|
||||||
ALPM_LOG_FUNC;
|
ALPM_LOG_FUNC;
|
||||||
|
@ -999,22 +922,22 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
|
|
||||||
/* only output if there are deltas to work with */
|
/* only output if there are deltas to work with */
|
||||||
if(deltas) {
|
if(deltas) {
|
||||||
|
errors = 0;
|
||||||
/* Check integrity of deltas */
|
/* Check integrity of deltas */
|
||||||
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_START, NULL, NULL);
|
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_START, NULL, NULL);
|
||||||
|
|
||||||
for(i = deltas; i; i = i->next) {
|
for(i = deltas; i; i = i->next) {
|
||||||
pmdelta_t *d = alpm_list_getdata(i);
|
pmdelta_t *d = alpm_list_getdata(i);
|
||||||
|
const char *filename = alpm_delta_get_filename(d);
|
||||||
|
const char *md5sum = alpm_delta_get_md5sum(d);
|
||||||
|
|
||||||
ret = test_delta_md5sum(trans, d, data);
|
if(test_md5sum(trans, filename, md5sum) != 0) {
|
||||||
|
errors++;
|
||||||
if(ret == 1) {
|
*data = alpm_list_add(*data, strdup(filename));
|
||||||
retval = 1;
|
|
||||||
} else if(ret == -1) { /* -1 is for serious errors */
|
|
||||||
RET_ERR(pm_errno, -1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(retval) {
|
if(errors) {
|
||||||
pm_errno = PM_ERR_DLT_CORRUPTED;
|
pm_errno = PM_ERR_DLT_INVALID;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_DONE, NULL, NULL);
|
EVENT(trans, PM_TRANS_EVT_DELTA_INTEGRITY_DONE, NULL, NULL);
|
||||||
|
@ -1038,21 +961,20 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)
|
||||||
/* Check integrity of packages */
|
/* Check integrity of packages */
|
||||||
EVENT(trans, PM_TRANS_EVT_INTEGRITY_START, NULL, NULL);
|
EVENT(trans, PM_TRANS_EVT_INTEGRITY_START, NULL, NULL);
|
||||||
|
|
||||||
|
errors = 0;
|
||||||
for(i = trans->packages; i; i = i->next) {
|
for(i = trans->packages; i; i = i->next) {
|
||||||
pmsyncpkg_t *sync = i->data;
|
pmsyncpkg_t *sync = i->data;
|
||||||
pmpkg_t *spkg = sync->pkg;
|
pmpkg_t *spkg = sync->pkg;
|
||||||
int ret = 0;
|
const char *filename = alpm_pkg_get_filename(spkg);
|
||||||
|
const char *md5sum = alpm_pkg_get_md5sum(spkg);
|
||||||
|
|
||||||
ret = test_pkg_md5sum(trans, spkg, data);
|
if(test_md5sum(trans, filename, md5sum) != 0) {
|
||||||
|
errors++;
|
||||||
if(ret == 1) {
|
*data = alpm_list_add(*data, strdup(filename));
|
||||||
retval = 1;
|
|
||||||
} else if(ret == -1) { /* -1 is for serious errors */
|
|
||||||
RET_ERR(pm_errno, -1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(retval) {
|
if(errors) {
|
||||||
pm_errno = PM_ERR_PKG_CORRUPTED;
|
pm_errno = PM_ERR_PKG_INVALID;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
EVENT(trans, PM_TRANS_EVT_INTEGRITY_DONE, NULL, NULL);
|
EVENT(trans, PM_TRANS_EVT_INTEGRITY_DONE, NULL, NULL);
|
||||||
|
|
|
@ -640,13 +640,7 @@ char SYMEXPORT *alpm_get_md5sum(const char *filename)
|
||||||
ret = md5_file(filename, output);
|
ret = md5_file(filename, output);
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
if (ret == 1) {
|
RET_ERR(PM_ERR_NOT_A_FILE, NULL);
|
||||||
_alpm_log(PM_LOG_ERROR, _("md5: %s can't be opened\n"), filename);
|
|
||||||
} else if (ret == 2) {
|
|
||||||
_alpm_log(PM_LOG_ERROR, _("md5: %s can't be read\n"), filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert the result to something readable */
|
/* Convert the result to something readable */
|
||||||
|
@ -660,4 +654,23 @@ char SYMEXPORT *alpm_get_md5sum(const char *filename)
|
||||||
return(md5sum);
|
return(md5sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _alpm_test_md5sum(const char *filepath, const char *md5sum)
|
||||||
|
{
|
||||||
|
char *md5sum2;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
md5sum2 = alpm_get_md5sum(filepath);
|
||||||
|
|
||||||
|
if(md5sum == NULL || md5sum2 == NULL) {
|
||||||
|
ret = -1;
|
||||||
|
} else if(strcmp(md5sum, md5sum2) != 0) {
|
||||||
|
ret = 1;
|
||||||
|
} else {
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
FREE(md5sum2);
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* vim: set ts=2 sw=2 noet: */
|
/* vim: set ts=2 sw=2 noet: */
|
||||||
|
|
|
@ -65,6 +65,7 @@ int _alpm_str_cmp(const void *s1, const void *s2);
|
||||||
char *_alpm_filecache_find(const char *filename);
|
char *_alpm_filecache_find(const char *filename);
|
||||||
const char *_alpm_filecache_setup(void);
|
const char *_alpm_filecache_setup(void);
|
||||||
int _alpm_lstat(const char *path, struct stat *buf);
|
int _alpm_lstat(const char *path, struct stat *buf);
|
||||||
|
int _alpm_test_md5sum(const char *filepath, const char *md5sum);
|
||||||
|
|
||||||
#ifndef HAVE_STRVERSCMP
|
#ifndef HAVE_STRVERSCMP
|
||||||
int strverscmp(const char *, const char *);
|
int strverscmp(const char *, const char *);
|
||||||
|
|
|
@ -726,9 +726,11 @@ static int sync_trans(alpm_list_t *targets)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PM_ERR_PKG_CORRUPTED:
|
case PM_ERR_PKG_INVALID:
|
||||||
|
case PM_ERR_DLT_INVALID:
|
||||||
for(i = data; i; i = alpm_list_next(i)) {
|
for(i = data; i; i = alpm_list_next(i)) {
|
||||||
printf("%s", (char*)alpm_list_getdata(i));
|
char *filename = alpm_list_getdata(i);
|
||||||
|
printf(_("%s is invalid or corrupted\n"), filename);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue