[pacman-dev] [PATCH] Size handling was changed in fgets() functions

Laszlo Papp djszapi2 at gmail.com
Sat Oct 17 17:54:07 EDT 2009


Pacman's fgets function in the API used hardcoded numbers to identify the size.
This is not good practice, so replace them with sizeof handling.

Signed-off-by: Laszlo Papp <djszapi at archlinux.us>
---
 lib/libalpm/be_files.c |   49 ++++++++++++++++++++++++-----------------------
 lib/libalpm/trans.c    |    3 +-
 src/pacman/util.c      |    3 +-
 3 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c
index 53bbda1..ffbaa8d 100644
--- a/lib/libalpm/be_files.c
+++ b/lib/libalpm/be_files.c
@@ -387,6 +387,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 	FILE *fp = NULL;
 	char path[PATH_MAX];
 	char line[513];
+	int	sline = sizeof(line)-1;
 	char *pkgpath = NULL;

 	ALPM_LOG_FUNC;
@@ -418,7 +419,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 			info->name, inforeq);

 	/* clear out 'line', to be certain - and to make valgrind happy */
-	memset(line, 0, 513);
+	memset(line, 0, sline+1);

 	pkgpath = get_pkgpath(db, info);

@@ -442,7 +443,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 			}
 			_alpm_strtrim(line);
 			if(strcmp(line, "%NAME%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				if(strcmp(_alpm_strtrim(line), info->name) != 0) {
@@ -450,7 +451,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 								"mismatch on package %s\n"), db->treename, info->name);
 				}
 			} else if(strcmp(line, "%VERSION%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				if(strcmp(_alpm_strtrim(line), info->version) != 0) {
@@ -458,39 +459,39 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 								"mismatch on package %s\n"), db->treename, info->name);
 				}
 			} else if(strcmp(line, "%FILENAME%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				STRDUP(info->filename, _alpm_strtrim(line), goto error);
 			} else if(strcmp(line, "%DESC%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				STRDUP(info->desc, _alpm_strtrim(line), goto error);
 			} else if(strcmp(line, "%GROUPS%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->groups = alpm_list_add(info->groups, linedup);
 				}
 			} else if(strcmp(line, "%URL%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				STRDUP(info->url, _alpm_strtrim(line), goto error);
 			} else if(strcmp(line, "%LICENSE%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->licenses = alpm_list_add(info->licenses, linedup);
 				}
 			} else if(strcmp(line, "%ARCH%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				STRDUP(info->arch, _alpm_strtrim(line), goto error);
 			} else if(strcmp(line, "%BUILDDATE%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				_alpm_strtrim(line);
@@ -506,7 +507,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 					info->builddate = atol(line);
 				}
 			} else if(strcmp(line, "%INSTALLDATE%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				_alpm_strtrim(line);
@@ -522,12 +523,12 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 					info->installdate = atol(line);
 				}
 			} else if(strcmp(line, "%PACKAGER%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				STRDUP(info->packager, _alpm_strtrim(line), goto error);
 			} else if(strcmp(line, "%REASON%") == 0) {
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				info->reason = (pmpkgreason_t)atol(_alpm_strtrim(line));
@@ -537,7 +538,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 				 *       is currently only used in sync databases, and SIZE is
 				 *       only used in local databases.
 				 */
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				info->size = atol(_alpm_strtrim(line));
@@ -548,19 +549,19 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 			} else if(strcmp(line, "%ISIZE%") == 0) {
 				/* ISIZE (installed size) tag only appears in sync repositories,
 				 * not the local one. */
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				info->isize = atol(_alpm_strtrim(line));
 			} else if(strcmp(line, "%MD5SUM%") == 0) {
 				/* MD5SUM tag only appears in sync repositories,
 				 * not the local one. */
-				if(fgets(line, 512, fp) == NULL) {
+				if(fgets(line, sline, fp) == NULL) {
 					goto error;
 				}
 				STRDUP(info->md5sum, _alpm_strtrim(line), goto error);
 			} else if(strcmp(line, "%REPLACES%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->replaces = alpm_list_add(info->replaces, linedup);
@@ -583,13 +584,13 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 		while(fgets(line, 256, fp)) {
 			_alpm_strtrim(line);
 			if(strcmp(line, "%FILES%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->files = alpm_list_add(info->files, linedup);
 				}
 			} else if(strcmp(line, "%BACKUP%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->backup = alpm_list_add(info->backup, linedup);
@@ -611,24 +612,24 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 			fgets(line, 255, fp);
 			_alpm_strtrim(line);
 			if(strcmp(line, "%DEPENDS%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					pmdepend_t *dep = _alpm_splitdep(_alpm_strtrim(line));
 					info->depends = alpm_list_add(info->depends, dep);
 				}
 			} else if(strcmp(line, "%OPTDEPENDS%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->optdepends = alpm_list_add(info->optdepends, linedup);
 				}
 			} else if(strcmp(line, "%CONFLICTS%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->conflicts = alpm_list_add(info->conflicts, linedup);
 				}
 			} else if(strcmp(line, "%PROVIDES%") == 0) {
-				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+				while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 					char *linedup;
 					STRDUP(linedup, _alpm_strtrim(line), goto error);
 					info->provides = alpm_list_add(info->provides, linedup);
@@ -647,7 +648,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)
 				fgets(line, 255, fp);
 				_alpm_strtrim(line);
 				if(strcmp(line, "%DELTAS%") == 0) {
-					while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {
+					while(fgets(line, sline, fp) && strlen(_alpm_strtrim(line))) {
 						pmdelta_t *delta = _alpm_delta_parse(line);
 						if(delta) {
 							info->deltas = alpm_list_add(info->deltas, delta);
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index 65bd464..aea71db 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -320,7 +320,8 @@ static int grep(const char *fn, const char *needle)
 	}
 	while(!feof(fp)) {
 		char line[1025];
-		fgets(line, 1024, fp);
+		int sline = sizeof(line)-1;
+		fgets(line, sline, fp);
 		if(feof(fp)) {
 			continue;
 		}
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 0e5e7f5..1143bef 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -580,6 +580,7 @@ void display_optdepends(pmpkg_t *pkg)
 static int question(short preset, char *fmt, va_list args)
 {
 	char response[33];
+	int sresponse = sizeof(response)-1;
 	FILE *stream;

 	if(config->noconfirm) {
@@ -602,7 +603,7 @@ static int question(short preset, char *fmt, va_list args)
 		return(preset);
 	}

-	if(fgets(response, 32, stdin)) {
+	if(fgets(response, sresponse, stdin)) {
 		strtrim(response);
 		if(strlen(response) == 0) {
 			return(preset);
--
1.6.4.4



More information about the pacman-dev mailing list