diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libalpm/delta.c | 43 | 
1 files changed, 20 insertions, 23 deletions
| diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c index 6315a851..53c83657 100644 --- a/lib/libalpm/delta.c +++ b/lib/libalpm/delta.c @@ -282,14 +282,17 @@ alpm_list_t SYMEXPORT *alpm_pkg_unused_deltas(alpm_pkg_t *pkg)  alpm_delta_t *_alpm_delta_parse(char *line)  {  	alpm_delta_t *delta; -	char *tmp = line, *tmp2; +	char *tmp; +	const int num_matches = 6; +	size_t len;  	regex_t reg; +	regmatch_t pmatch[num_matches];  	regcomp(®, -			"^[^[:space:]]* [[:xdigit:]]{32} [[:digit:]]*" -			" [^[:space:]]* [^[:space:]]*$", -			REG_EXTENDED | REG_NOSUB | REG_NEWLINE); -	if(regexec(®, line, 0, 0, 0) != 0) { +			"^([^[:space:]]*) ([[:xdigit:]]{32}) ([[:digit:]]*)" +			" ([^[:space:]]*) ([^[:space:]]*)$", +			REG_EXTENDED | REG_NEWLINE); +	if(regexec(®, line, num_matches, pmatch, 0) != 0) {  		/* delta line is invalid, return NULL */  		regfree(®);  		return NULL; @@ -298,28 +301,22 @@ alpm_delta_t *_alpm_delta_parse(char *line)  	CALLOC(delta, 1, sizeof(alpm_delta_t), return NULL); -	tmp2 = tmp; -	tmp = strchr(tmp, ' '); -	*(tmp++) = '\0'; -	STRDUP(delta->delta, tmp2, return NULL); +	/* start at index 1 -- match 0 is the entire match */ +	len = pmatch[1].rm_eo - pmatch[1].rm_so; +	STRNDUP(tmp, &line[pmatch[1].rm_so], len, return NULL); -	tmp2 = tmp; -	tmp = strchr(tmp, ' '); -	*(tmp++) = '\0'; -	STRDUP(delta->delta_md5, tmp2, return NULL); +	len = pmatch[2].rm_eo - pmatch[2].rm_so; +	STRNDUP(delta->delta_md5, &line[pmatch[2].rm_so], len, return NULL); -	tmp2 = tmp; -	tmp = strchr(tmp, ' '); -	*(tmp++) = '\0'; -	delta->delta_size = _alpm_strtoofft(tmp2); +	len = pmatch[3].rm_eo - pmatch[3].rm_so; +	STRNDUP(tmp, &line[pmatch[3].rm_so], len, return NULL); +	delta->delta_size = _alpm_strtoofft(tmp); -	tmp2 = tmp; -	tmp = strchr(tmp, ' '); -	*(tmp++) = '\0'; -	STRDUP(delta->from, tmp2, return NULL); +	len = pmatch[4].rm_eo - pmatch[4].rm_so; +	STRNDUP(delta->from, &line[pmatch[4].rm_so], len, return NULL); -	tmp2 = tmp; -	STRDUP(delta->to, tmp2, return NULL); +	len = pmatch[5].rm_eo - pmatch[5].rm_so; +	STRNDUP(delta->to, &line[pmatch[5].rm_so], len, return NULL);  	return delta;  } | 
