diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libalpm/add.c | 16 | ||||
| -rw-r--r-- | lib/libalpm/alpm.h | 1 | ||||
| -rw-r--r-- | lib/libalpm/be_files.c | 24 | ||||
| -rw-r--r-- | lib/libalpm/be_package.c | 34 | ||||
| -rw-r--r-- | lib/libalpm/conflict.c | 4 | ||||
| -rw-r--r-- | lib/libalpm/deps.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/dload.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/package.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/trans.c | 7 | ||||
| -rw-r--r-- | lib/libalpm/util.c | 20 | 
10 files changed, 67 insertions, 45 deletions
| diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index f39a0ecf..cc0c4c13 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -556,6 +556,7 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		struct archive *archive;  		struct archive_entry *entry;  		char cwd[PATH_MAX] = ""; +		int restore_cwd = 0;  		_alpm_log(PM_LOG_DEBUG, "extracting files\n"); @@ -579,11 +580,16 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		/* save the cwd so we can restore it later */  		if(getcwd(cwd, PATH_MAX) == NULL) {  			_alpm_log(PM_LOG_ERROR, _("could not get current working directory\n")); -			cwd[0] = 0; +		} else { +			restore_cwd = 1;  		}  		/* libarchive requires this for extracting hard links */ -		chdir(handle->root); +		if(chdir(handle->root) != 0) { +			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), handle->root, strerror(errno)); +			ret = -1; +			goto cleanup; +		}  		/* call PROGRESS once with 0 percent, as we sort-of skip that here */  		if(is_upgrade) { @@ -629,9 +635,9 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		}  		archive_read_finish(archive); -		/* restore the old cwd is we have it */ -		if(strlen(cwd)) { -			chdir(cwd); +		/* restore the old cwd if we have it */ +		if(restore_cwd && chdir(cwd) != 0) { +			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));  		}  		if(errors) { diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 33291325..0c01f214 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -522,6 +522,7 @@ enum _pmerrno_t {  	PM_ERR_FILE_CONFLICTS,  	/* Misc */  	PM_ERR_RETRIEVE, +	PM_ERR_WRITE,  	PM_ERR_INVALID_REGEX,  	/* External library errors */  	PM_ERR_LIBARCHIVE, diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index 877bc505..adf41aa4 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -208,7 +208,7 @@ static int remove_olddir(const char *syncdbpath, alpm_list_t *dirlist)   */  int SYMEXPORT alpm_db_update(int force, pmdb_t *db)  { -	char *dbfile, *dbfilepath; +	char *dbfile, *dbfilepath, *syncpath;  	const char *dbpath, *syncdbpath;  	alpm_list_t *newdirlist = NULL, *olddirlist = NULL;  	alpm_list_t *onlynew = NULL, *onlyold = NULL; @@ -231,14 +231,18 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)  		RET_ERR(PM_ERR_DB_NOT_FOUND, -1);  	} -	len = strlen(db->treename) + strlen(DBEXT) + 1; +	len = strlen(db->treename) + 4;  	MALLOC(dbfile, len, RET_ERR(PM_ERR_MEMORY, -1)); -	sprintf(dbfile, "%s" DBEXT, db->treename); +	sprintf(dbfile, "%s.db", db->treename);  	dbpath = alpm_option_get_dbpath(); +	len = strlen(dbpath) + 6; +	MALLOC(syncpath, len, RET_ERR(PM_ERR_MEMORY, -1)); +	sprintf(syncpath, "%s%s", dbpath, "sync/"); -	ret = _alpm_download_single_file(dbfile, db->servers, dbpath, force); +	ret = _alpm_download_single_file(dbfile, db->servers, syncpath, force);  	free(dbfile); +	free(syncpath);  	if(ret == 1) {  		/* files match, do nothing */ @@ -253,9 +257,9 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)  	syncdbpath = _alpm_db_path(db);  	/* form the path to the db location */ -	len = strlen(dbpath) + strlen(db->treename) + strlen(DBEXT) + 1; +	len = strlen(dbpath) + strlen(db->treename) + 9;  	MALLOC(dbfilepath, len, RET_ERR(PM_ERR_MEMORY, -1)); -	sprintf(dbfilepath, "%s%s" DBEXT, dbpath, db->treename); +	sprintf(dbfilepath, "%ssync/%s.db", dbpath, db->treename);  	if(force) {  		/* if forcing update, remove the old dir and extract the db */ @@ -657,7 +661,9 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  			goto error;  		}  		while(!feof(fp)) { -			fgets(line, 255, fp); +			if(fgets(line, 256, fp) == NULL) { +				break; +			}  			_alpm_strtrim(line);  			if(strcmp(line, "%DEPENDS%") == 0) {  				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) { @@ -693,7 +699,9 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  		snprintf(path, PATH_MAX, "%sdeltas", pkgpath);  		if((fp = fopen(path, "r"))) {  			while(!feof(fp)) { -				fgets(line, 255, fp); +				if(fgets(line, 256, fp) == NULL) { +					break; +				}  				_alpm_strtrim(line);  				if(strcmp(line, "%DELTAS%") == 0) {  					while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) { diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c index 38cf357a..7b77ae6b 100644 --- a/lib/libalpm/be_package.c +++ b/lib/libalpm/be_package.c @@ -69,19 +69,19 @@ static int parse_descfile(struct archive *a, pmpkg_t *newpkg)  		} else {  			key = _alpm_strtrim(key);  			ptr = _alpm_strtrim(ptr); -			if(!strcmp(key, "pkgname")) { +			if(strcmp(key, "pkgname") == 0) {  				STRDUP(newpkg->name, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "pkgver")) { +			} else if(strcmp(key, "pkgver") == 0) {  				STRDUP(newpkg->version, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "pkgdesc")) { +			} else if(strcmp(key, "pkgdesc") == 0) {  				STRDUP(newpkg->desc, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "group")) { +			} else if(strcmp(key, "group") == 0) {  				newpkg->groups = alpm_list_add(newpkg->groups, strdup(ptr)); -			} else if(!strcmp(key, "url")) { +			} else if(strcmp(key, "url") == 0) {  				STRDUP(newpkg->url, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "license")) { +			} else if(strcmp(key, "license") == 0) {  				newpkg->licenses = alpm_list_add(newpkg->licenses, strdup(ptr)); -			} else if(!strcmp(key, "builddate")) { +			} else if(strcmp(key, "builddate") == 0) {  				char first = tolower((unsigned char)ptr[0]);  				if(first > 'a' && first < 'z') {  					struct tm tmp_tm = {0}; /* initialize to null in case of failure */ @@ -92,27 +92,27 @@ static int parse_descfile(struct archive *a, pmpkg_t *newpkg)  				} else {  					newpkg->builddate = atol(ptr);  				} -			} else if(!strcmp(key, "packager")) { +			} else if(strcmp(key, "packager") == 0) {  				STRDUP(newpkg->packager, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "arch")) { +			} else if(strcmp(key, "arch") == 0) {  				STRDUP(newpkg->arch, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "size")) { +			} else if(strcmp(key, "size") == 0) {  				/* size in the raw package is uncompressed (installed) size */  				newpkg->isize = atol(ptr); -			} else if(!strcmp(key, "depend")) { +			} else if(strcmp(key, "depend") == 0) {  				pmdepend_t *dep = _alpm_splitdep(ptr);  				newpkg->depends = alpm_list_add(newpkg->depends, dep); -			} else if(!strcmp(key, "optdepend")) { +			} else if(strcmp(key, "optdepend") == 0) {  				newpkg->optdepends = alpm_list_add(newpkg->optdepends, strdup(ptr)); -			} else if(!strcmp(key, "conflict")) { +			} else if(strcmp(key, "conflict") == 0) {  				newpkg->conflicts = alpm_list_add(newpkg->conflicts, strdup(ptr)); -			} else if(!strcmp(key, "replaces")) { +			} else if(strcmp(key, "replaces") == 0) {  				newpkg->replaces = alpm_list_add(newpkg->replaces, strdup(ptr)); -			} else if(!strcmp(key, "provides")) { +			} else if(strcmp(key, "provides") == 0) {  				newpkg->provides = alpm_list_add(newpkg->provides, strdup(ptr)); -			} else if(!strcmp(key, "backup")) { +			} else if(strcmp(key, "backup") == 0) {  				newpkg->backup = alpm_list_add(newpkg->backup, strdup(ptr)); -			} else if(!strcmp(key, "makepkgopt")) { +			} else if(strcmp(key, "makepkgopt") == 0) {  				/* not used atm */  			} else {  				_alpm_log(PM_LOG_DEBUG, "%s: syntax error in description file line %d\n", diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c index e36844a8..236ec1df 100644 --- a/lib/libalpm/conflict.c +++ b/lib/libalpm/conflict.c @@ -88,8 +88,8 @@ int _alpm_conflict_isin(pmconflict_t *needle, alpm_list_t *haystack)  		char *cpkg2 = conflict->package2;  		char *npkg1 = needle->package1;  		char *npkg2 = needle->package2; -		if((!strcmp(cpkg1, npkg1)  && !strcmp(cpkg2, npkg2)) -				|| (!strcmp(cpkg1, npkg2) && !strcmp(cpkg2, npkg1))) { +		if((strcmp(cpkg1, npkg1) == 0  && strcmp(cpkg2, npkg2) == 0) +				|| (strcmp(cpkg1, npkg2) == 0 && strcmp(cpkg2, npkg1) == 0)) {  			return(1);  		}  	} diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 26f9b16d..fd893a63 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -546,7 +546,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs,  	for(i = dbs; i; i = i->next) {  		for(j = _alpm_db_get_pkgcache(i->data); j; j = j->next) {  			pmpkg_t *pkg = j->data; -			if(alpm_depcmp(pkg, dep) && strcmp(pkg->name, dep->name) && +			if(alpm_depcmp(pkg, dep) && strcmp(pkg->name, dep->name) != 0 &&  			             !_alpm_pkg_find(excluding, pkg->name)) {  				if(_alpm_pkg_should_ignore(pkg)) {  					int install = 0; diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index c11148d1..3185d2aa 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -251,7 +251,7 @@ static int download_internal(const char *url, const char *localpath,  		check_stop();  		size_t nwritten = 0;  		nwritten = fwrite(buffer, 1, nread, localf); -		if((nwritten != nread) || ferror(localf)) { +		if((nwritten != (size_t)nread) || ferror(localf)) {  			pm_errno = PM_ERR_RETRIEVE;  			_alpm_log(PM_LOG_ERROR, _("error writing to file '%s': %s\n"),  					tempfile, strerror(errno)); diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index becbc60f..0060300c 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -749,7 +749,7 @@ int _alpm_pkg_cmp(const void *p1, const void *p2)  {  	pmpkg_t *pkg1 = (pmpkg_t *)p1;  	pmpkg_t *pkg2 = (pmpkg_t *)p2; -	return(strcmp(pkg1->name, pkg2->name)); +	return(strcoll(pkg1->name, pkg2->name));  }  /* Test for existence of a package in a alpm_list_t* diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 49fc0f67..523f33b8 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -107,7 +107,7 @@ static alpm_list_t *check_arch(alpm_list_t *pkgs)  	for(i = pkgs; i; i = i->next) {  		pmpkg_t *pkg = i->data;  		const char *pkgarch = alpm_pkg_get_arch(pkg); -		if(strcmp(pkgarch,arch) && strcmp(pkgarch,"any")) { +		if(strcmp(pkgarch,arch) != 0 && strcmp(pkgarch,"any") != 0) {  			char *string;  			const char *pkgname = alpm_pkg_get_name(pkg);  			const char *pkgver = alpm_pkg_get_version(pkg); @@ -324,8 +324,7 @@ static int grep(const char *fn, const char *needle)  	while(!feof(fp)) {  		char line[1024];  		int sline = sizeof(line)-1; -		fgets(line, sline, fp); -		if(feof(fp)) { +		if(fgets(line, sline, fp) == NULL) {  			continue;  		}  		if(strstr(line, needle)) { @@ -371,7 +370,7 @@ int _alpm_runscriptlet(const char *root, const char *installfn,  	/* either extract or copy the scriptlet */  	snprintf(scriptfn, PATH_MAX, "%s/.INSTALL", tmpdir); -	if(!strcmp(script, "pre_upgrade") || !strcmp(script, "pre_install")) { +	if(strcmp(script, "pre_upgrade") == 0 || strcmp(script, "pre_install") == 0) {  		if(_alpm_unpack_single(installfn, tmpdir, ".INSTALL")) {  			retval = 1;  		} diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 32eaa442..ffebe9e8 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -143,7 +143,15 @@ int _alpm_copyfile(const char *src, const char *dest)  	/* do the actual file copy */  	while((len = fread(buf, 1, CPBUFSIZE, in))) { -		fwrite(buf, 1, len, out); +		size_t nwritten = 0; +		nwritten = fwrite(buf, 1, len, out); +		if((nwritten != len) || ferror(out)) { +			pm_errno = PM_ERR_WRITE; +			_alpm_log(PM_LOG_ERROR, _("error writing to file '%s': %s\n"), +					dest, strerror(errno)); +			ret = -1; +			goto cleanup; +		}  	}  	/* chmod dest to permissions of src, as long as it is not a symlink */ @@ -364,8 +372,8 @@ int _alpm_unpack(const char *archive, const char *prefix, alpm_list_t *list, int  cleanup:  	umask(oldmask);  	archive_read_finish(_archive); -	if(restore_cwd) { -		chdir(cwd); +	if(restore_cwd && chdir(cwd) != 0) { +		_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));  	}  	return(ret);  } @@ -398,7 +406,7 @@ int _alpm_rmrf(const char *path)  			for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {  				if(dp->d_ino) {  					sprintf(name, "%s/%s", path, dp->d_name); -					if(strcmp(dp->d_name, "..") && strcmp(dp->d_name, ".")) { +					if(strcmp(dp->d_name, "..") != 0 && strcmp(dp->d_name, ".") != 0) {  						errflag += _alpm_rmrf(name);  					}  				} @@ -534,8 +542,8 @@ int _alpm_run_chroot(const char *root, const char *cmd)  	}  cleanup: -	if(restore_cwd) { -		chdir(cwd); +	if(restore_cwd && chdir(cwd) != 0) { +		_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));  	}  	return(retval); | 
